如何重建和更新容器没有停机与码头组成?

我很喜欢使用码头作曲。

例如,在我的服务器上,当我想更新我的应用程序与微小的变化,我只需要 git pull origin master && docker-compose restart,工程完美。

但有时,我需要重新构建(例如,我添加了一个 npm 依赖项,需要再次运行 npm install)。

在这种情况下,我做 docker-compose build --no-cache && docker-compose restart

我希望这样做:

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

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

这是预期的行为吗?

我如何处理一个重建,并开始新的 之后它是建立?

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

89443 次浏览

up命令使用 --build标志,同时使用 -d标志在后台运行容器:

docker-compose up -d --build

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

-d假设您不希望在 shell 前景中保持所有内容都运行。这使它的行为更像 restart,但不是必需的。

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

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

  • 更改其中一个图像的 docker 文件
  • 调用 docker-compose build来构建图像
  • 呼叫 docker-compose down1docker-compose up
    • docker-compose restart将不在这里工作
    • 使用 docker-compose start也不起作用

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

与只调用 up --build相比,这样做的好处是您可以在重新启动之前先看到构建过程。

1: 从评论; 下来是不需要的,你可以只调用 up --build。向下有一些“向下”的方面,包括可能破坏您的(音量)数据。

从手动 码头-组合重新启动

如果对 docker-compose. yml 配置进行更改,可以使用以下命令 运行此命令后,更改将不会反映出来。

你应该能做到

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

--no-deps将不启动链接服务。

不要直接管理应用程序环境。使用像 牧场主/Kubernetes 这样的部署工具。使用一个你将能够升级你的应用程序没有任何停机,甚至降级,如果你需要的。

运行 Rancher 和运行另一个 Docker 容器一样容易,因为这个工具是可用的 在码头中心

您可以通过 docker swarm init命令首先使用 Swarm. Init warm,然后在 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

DockerSwarm 将创建新版本的服务,并在此之后停止旧版本。

虽然接受的答案应该在启动新的容器作为替换之前重新构建容器,但是对于简单的用例来说是可以的,但是在新的容器初始化过程中容器仍然处于关闭状态。如果这段时间很长,可能会成为一个问题。

我设法用 docker-compose(以及 nginx反向代理)实现了滚动更新,并详细介绍了我是如何在这个 github 问题中构建它的: https://github.com/docker/compose/issues/1786#issuecomment-579794865

希望能帮上忙!

另一种方式:

在您的情况下,docker-compose restart可以替换为 docker-compose up -d --force-recreate,请参阅 https://docs.docker.com/compose/reference/up/

运行以下命令:

docker-compose pull


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

正如评分最高的答案所提到的

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

将重新启动单个服务,而不会关闭整个组合。

我只是想添加到顶部的答案,以防有人不确定如何更新一个图像而不重新启动容器。

在 docker-compose 处于运行状态时运行 docker-compose up,将重新创建更改其配置的容器。

这是最简单的方法,而且它只会影响改变了配置的容器。

root@docker:~# docker-compose up
traefik is up-to-date
nginx is up-to-date
Recreating php ... done