如何检查 docker 容器是否已重新启动并且可以访问?

How to check that the docker container is restarted and accessible?

我有一个带有 JETTY CMD 指令的 docker 容器。 在 "docker restart" 之后立即消失,大约 9-10 秒后我无法访问 JETTY。在那之后 docker 容器或码头服务再次启动,我可以访问它。

问题是:是否有标准方法来检查 docker 容器是否真的启动了?

我当然可以对我的服务进行测试请求循环,然后等待 200 响应代码。不过也许还有更美的解决方案?

谢谢

Sergey,您需要使用初始化系统作为您的 in-Docker 进程的主管。您可以使用 systemd/upstart 或 init.d 等发行版内置初始化系统,具体取决于您的 OS 检查容器状态。

理论上你应该在没有 -d 选项的每个 docker run 命令上在你的初始化系统中创建独立服务,因为 -d 选项 docker 分离了一个容器和向 init 系统返回 0 退出状态。结果 init 系统失去了对目标进程的控制。

例如Systemd中这种机制的实现:

  1. /etc/systemd/system
  2. 中创建 something.service 文件

然后输入如下内容:

[Unit]
Description=Simple Blog Rails Docker Container Service
After=docker.service
Requires=docker.service

[Service]
Restart=on-failure
ExecStartPre=-/usr/bin/docker kill simple-blog-rails-container
ExecStartPre=-/usr/bin/docker rm simple-blog-rails-container
ExecStart=/usr/bin/docker run simple-blog-rails
ExecStop=/usr/bin/docker stop simple-blog-rails-container

[Install]
WantedBy=multi-user.target
  1. 重新加载 Systemd 配置 systemctl daemon-reload
  2. 只需键入 systemctl start something.servicerestart 而不是启动来尝试 运行 您的容器。
  3. 您可以查看服务状态systemctl status something.service

有关使用 systemd 和 docker 的更多信息,您可以阅读此 CoreOS 手册:https://coreos.com/docs/launching-containers/launching/getting-started-with-systemd/

请记住,docker restart 默认等待时间为 10 秒:

restart Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...]

Restart a running container

-t, --time=10 Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.

当我在 docker 容器中使用一些长 运行 脚本尝试此操作时,它需要 10 秒才能完成。如果我更改命令行以使用不同的超时(如 -t=4} 它会在 4 秒后返回。

如果您想确定一个容器是否 运行(即使您包含在其中的服务还没有准备好)您可以:

  1. 运行 docker ps - 这将为您提供所有 运行 docker 的列表 集装箱
  2. 使用 Docker 远程 API 命令 GET /containers/json - 这将 给你一个 json 响应,其中包含 运行 个容器列表。

https://docs.docker.com/reference/api/docker_remote_api_v1.16/

https://docs.docker.com/reference/commandline/cli/#ps