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

时间:2015-01-21 19:09:21

标签: docker

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

问题是:有没有一种标准方法来检查docker容器是否正常运行?

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

由于

2 个答案:

答案 0 :(得分:3)

谢尔盖,你需要使用初始化系统作为你的入门者进程的主管。您可以使用发行版内置的init系统,如systemd / upstart或init.d,取决于您的操作系统,以检查容器状态。

理论上,您应该在每个docker run命令的init系统中创建独立服务而不使用-d选项,因为使用-d选项docker分离了一个容器并将0退出状态返回到init系统。结果,init系统失去了对目标进程的控制。

例如,在Systemd中实现这种机制:

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

    输入类似的内容:

    [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. 重新加载系统配置systemctl daemon-reload
    2. 只需输入systemctl start something.servicerestart而不是开始,即可尝试运行您的容器。
    3. 您可以查看服务状态systemctl status something.service
    4. 有关使用systemd和docker的更多信息,请阅读此CoreOS手册:https://coreos.com/docs/launching-containers/launching/getting-started-with-systemd/

答案 1 :(得分:0)

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

  

重新启动用法:docker restart [OPTIONS] CONTAINER [CONTAINER ...]

     

重新启动正在运行的容器

     

-t, - time = 10之前尝试停止的秒数   杀死容器。一旦被杀死,它将重新启动。默认   是10秒。

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

如果您想确定容器是否正在运行(即使其中包含的服务尚未准备就绪),您可以:

  1. 运行docker ps - 这将为您提供所有正在运行的docker的列表 容器
  2. 使用Docker Remote API命令GET /containers/json - 这样就可以了 给你一个带有运行容器列表的json响应。
  3. https://docs.docker.com/reference/api/docker_remote_api_v1.16/

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