一个计算机技术爱好者与学习者

0%

好好学Docker:Docker Compose实现滚动更新

1. 前言

本文中,基于Docker Compose实现服务滚动更新。
具体来说,webapp想要从v1.0更新到v2.0,更新过程中服务不能中断,如果v2.0有问题那么就停止更新并回退。

参考文档:

2. 滚动更新思路

1、增加一个新版本容器
2、验证新版本容器
3、删除老版本容器,增加新版本容器

3. docker-compose配置

3.1. docker-compose.yml

docker-compose.yml 定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3"
services:
webapp:
image: "voidking/nginx:v1.0"
deploy:
replicas: 2
nginx:
image: nginx:latest
volumes:
- type: bind
source: /root/rollingupdate/nginx.conf
target: /etc/nginx/nginx.conf
depends_on:
- webapp
ports:
- "80:80"

3.2. 准备nginx配置

多个容器之间,通过nginx进行负载均衡,负载均衡基于 Docker’s embedded DNS

nginx.conf 定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
user  nginx;
events {
worker_connections 1000;
}
http {
server {
listen 80;
location / {
proxy_pass http://webapp:80;
}
}
}

4. 滚动更新操作

1、修改webapp版本
修改 docker-compose.yml ,webapp镜像改为 voidking/nginx:v2.0

2、使用新版本扩容出一个容器

1
docker-compose up -d --scale webapp=3 --no-recreate

3、验证新版本容器

4、删除老版本容器

1
docker ps | grep "voidking/nginx:v1.0" | awk '{print $1}' | xargs docker rm -f 

5、扩容新版本容器

1
docker-compose up -d --scale webapp=2 --no-recreate

当容器数量比较多时,4和5可以进行改成删一个旧容器,加一个新容器,删一个旧容器,加一个新容器。。。

5. 自动化脚本实现

未完待续。。。