我正在按照 Docker 教程并使用我自己的版本进行操作
version: "3.1"
services:
web:
image: registry.gitlab.com/xxxx/xxxx:latest
deploy:
replicas: 2
ports:
- "8888:80"
mysql:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: user
MYSQL_PASS: password
ports:
- "8889:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
每当我更改某些代码时,我都会重建新的docker镜像并运行更新。
docker stack deploy --compose-file docker-compose.yml xxxx-learn
然后我注意到有一些停机时间。他们会一次启动一个新容器,一次停止一个旧容器。问题是下载新镜像需要几分钟,并且 Web 服务器运行也需要时间。
我想到的一个解决方案是在这两个 Web 服务器副本前运行 Nginx 负载平衡。但是还有更好的解决方案吗?
答案1
您应该将重启策略和 stop_grace_period 放在您的撰写文件中:
version: "3.1"
services:
web:
stop_grace_period: 10s
deploy:
replicas: 2
restart_policy:
condition: on-failure
答案2
然后我注意到有一些停机时间。他们会一次启动一个新容器,一次停止一个旧容器。问题是下载新镜像需要几分钟,并且 Web 服务器运行也需要时间。
您需要为镜像/容器定义健康检查。如果没有健康检查,docker 就不知道您的应用程序何时准备好处理请求,并将请求发送到“尚未准备好”的容器,并在替换第一个容器后不久关闭剩余的正在运行的容器。
healthcheck 定义了一个在容器内运行的命令,用于识别应用程序是否健康。请参阅本文档有关如何在图像中配置健康检查。