本篇文章将带你从Docker的角度安装部署Mysql、Redis、RabbitMq、Nginx并且配置SSL证书入手。
首先Docker一些部署常用的基本命令告诉大家
基本部署用到这几个命令就足够了
ps:可别问容器id是啥(那我可要揍人了)
接下来就是正式的部署了
第一步:
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#配置阿里云镜像源
yum install -y docker-ce
systemctl start docker
#安装运行docker
docker pull mysql
docker run --name mysql --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 -d mysql
#拉取Mysql镜像,然后启动Mysql容器,启动后可以通过docker ps查看下是否启动
docker pull redis
docker run --name redis --restart=always -p 6379:6379 -d redis --requirepass "密码"
#拉取redis镜像,然后启动redis
docker pull rabbitmq:management
docker run --name rabbit --restart=always -p 15672:15672 -p 5672:5672 -d rabbitmq:management
#拉取rabbitmq镜像,并且启动
第二步:
服务器的安全组开放上面运行的端口,网上很多什么关闭防火墙之类的没那么麻烦,服务器端口放开,运行你的服务器ip加上rebbitmq的端口15672;如果出现以下界面就代表你的安装已经ok啦。
如果你没有需要用到rabbit,例如mysql,你本地用数据库连接工具连接一下测试也可以。
第三步:
我这里将nginx单独拆解出来。
docker pull nginx
#拉取nginx镜像
mkdir /banyan/nginx/html -p
mkdir /banyan/nginx/log -p
mkdir /banyan/nginx/cert -p
#在宿主机(指你的服务器,后文提到的宿主机一概这个意思)新建文件夹
docker run -p 80:80 --name banyan-nginx
-v /banyan/nginx/html:/usr/share/nginx/html
-v /banyan/nginx/logs:/var/log/nginx
-d nginx
#先运行一次nginx,为了将你容器内的文件拷贝宿主机中
docker container cp banyan-nginx:/etc/nginx /banyan/nginx/
#然后将容器内的文件拷贝到宿主机
mv nginx conf
#进入到宿主机的/banyan/nginx目录,将nginx文件夹改成conf
docker stop banyan-nginx
#停止容器
docker rm banyan-nginx
# 删除容器
docker run -p 80:80 -p 443:443 --name banyan-nginx
-v /banyan/nginx/html:/usr/share/nginx/html
-v /banyan/nginx/logs:/var/log/nginx
-v /banyan/nginx/conf:/etc/nginx
-v /banyan/nginx/cert:/etc/nginx/cert
-v /usr/local/vue:/usr/local/vue
-v /usr/local/upload:/usr/local/upload
-d nginx
#重新挂载运行容器(这里的挂载目录可以根据你自己需要多少挂载,因为我是前后端分离部署,所以我还挂载了vue目录和upload文件上传目录)
第四步:
我这里用的阿里云免费的SSL证书,其他腾讯云的类似操作,登录阿里云,找到搜索SSL证书到这个页面,然后点击申请证书,绑定你自己申请好的域名。
然后下载证书
这里我们使用nginx配置证书,所以我们选择nginx下载
下载完解压之后皆可以上传证书到宿主机的/banyan/nginx/conf/cert目录下
第五步:
最关键的一步来了,编辑nginx配置文件
在宿主机的/banyan/nginx/conf/conf.d目录下新建立api.conf和admin.conf文件(我这里前后端分离,所以建立了两个,你们可以根据自身情况调整),这里解释下为什么新建conf文件,因为宿主机的/banyan/nginx/conf下的nginx.conf文件里面有include了配置文件贴个图大家就懂了
api.conf文件参考配置如下
server {
listen 80;
listen 443 ssl;
server_name xxxx.top; #你的域名
ssl_certificate /etc/nginx/cert/xxxx.xxxx.top.pem; #你的证书的pem文件地址
ssl_certificate_key /etc/nginx/cert/xxxx.xxxx.top.key; #你的证书的key文件地址
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /usr/local/vue/blog; #你的前端页面存放地址
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location ^~ /api/ {
proxy_pass http://xxxxx:8080/; #你的后端接口地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
ps:如果你有多个域名需要转发配置,复制多个修改即可。这里可能有同学有的只需要转发端口不用映射页面地址,我在给出参考示例
server {
listen 80;
listen 443 ssl;
server_name xxx.xxx.xxx.top; #域名
ssl_certificate /etc/nginx/cert/xxx.xxx.xxx.top.pem; #证书地址
ssl_certificate_key /etc/nginx/cert/xxx.xxx.xxx.top.key; #证书地址
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://xxx.xxx.xxx.xxx:3000/websocket; #需要转发的端口地址
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
结尾:
以上配置完后记得重启nginx容器哦
这里留个小彩蛋:如果重启发现nginx启动不了,可以根据这个命令查看日志
docker inspect --format '{{.LogPath}}' 容器id
希望大家用不到彩蛋的命令哈哈(手动狗头)