如何使用Docker快速搭建服务器环境
作者:songcream1
简介
这篇文章也是方便自己记录搭建流程,服务器的购买啥的就不说了,最终目标就是在一个空白的Linux系统上,使用docker运行MySQL、Tomcat+Java、Nginx、Redis 的单机环境,以后方便自己快速的部署服务器。
安装Docker
首先需要安装Docker,建议按照官方的文档(https://docs.docker.com/engine/install/centos/)
将yum镜像源改为阿里云镜像源,不然会从国外下载
# 安装wget yum install -y wget # 备份原来的源配置文件 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.back # 拉取阿里云的配置文件(6可以替换成自己的CentOS版本) wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 重新加载yum yum clean all yum makecache
更新下我们系统的yum工具
yum update
更新完以后,按照docker官网,先安装yum-utils工具
yum install -y yum-utils
添加阿里云的docker镜像源(上面改的是基础镜像源,非这里的docker)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker机器
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动docker服务
systemctl start docker
一些常用的docker命令
############################### 镜像命令 ##################################### # 查看docker的所有镜像 docker images # 删除镜像 docker rmi 镜像id docker rmi 镜像名称:版本号 # 搜索镜像 docker search 镜像名称(例如:mysql,centos,nginx) # 从docker hub上拉取镜像 docker pull mysql:版本号 docker pull mysql(默认是最新版本号) ############################### 容器命令 ##################################### # 查看当前正在运行的容器 docker ps # 查看所有的容器 docker ps -a # docker镜像运行为容器 # -it是创建的交互式:创建完成之后直接进度终端 # -id是创建守护式:创建完成之后不进入容器 # -it创建的容器exit,后台不会继续运行 # -id创建的容器exit,后台继续运行 # -p把容器内的3306端口映射到容器外的3355端口 docker run -it -p 3355:3306 --name mytomcat tomcat:9.0 /bin/bash # 以/bin/bash命令进入容器 docker exec -it mytomcat /bin/bash # 启动容器() docker start -i [容器id] # 停止容器 docker stop [容器id] # 删除容器 docker rm mytomcat # 删除所有容器(-a 列出所有容器 -q 只取id,然后使用$符号将这些id传入) docker rm $(docker ps -aq) # 拷贝本地文件到docker容器中 docker cp test.txt 容器id:/app/test.txt ############################### 数据卷命令 ##################################### # -v 挂载容器内目录/root/data_container到容器外目录/root/data docker run -it --name=mycentos -v /root/data:/root/data_container centos:latest /bin/bash # 继承上面的mycentos容器的数据卷 docker run -it --name=centos2 --volumes-from mycentos centos:latest ############################### 打包镜像命令 ##################################### # 容器打包成为镜像 docker commit [容器id] [自定义镜像名称]:[自定义版本号] # dockerFile转成镜像 docker build -f [DockerFile路径] -t [容器名]:[TAG] .
安装前准备
在宿主机的/home 目录准备我们nginx、redis、mysql、tomcat的映射目录,方便我们直接在宿主机修改配置和查看日志。
cd /home mkdir nginx mkdir tomcat mkdir redis mkdir mysql
Docker部署Nginx
# 拉取nginx最新镜像 docker pull nginx:latest # 运行镜像 # -d 后台运行 (-i 以交互式方式运行,-t exit后自动结束容器) # --name 指定容器名字 # -p 映射 容器外端口:容器内端口 (这里将宿主机的8080端口映射容器内的80端口) # -v 映射 容器外路径:容器内路径 (这里挂载nginx的配置文件、日志文件到宿主机的/home/nginx下) docker run -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ -d nginx
运行以上命令后,使用docker ps命令发现 nginx 容器并没有启动起来,原因是因为我们挂载了ngxin.conf,挂载会首先使用容器外的目录,覆盖容器内的目录,这就导致我们的nginx配置文件被清空了,于是ngxin并没有正常启动。官方给的做法如下:
大概意思是说,先以不挂载的形式运行docker容器,然后再把容器内的ngxin.conf拷贝出来,接着以挂载这个拷贝的conf文件的形式启动新的docker容器。于是容器外目录覆盖容器内目录时,就会有nginx.conf配置文件了。
一般我们都会修改我们的nginx配置文件,因为每个服务器配置的端口啥的都不一样,安装的应用也不一样,所以,我们直接把自己的nginx.conf文件放到宿主机要挂载的目录下就行了,也就是 /home/nginx/nginx.conf
一个简单的nginx.conf样式(包含了h5应用、管理端应用、api调用、swagger、文件存储):
user root; worker_processes 1; events { # 连接数 worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server_tokens off; access_log on; # http的匹配规则 server { listen 80; # 域名 server_name www.xxx.com; error_log logs/error.log; access_log logs/access.log; charset utf-8; location /dev { # www.xxx.com/dev,会去服务器的这个路径/www/server/dev/h5/下找资源 root /www/server/dev/h5/; # 匹配规则,如 www.xxx.com/h5/image.jpg 会优先找/www/server/dev/h5/image.jpg,找不到再找/www/server/dev/h5/index.html try_files $uri $uri/ /index.html; # 访问域名时,默认访问index.html,如 www.xxx.com/dev 会去找 /www/server/dev/h5/index.html index index.html index.htm; } location /dev/admin { root /www/server/dev/admin/; try_files $uri $uri/ /index.html; index index.html index.htm; } location /dev/swagger/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8081/swagger-ui.html; } location /dev/api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8081/; } # 开放一个文件存储目录 location /files/ { root /www/server/; } } # https的匹配规则 #server #{ # listen 443 ssl; # # 域名 # server_name www.xxx.com; # # error_log logs/error.log; # access_log logs/access.log; # # charset utf-8; # # ssl_certificate ../cert/xxx.pem; # ssl_certificate_key ../cert/xxx.key; # # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_protocols TLSv1.2; # ssl_prefer_server_ciphers on; # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; # # location /dev { # root /www/server/dev/h5/; # try_files $uri $uri/ /index.html; # index index.html index.htm; # } # # location /dev/admin { # root /www/server/dev/admin/; # try_files $uri $uri/ /index.html; # index index.html index.htm; # } # # location /dev/swagger/ { # proxy_set_header Host $http_host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header REMOTE-HOST $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_pass http://localhost:8081/swagger-ui.html; # } # # location /dev/api/ { # proxy_set_header Host $http_host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header REMOTE-HOST $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_pass http://localhost:8081/; # } # # location /files/ { # root /www/server/; # } #} }
添加完nginx.conf后,我们还是以挂载卷命令运行nginx容器:
# 运行镜像 # -d 后台运行 (-i 以交互式方式运行,-t exit后自动结束容器) # --name 指定容器名字 # -p 映射 容器外端口:容器内端口 (这里将宿主机的8080端口映射容器内的80端口) # -v 映射 容器外路径:容器内路径 (这里挂载nginx的配置文件、日志文件到宿主机的/home/nginx下) docker run -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ -d nginx
docker ps 发现后台运行成功
Docker部署Tomcat
docker pull tomcat # 端口映射:容器外8080 --> 容器内8080 # 配置文件映射:容器外/home/tomcat/conf --> 容器内/usr/local/tomcat/conf # 日志文件映射:容器外/home/tomcat/logs --> 容器内/usr/local/tomcat/logs # 部署应用目录映射:容器外/home/tomcat/webapps/ --> 容器内/usr/local/tomcat/webapps/ docker run -p 8080:8080 -d -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat
Docker部署redis
docker pull redis:latest # -p 端口映射 容器外6379 --> 容器内6379 # -v redis配置文件映射 容器外 /home/redis/redis.conf --> 容器内 /usr/local/redis.conf # -v redis数据映射 容器外 /home/redis/data --> 容器内 /data # -d 后台运行 # --requirepass (密码123456) docker run -p 6379:6379 -v /home/redis/data:/data -d --requirepass 123456 redis
进入容器修改密码
docker ps -a docker exec -it 容器ID /bin/bash cd /usr/local/bin redis-cli # 验证密码 auth 123456 # 修改密码 config set requirepass ****
注意这种方式启动的redis是没有配置文件的,如果需要使用自定义的配置文件启动,可以把配置文件放到 /home/redis/redis.conf 下,使用 -v 挂载到容器内的 /usr/local/redis.conf 下,然后使用配置文件启动redis容器
docker run -p 6379:6379 -v /home/redis/redis.conf:/usr/local/redis.conf -v /home/redis/data:/data -d redis /usr/local/redis.conf
redis配置文件下载地址:
https://github.com/redis/redis/blob/7.2/redis.conf
bind 127.0.0.1 #注释掉这部分,使redis可以外部访问 daemonize no #用守护线程的方式启动 requirepass 你的密码 #给redis设置密码 appendonly yes #redis持久化 默认是no tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
Docker部署mysql
mysql版本选择可以到 https://hub.docker.com/_/mysql?tab=tags 这里看有那些标签
我们安装5.7版本
# 一句话就搞定了mysql的配置,没有用docker得要配置仓库源,编译等等的,还有各种网络问题,docker真强大 docker pull mysql:5.7 # -p 端口映射 容器外3306 --> 容器内3306 # -v mysql配置文件映射 容器外 /home/mysql/conf --> 容器内 /etc/mysql/conf.d # -v mysql数据映射 容器外 /home/mysql/data --> 容器内 /var/lib/mysql (没有映射到外面会导致数据丢失,容器删了就没了) # -d 后台运行 # -e MYSQL_ROOT_PASSWORD=123456 配置mysql密码 docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
同样道理,配置文件需要我们自己下载放到宿主机挂载目录下
总结
上面用到的部署命令如下,我们也可以用docker compose去编排这几个命令,这样就不用每次都一遍一遍运行了
# 部署mysql docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # 部署redis docker run -d -p 6379:6379 -v /home/redis/redis.conf:/usr/local/redis.conf -v /home/redis/data:/data redis /usr/local/redis.conf # 部署tomcat docker run -d -p 8080:8080 -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat # 部署nginx docker run -d -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ nginx
到此这篇关于使用Docker快速搭建服务器环境的文章就介绍到这了,更多相关Docker搭建服务器环境内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!