如何检查 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中这种机制的实现:
- 在
/etc/systemd/system
中创建 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
- 重新加载 Systemd 配置
systemctl daemon-reload
- 只需键入
systemctl start something.service
或 restart
而不是启动来尝试 运行 您的容器。
- 您可以查看服务状态
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 秒后返回。
如果您想确定一个容器是否 运行(即使您包含在其中的服务还没有准备好)您可以:
- 运行
docker ps
- 这将为您提供所有 运行 docker 的列表
集装箱
- 使用 Docker 远程 API 命令
GET /containers/json
- 这将
给你一个 json 响应,其中包含 运行 个容器列表。
https://docs.docker.com/reference/api/docker_remote_api_v1.16/
我有一个带有 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中这种机制的实现:
- 在
/etc/systemd/system
中创建
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
- 重新加载 Systemd 配置
systemctl daemon-reload
- 只需键入
systemctl start something.service
或restart
而不是启动来尝试 运行 您的容器。 - 您可以查看服务状态
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 秒后返回。
如果您想确定一个容器是否 运行(即使您包含在其中的服务还没有准备好)您可以:
- 运行
docker ps
- 这将为您提供所有 运行 docker 的列表 集装箱 - 使用 Docker 远程 API 命令
GET /containers/json
- 这将 给你一个 json 响应,其中包含 运行 个容器列表。
https://docs.docker.com/reference/api/docker_remote_api_v1.16/