我在docker compose中有以下设置
nginx
代理frontend
,backend
并投放图片backend
app(春季启动)frontend
app(SSR节点)mysql
backend
使用
使用
可以相对快速地更新前端docker-compose up -d --no-deps frontend
不幸的是backend
开始大约需要1分钟。
是否有一种简单的方法可以在不必过多更改当前设置的情况下实现更低的停机时间?我喜欢现在这么简单。
我会想象:
backend
答案 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