Docker

在 docker-compose 中重新創建不停機的容器

  • July 7, 2021

我正在使用 docker-compose 在同一主機上部署多個容器。我的圖像在 Google Cloud Build 中建構並儲存在 gcr.io;我沒有使用 docker-compose 來建構我的圖像

當我執行docker-compose pull後跟時docker-compose up -d,會為我的圖像創建新容器。但是,如果我docker ps在另一個選項卡中執行,我觀察到我的容器在創建新容器時會離線幾秒鐘。

有沒有辦法告訴 docker-compose 重新創建然後重新啟動容器而不會停機?

docker-compose up其本身不支持任何零停機時間的部署方式。

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

您需要實現自己的藍/綠部署或查看 kubernetes 的滾動更新: https ://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro/

這是我們發現的一個非常簡單的解決方案,可以實現零停機時間,藍綠色風格的部署只需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  
}

希望這可以幫助其他人。

引用自:https://serverfault.com/questions/1002451