在 docker-compose 中重新创建无停机时间的容器

在 docker-compose 中重新创建无停机时间的容器

我使用 docker-compose 在同一主机上部署多个容器。我的镜像是在 Google Cloud Build 中构建的,并存储在 gcr.io 上;我没有使用 docker-compose 来构建我的镜像

当我运行docker-compose pull后跟 时docker-compose up -d,会为我的图像创建新容器。但是,如果我docker ps在另一个选项卡中运行,我会发现我的容器在创建新容器时会离线几秒钟。

有没有办法告诉 docker-compose 重新创建然后重新启动容器而无需任何停机时间?

答案1

docker-compose up其本身并不支持任何零停机时间的部署方式。

https://docs.docker.com/compose/reference/up/

您需要实施自己的蓝/绿部署或查看 kubernetes 的滚动更新: https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro/

答案2

这是我们发现的一个非常简单的解决方案,可实现零停机时间,蓝绿风格部署,只需docker-composenginxhttps://engineering.tines.com/blog/simple-zero-downtime-deploys

事实证明,一个放置得当的 bash 脚本就是您所需要的!这种方法使我们无需向堆栈中添加其他依赖项。以下是核心部分:

reload_nginx() {  
  docker exec nginx /usr/sbin/nginx -s reload  
}

zero_downtime_deploy() {  
  service_name=tines-app  
  old_container_id=$(docker ps -f name=$service_name -q | tail -n1)

  # bring a new container online, running new code  
  # (nginx continues routing to the old container only)  
  docker-compose up -d --no-deps --scale $service_name=2 --no-recreate $service_name

  # wait for new container to be available  
  new_container_id=$(docker ps -f name=$service_name -q | head -n1)
  new_container_ip=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $new_container_id)
  curl --silent --include --retry-connrefused --retry 30 --retry-delay 1 --fail http://$new_container_ip:3000/ || exit 1

  # start routing requests to the new container (as well as the old)  
  reload_nginx

  # take the old container offline  
  docker stop $old_container_id
  docker rm $old_container_id

  docker-compose up -d --no-deps --scale $service_name=1 --no-recreate $service_name

  # stop routing requests to the old container  
  reload_nginx  
}

希望这可以帮助其他人。

相关内容