【问题标题】:How to check if the restart policy works of Docker如何检查 Docker 的重启策略是否有效
【发布时间】:2015-04-16 16:07:00
【问题描述】:

从 Docker document,可以设置一个restart policy 参数。

当容器退出时,如何验证容器确实重新启动。如何手动触发容器退出,并观察容器是否重启?

我的环境是 Mac 和 boot2docker。

谢谢

【问题讨论】:

    标签: docker boot2docker


    【解决方案1】:

    运行容器后,您可以检查其策略、重启计数和上次启动时间:

    docker inspect -f "{{ .HostConfig.RestartPolicy }}" <container_id>
    docker inspect -f "{{ .RestartCount }}" <container_id>
    docker inspect -f "{{ .State.StartedAt }}" <container_id>
    

    然后你可以查看容器进程:

    docker exec -it <container_id> ps -aux
    

    PID 1 进程 - 是主进程,它死后整个容器都会死。

    杀死他使用

    docker exec -it <container_id> kill -9 <pid>
    

    然后确保容器自动重启:

    docker inspect -f "{{ .RestartCount }}" <container_id>
    

    【讨论】:

    • 您也可以使用docker kill &lt;container_id&gt;,默认情况下会向容器发送SIGKILL
    【解决方案2】:

    你也可以docker exec -it container_id bash然后kill -9主进程。我用docker run -d --restart=always -e DISPLAY=$DISPLAY -v /home/gg/moncontainer:/home/gg -v /tmp/.X11-unix:/tmp/.X11-unix k3ck3c/captvty测试我杀了主进程(pid 5,Captvty.exe),从容器中注销,2秒后重新启动,再次创建窗口

    【讨论】:

    • 酷,我学习了一个新命令docker exec -it &lt;container_id&gt; bash 来进入容器外壳。谢谢,这个方法行得通,有点不便是我不知道应该杀死什么进程导致退出,所以我一个一个尝试。无论如何,它确实会重新启动:)
    • 我发现进程应该被杀死是关于在ENTRYPOINT或CMD中运行的进程
    【解决方案3】:

    我刚刚手动创建了一个容器,如下所示:

    docker run -d --restart=always tacodata/pythondev sleep 10
    

    注意,守护进程启动,但容器在 10 秒后退出。每次我做 docker ps 我都会看到:

    core@pa2 ~ $ docker ps
    CONTAINER ID        IMAGE                                     COMMAND             CREATED              STATUS              PORTS                    NAMES
    69cbae4b6459        tacodata/pythondev:latest                 "sleep 10"          About a minute ago   Up 9 seconds        5000/tcp                 high_colden                                                                         
    

    因此,容器是在一分钟前创建的,但状态仅显示了 9 秒。它一直在重新启动。您可以从以下位置获取该信息:

    core@pa2 ~ $ docker inspect high_colden
    [{
    "AppArmorProfile": "",
    ...
    "Path": "sleep",
    "ProcessLabel": "",
    "ResolvConfPath": "/var/lib/docker/containers/69cbae4b645926b14d86effcfaaa7735119e7f0c8afb0baff5cc1913583bf35a/resolv.conf",
    "RestartCount": 16,
    "State": {
        "Error": "",
        "ExitCode": 0,
        "FinishedAt": "2015-04-16T16:36:15.325629703Z",
        "OOMKilled": false,
        "Paused": false,
        "Pid": 13453,
        "Restarting": false,
        "Running": true,
        "StartedAt": "2015-04-16T16:36:15.860163812Z"
    },
    "Volumes": {},
    "VolumesRW": {}
    }
    

    【讨论】:

    • 谢谢,这也是一个很好的解决方案。但是,sleep 应该只触发zero exit status 退出,对吗?还有其他方法可以触发non-zero exit status退出吗?
    【解决方案4】:

    您还可以重新启动 docker 服务以查看它是否在启动时启动容器。以 Ubuntu 为例,

    sudo service docker restart
    

    【讨论】:

      【解决方案5】:

      另一种选择:

      • 使用docker ps获取要杀死的容器的Container ID。

      • 然后执行ps -efa | grep &lt;Container ID&gt; 获取进程ID。

      • 然后做sudo kill -9 &lt;Process ID&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-19
        • 2013-04-11
        • 1970-01-01
        • 2012-09-05
        • 1970-01-01
        • 2018-12-12
        • 2021-03-17
        • 2022-01-02
        相关资源
        最近更新 更多