如何保护 Docker 容器使其始终运行?

如何保护 Docker 容器使其始终运行?

我有一个 HBase Docker 容器,在多台开发人员笔记本电脑上运行。当开发人员关闭笔记本电脑时,Docker 容器将不可避免地死亡并停止运行。

这就是我们调用容器的方式:

$ docker run -d --hostname hbase-db --name hbase \
     -p 2181:2181   -p 8080:8080   -p 8085:8085   -p 9090:9090 -p 9095:9095 \
     -p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 \
     harisekhon/hbase

问题

我如何保护这个容器,以便它在/如果它死掉时自动重新启动?

答案1

Docker 重启策略

Docker 提供了一个功能来解决这个问题,称为Docker重启策略:

Docker 提供重启政策控制容器退出时或 Docker 重新启动时是否自动启动。重新启动策略可确保链接的容器以正确的顺序启动。 Docker 建议您使用重启策略,并避免使用进程管理器来启动容器。

重启策略的类型:

no                  Do not automatically restart the container. (the default)

on-failure          Restart the container if it exits due to an error, which
                    manifests as a non-zero exit code.

unless-stopped      Restart the container unless it is explicitly stopped or 
                    Docker itself is stopped or restarted.

always              Always restart the container if it stops.

用法

然后您可以使用它的重新启动策略,如下所示:

$ docker run -dit --restart always redis

注意事项

  • 重启策略只有在容器启动成功后才会生效。在这种情况下,启动成功意味着容器已启动至少 10 秒,并且 Docker 已开始对其进行监控。这可以防止根本不启动的容器进入重新启动循环。

  • 如果您手动停止容器,则在 Docker 守护程序重新启动或手动重新启动容器之前,其重新启动策略将被忽略。这是防止重启循环的另一次尝试。

  • 重启策略仅适用于容器。 Swarm 服务的重启策略配置不同。查看与服务重启相关的标志。

例子

在这里我们将使用你好世界 Docker 容器来说明这是如何工作的。

首先我们把它拉下来:

$ docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for docker.io/hello-world:latest
$ 

下载容器后,让我们运行它:

$ docker run -dit --restart always hello-world
0f6a61dddd3b667727a20df2c198941b2202653a71b6c86b8ace7b236bafc974

如果我们运行几个,docker ps我们会看到它一遍又一遍地重新启动:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                              PORTS               NAMES
0f6a61dddd3b        hello-world         "/hello"            27 seconds ago      Up Less than a second                                   upbeat_brown

...time passes...

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                              PORTS               NAMES
0f6a61dddd3b        hello-world         "/hello"            5 minutes ago       Restarting (0) About a minute ago                       upbeat_brown

...time passes...
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
0f6a61dddd3b        hello-world         "/hello"            10 minutes ago      Restarting (0) 3 minutes ago                       upbeat_brown

查看 Docker 日志,我们可以看到它已重新启动多次:

$ docker logs 0f6a61dddd3b -f | grep "Hello from Docker"
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!

完成后,请务必停止容器,以免它永远重新启动:

$ docker stop 0f6
0f6

你的修复

要解决您的问题,只需运行 HBase Docker 容器,如下所示:

$ docker run -d --hostname hbase-db --name hbase --restart always \
    -p 2181:2181   -p 8080:8080   -p 8085:8085   -p 9090:9090   -p 9095:9095 \
    -p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 \
    harisekhon/hbase

参考

相关内容