如何使用docker-compose重建和更新容器而无需停机?

时间:2017-03-01 10:27:07

标签: docker docker-compose

我喜欢使用docker-compose。

EG。在我的服务器上,当我想通过微小的更改来更新我的应用时,我只需要addElement (addElement ... elem) elem,效果很好。

但有时,我需要重建(例如,我添加了npm依赖项,需要再次运行git pull origin master && docker-compose restart)。

在这种情况下,我做npm install

我希望这会:

  • 创建我的容器的新实例
  • 停止现有容器(在较新的完成构建之后)
  • 开始新的
  • 可选择删除旧的,但这可以手动完成

但实际上它似乎又重新启动了前者。

这是预期的行为吗?

我如何处理重建并在构建之后启动新的

也许我错过了一个特定的命令?或者它有意义吗?

8 个答案:

答案 0 :(得分:18)

来自手册docker-compose restart

  

如果您对docker-compose.yml配置进行了更改   运行此命令后,不会反映更改。

你应该可以做到

$docker-compose up -d --no-deps --build <service_name>

--no-deps无法启动链接服务。

答案 1 :(得分:16)

问题是restart将重启您当前的容器,这不是您想要的。

举个例子,我刚刚做了这个

  • 更改其中一个图片的泊坞窗文件
  • 致电docker-compose build制作图片
  • 致电docker-compose down 1 docker-compose up
    • docker-compose restart不会在这里工作
    • 使用docker-compose start代替也不起作用

说实话,我并不完全确定你需要先down,但这应该很容易检查。 1 底线是你需要致电up。您将看到未更改的图像的容器重新启动,但对于更改的图像,您将看到recreating

这比调用up --build更有优势的是,您可以在重新启动之前先看到构建过程。

1:来自评论;不需要向下,您只需拨打up --build即可。 Down有一些&#34; down-34; -sides,包括可能破坏你的(音量)数据。

答案 2 :(得分:7)

使用--build命令的up标志以及-d标志在后台运行容器:

docker-compose up -d --build

这将重建您在撰写文件中定义的所有图像,然后重新启动其图像已更改的所有容器。

-d假设您不希望在shell前台运行所有内容。这使得它更像restart,但不是必需的。

答案 3 :(得分:4)

不要直接管理您的应用程序环境。使用Rancher之类的部署工具。有了它,您将能够在没有任何停机的情况下升级您的dockerized应用程序,甚至可以根据需要对其进行降级。

运行Rancher就像运行另一个docker容器一样简单,因为此工具可用in the Docker Hub

答案 4 :(得分:3)

您可以使用Swarm。首先通过docker swarm init命令初始化集群,然后在docker-compose.yml中使用healthcheck

然后运行以下命令:

docker stack deploy -c docker-compose.yml project_name

代替

docker-compose up -d

当docker-compose.yml文件更新时,仅再次运行以下命令:

docker stack deploy -c docker-compose.yml project_name

Docker Swarm将创建新版本的服务,然后停止旧版本。

答案 5 :(得分:3)

尽管在开始更换新容器之前可以接受已接受的答案来重建容器,但是对于简单的用例来说是可以的,但是在新的容器初始化过程中容器仍将关闭。如果时间太长,可能会成为问题。

我设法通过docker-compose(以及nginx反向代理)实现了滚动更新,并详细说明了我如何在github问题中构建该更新:https://github.com/docker/compose/issues/1786#issuecomment-579794865

希望它能提供帮助!

答案 6 :(得分:0)

另一种方式:

您的情况下的

docker-compose restart可以替换为docker-compose up -d --force-recreate,请参见https://docs.docker.com/compose/reference/up/

答案 7 :(得分:0)

运行以下命令:

docker-compose pull

docker-compose up -d --no-deps --build

作为最受好评的答案 docker-compose up -d --no-deps --build <服务名称> 将重新启动一项服务,而不会减少整个撰写过程。 我只是想添加到最上面的答案,以防万一有人不确定如何在不重新启动容器的情况下更新映像。