一、部署前后分离
使用你自己的自定义镜像
部署多个副本
所有副本使用相同的配置和逻辑
Nginx 做反向代理统一入口
外部访问形式如:
http://your-domain/api/xxx
1.1 建立私库
镜像已构建并推送到可访问的镜像仓库
启动 Docker Registry 容器
docker run -d -p 5000:5000 --restart=always --name registry registry:2
这会在本地启动一个私有的 Docker Registry,并监听 5000 端口。
配置 HTTPS 或者信任不安全的 Registry,可以通过以下方式让 Docker 客户端信任这个不安全的 Registry:
每个机器都要编辑 /etc/docker/daemon.json
文件(如果没有则创建),添加如下内容:
{
"insecure-registries" : ["【ip】:5000"]
}
每个机器都要,然后重启 Docker 服务:
sudo systemctl restart docker
管理机上将 my-java 并推送镜像到 Docker Registry
docker tag my-java [ip]:5000/my-backend:1.0
管理机将镜像上传到 Docker Registry
docker push [ip]:5000/my-backend:1.0
1.2 下载镜像
在其他工作机上下载镜像
docker pull [镜像私库ip]:5000/my-backend:1.0
1.3 创建覆盖 network
这个要在主节点上创建
docker network create --driver overlay --attachable app_network
1.4 部署服务
主节点上部署
docker service create \
--name backend-api \
--network app_network \
--replicas 3 \
192.168.107.157:5000/my-backend:1.0
创建 Nginx 配置文件
mkdir /test
cd /test
vim default.conf
upstream backend_api {
server backend-api:8081;
}
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://backend_api;
proxy_set_header Host $host;
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;
proxy_redirect off;
}
}
注意:
backend-api
是你上面创建的服务名称请求
/api/xxx
会被转发到任意一个backend-api
的副本上
1.5 启动 Nginx 服务
manager添加标签并进行节点更新
docker node update --label-add role=lb manager
注释:
标签role
值为lb
根据标签指定部署
docker service create \
--name my-nginx \
--network app_network \
--publish 80:80 \
--mount type=bind,source=/test/default.conf,target=/etc/nginx/conf.d/default.conf \
--replicas 1 \
--constraint 'node.labels.role == lb' \
nginx:latest
注释:
constraint 指定部署到标签值为lb的机器
replicas 运行一台机器
mount 运行指定文件
测试访问
curl http://localhost/api/getMsg
来访问你的后端服务。请求会由 Nginx 转发到任意一个 backend-api
副本上,实现负载均衡。
1.6 更新服务
如果你更新了镜像,可以这样滚动更新:
docker service update \
--image 【镜像名】:【镜像版本】 \
--update-parallelism 2 \
--update-delay 10s \
服务名
注释:
--update-parallelism 2 一次更新两个服务
--update-delay 10s 更新一次休息10秒
如果后台压力过大可以多增加几个后台服务
-- 将服务增加10个
docker service update \
--replicas 10 \
服务名