如何使用 docker-compose 重启单个容器

Posted

技术标签:

【中文标题】如何使用 docker-compose 重启单个容器【英文标题】:How to restart a single container with docker-compose 【发布时间】:2015-10-06 14:53:11 【问题描述】:

我有一个包含 4 个容器的 docker-compose.yml 文件:redispostgresapiworker

worker 容器的开发过程中,我经常需要重新启动它以应用更改。有什么好方法可以重启单个容器(例如worker)而不重启其他容器?

【问题讨论】:

docker-compose -f docker-compose.yml 重启工人 docs.docker.com/compose/production中的“部署更改”部分 由于您明确要求“应用更改”,您可能希望将接受的答案更改为 BMitch 的。 【参考方案1】:

很简单:使用命令:

docker-compose restart worker

您可以设置杀死容器前等待停止的时间(以秒为单位)

docker-compose restart -t 30 worker

请注意,这将重新启动容器,但不会重建它。如果您想应用更改然后重新启动,请查看其他答案。

【讨论】:

对我来说它有效,但如果允许在这里出现一个一般性问题:“重新启动”是否会处理链接的容器并更新 /etc/hosts 或“重新启动”根本不会更改任何 IP ? 容器按名称链接,通常您需要担心的唯一 IP 是外部 docker 主机 IP(通常为 192.168.99.100)。例如,如果您重新启动其他容器连接到的数据库容器,可能会出现一些问题。依赖容器必须有足够的弹性才能重新连接。 OP 声明他需要“重新启动它以应用更改”。根据文档,docker-compose restart 命令不会应用任何更改。 “如果您对 docker-compose.yml 配置进行更改,则这些更改不会在运行此命令后反映出来。”因此使用docker-compose up -d --build。 docs.docker.com/compose/reference/restart nb,worker 是 yaml 文件中为服务指定的名称,而不是您在运行 docker ps -a 时看到的任何名称 这个其他答案要好得多***.com/a/39501539/292408,因为restart 不会应用更改,即使您已经运行了docker-compose build <container name>,这是一个无效/不正确的答案。【参考方案2】:

重启单个节点的其他答案都在目标上,docker-compose restart worker。这将反弹该容器,但不包括任何更改,即使您单独重建它也是如此。您可以手动stoprmcreatestart,但还有更简单的方法。

如果您更新了代码,则可以通过以下步骤进行构建和重新加载:

docker-compose up --detach --build

这将首先从任何更改的代码重建您的图像,如果没有更改,因为缓存被重用,这会很快。然后它只替换更改的容器。如果您下载的图像已过时,您可以在上述命令前加上:

docker-compose pull

首先下载任何更改的图像(在您运行类似上述up 的命令之前,容器不会重新启动)。不需要进行初始停止。

如果只对单个服务执行此操作,请在 up 或 pull 命令之后使用您要指定的服务,例如:

docker-compose up --detach --build worker

这是第一个选项的一个简单示例,Dockerfile 的结构旨在将代码中频繁更改的部分保持在末尾附近。事实上,pip install 的要求是单独引入的,因为该文件很少更改。由于 nginx 和 redis 容器是最新的,因此它们没有重新启动。整个过程的总时间不到 6 秒:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

【讨论】:

这很有趣,但它可以与-no-cache 选项一起使用吗?假设我在package.json 中添加了一些内容,需要重新RUN npm installDockerfile 本身并没有改变 @augustinriedinger 如果您的输入文件已更改,并且您将其包含在 COPY 命令中,则会自动中断缓存。 @augustinriedinger 谢谢。我是手机,所以我看不到链接的问题。根据您问题中的步骤,您的 Dockerfile 中应该已经有一个 COPY 命令。 git pull 将更新 package.json 文件,并且当 docker 看到您在不同的文件中复制时,构建缓存将中断。 感谢不知道这种行为!我使用的是ADD 而不是COPY 但显然后者是best practice 所以我会去的! @augustinriedinger ADD 将与 COPY 在缓存崩溃时产生相同的结果,但是(如最佳实践链接中所建议)大多数不需要额外的功能,所以我不需要甚至懒得提。【参考方案3】:

要通过更改重新启动服务是我执行的步骤:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose up --no-start worker
docker-compose start worker

【讨论】:

如果您需要更改以应用构建,您可以轻松地执行docker-compose up -d --build,它将重建所有内容并重新启动任何更改的容器。无需先停止、停机、单独的创建和启动命令。 是的,如果你想重启所有服务,但是 OP 只想重启一个服务而不重启其他服务 查看我发布的答案,在示例中,up 只会重新创建已更改的容器,因此需要重新启动。 @BMitch 不知何故它并不总是适用于 Rust 容器。即使我没有更改源代码中的任何内容,但执行docker-compose up -d --build 经常会重新编译项目。【参考方案4】:

以下命令

docker-compose restart worker

只会停止和启动容器。即不从 docker-compose.xml 加载任何更改

STOP 类似于 PC 中的休眠。因此 stop/start 不会查找配置文件中所做的任何更改。要从容器(docker-compose.xml)的配方中重新加载,我们需要删除并创建容器(类似于重启 PC)

所以命令如下

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

【讨论】:

+1,非常感谢!对于rm 行选项-f 派上用场(无提示),并且与当前docker createstart 合并为up(所以我们总共有3 个命令而不是4 个),对于up 选项-d 很有用(在后台执行)。【参考方案5】:

由于其他一些答案包括有关重建的信息,而且我的用例也需要重建,因此我有一个更好的解决方案(与那些相比)。

仍然有一种方法可以轻松地仅针对单个 worker 容器,该容器在一行中重建 + 重新启动它,尽管它实际上不是单个命令。对我来说最好的解决方案是只需重建并重新启动

docker-compose build worker && docker-compose restart worker

这对我来说同时实现了两个主要目标:

    针对单个 worker 容器 在一行中重建并重新启动它

希望这可以帮助其他人到达这里。

【讨论】:

【参考方案6】:

使用 docker-compose 文件重启服务

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

用例 #1: 如果 COMPOSE_FILE_NAME 是 docker-compose.yml 并且服务是工作者

docker-compose restart worker

用例#2:如果文件名是sample.yml,服务是worker

docker-compose -f sample.yml restart worker

默认情况下,如果我们运行docker-compose 命令,docker-compose 会查找docker-compose.yml,否则我们有标志以使用-f [FILE_NAME].yml 给出特定文件名

【讨论】:

我得到:错误:没有要重启的容器:( 你在同一个网络上【参考方案7】:

这里的答案是关于 docker-compose.yml 文件的变化的反映。

但是如果我想将我所做的更改合并到我的代码中,我相信这只有通过重建图像和我使用以下命令才能实现

1.码头集装箱停止

docker stop container-id

2。码头集装箱移除

docker rm container-id

3. docker镜像删除

docker rmi image-id

4.再次组合容器

docker-compose up container-name

【讨论】:

我认为你应该使用服务密钥而不是容器名称docker-compose up [service key] 有了容器名称,你可以通过 CTRL + R 再次运行它。【参考方案8】:

简单的“docker”命令对“worker”容器一无所知。 使用这样的命令

docker-compose -f docker-compose.yml restart worker

【讨论】:

不起作用——重新启动时没有应用对 coker-compose.yml 的新更改【参考方案9】:

重启容器

如果你只想重启你的容器:

docker-compose restart servicename

把这个命令想象成“只用它的名字重启容器”,相当于docker restart命令。

注意事项:

    如果您更改了 ENV 变量,它们将不会在容器中更新。您需要停止它并重新开始。或者,使用单个命令 docker-compose up 将检测更改并重新创建容器。

    正如许多其他人提到的,如果您更改了 docker-compose.yml 文件本身,简单的重启将不会应用这些更改。

    如果您在构建阶段将代码复制到容器内(在 Dockerfile 中使用 ADDCOPY 命令),每次代码更改时,您都必须重新构建容器 (docker-compose build)。

与您的代码的相关性

docker-compose restart 应该可以正常工作,如果您的代码通过docker-compose.yml 中的卷指令将路径映射到容器中,如下所示:

services:

  servicename:
    volumes:
      - .:/code

但我建议使用实时代码重新加载,这可能由您在调试模式下选择的框架提供(或者,您可以搜索您选择的语言的自动重新加载包)。添加它应该消除每次代码更改后重新启动容器的需要,而不是重新加载内部进程。

【讨论】:

【参考方案10】:

进行更改后,您需要将更改拉入服务器,然后重新创建容器。正如documentation 所示:

docker-compose pull worker && docker-compose up -d --no-deps worker

pull worker 将只将此项目拉到服务器上,--no-deps 将阻止重新启动 worker 容器所依赖的容器。

【讨论】:

以上是关于如何使用 docker-compose 重启单个容器的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 入口点重启不是无状态的

docker-compose 在主机重启后启动容器。哪个?

docker-compose安装

Docker三剑客之docker-compose

docker-compose 常用配置

基于fabric配置文件的Docker-compose学习