1、docker-rollout 安装
# Create directory for Docker cli plugins
$ mkdir -p ~/.docker/cli-plugins
# Download docker-rollout script to Docker cli plugins directory
$ curl https://raw.githubusercontent.com/wowu/docker-rollout/master/docker-rollout -o ~/.docker/cli-plugins/docker-rollout
# Make the script executable
$ chmod +x ~/.docker/cli-plugins/docker-rollout
$ ln -s ~/.docker/cli-plugins/docker-rollout /usr/bin/docker-rollout
2、nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# 刷新 DNS
resolver 127.0.0.11 ipv6=off valid=10s; # 127.0.0.1 comes from /etc/resolv.conf on the nginx container
server {
listen 80;
location / {
# 假设api端口是3000, api_server是 docker-compose.yml 文件内 service 的名字
set $backend_servers api_server:3000;
proxy_pass http://$backend_servers;
}
}
include /etc/nginx/conf.d/*.conf;
}
daemon off;
3、docker-compose.yml
这里的 docker-compose 的版本要在2.0以上, 笔者使用 v2.17.1
version: "3.7"
services:
api_server:
image: api_server:0.0.1
restart: always
# 不指定暴露的端口
ports:
- 3000
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
environment:
- TZ=Asia/Shanghai
- HTTP_HOST=192.168.29.32
- HTTP_PORT=3000
nginx-proxy:
image: nginxproxy/nginx-proxy
# image: nginx:latest
ports:
- "8000:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx.conf:/etc/nginx/nginx.conf:ro
3、启动容器
$ docker-compose up -d && docker-compose logs -f
4、浏览器访问http://localhost:8000
5、启动容器使用 docker-rollout 滚动更新 api server, 实现不停服更新
$ docker-rollout api_server
==> Scaling 'api_server' to 2 instances
[+] Running 2/2
✔ Container api_server-1 Running 0.0s
✔ Container api_server-2 Started 1.3s
==> Waiting for new container to be ready (10 seconds)
==> Stopping old container
2e09feb1d8df2fb66f4e2cfef186df70cbbf9eb0e1dd5dc599d88ef98cd303ed
2e09feb1d8df2fb66f4e2cfef186df70cbbf9eb0e1dd5dc599d88ef98cd303ed
How to achieve a rolling update with docker-compose? - Stack Overflow