如何使用docker-compose实现滚动更新?

时间:2018-03-03 23:37:44

标签: docker docker-compose

我在docker compose中有以下设置

  • nginx代理frontendbackend并投放图片
  • 端口8080上的
  • backend app(春季启动)
  • 端口4000上的
  • frontend app(SSR节点)
  • {li> mysql backend使用

使用

可以相对快速地更新前端
docker-compose up -d --no-deps frontend

不幸的是backend开始大约需要1分钟。

是否有一种简单的方法可以在不必过多更改当前设置的情况下实现更低的停机时间?我喜欢现在这么简单。

我会想象:

  1. 开始backend
  2. 的新实例
  3. 等到它开始(可能是每个计时器还是最健康的
  4. 关闭以前运行的实例

2 个答案:

答案 0 :(得分:2)

Swarm是正确的解决方案,但是使用docker-compose仍然可以实现这一目标。

首先,确保您的代理可以进行服务发现。您不能使用container_name(因为不能在swarm中使用它),因为您将增加同一服务的容器数量。像traefik或nginx-proxy这样的代理使用标签来执行此操作。

然后,docker-compose up -d --scale backend=2 --no-recreate将使用新图像创建一个新容器,而无需触摸正在运行的容器。

启动并运行后,先docker kill old_container,然后再docker-compose up -d --scale backend=1 --no-recreate,以重置数字。


编辑1

docker kill old_container应该是docker rm -f old_container

编辑2

  

如何处理甚至不运行

我们要始终杀死最旧的容器

docker rm -f $(docker ps --format "table {{.ID}}  {{.Names}}  {{.CreatedAt}}" | grep backend | (read -r; printf "%s\n" "$REPLY"; sort -k 3 ) | awk -F  "  " '{print $1}' | head -1)

答案 1 :(得分:0)

这是我最终使用的脚本:

PREVIOUS_CONTAINER=$(docker ps --format "table {{.ID}}  {{.Names}}  {{.CreatedAt}}" | grep backend | awk -F  "  " '{print $1}')
docker-compose up -d --no-deps --scale backend=2 --no-recreate backend
sleep 100
docker kill -s SIGTERM $PREVIOUS_CONTAINER
sleep 1
docker rm -f $PREVIOUS_CONTAINER
docker-compose up -d --no-deps --scale backend=1 --no-recreate backend
docker-compose stop http-nginx
docker-compose up -d --no-deps --build http-nginx