我有一个
docker-compose.yaml
文件,其中包含构成应用程序的一堆服务:
services:
mongo:
redis:
rabbitmq:
typesense:
app-01:
app-02:
app-lb:
这里
app-lb
是haproxy
集装箱负载均衡app-01
和app-02
。
我的想法是我可以阻止其中任何一个,构建并提出。然后对另一台进行同样的操作,无需任何停机时间。
docker compose stop app-01
docker compose build app-01
docker compose start app-01
但这不起作用,它只会启动旧容器。
构建后我可以执行
docker compose up
,但这也会重新启动/重新创建所有其他服务,从而导致停机。
这可能吗?
你应该能够
docker compose build app-01
docker compose up -d
即使容器正在运行旧映像,您也始终可以构建新映像。旧映像将保持可用,直到手动删除为止,并且只要它有正在运行的容器就无法删除。
docker compose up
将查看所有容器定义并将它们与正在运行的容器进行比较。如果任何容器的设置发生更改,这些容器将被删除并重新创建(这是正常做法,容器本身不应该重要)。
您应该很少需要
docker compose stop
和start
。这些会使容器进入异常状态,其中容器存在但未运行进程。 docker compose start
(和docker start
)在现有容器中重新启动进程;这可能会导致问题,因为容器文件系统不会处于“干净”状态。在您的特定设置中,由于它重用现有容器,因此它也将重用现有(旧)图像。