【docker】Docker容器的重启策略_云川之下的博客-程序员秘密_docker 重启容器

技术标签: docker k8s paas  

1. Docker容器的重启策略

Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。

Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。

Docker容器的重启策略如下:

  • no,默认策略,在容器退出时不重启容器

  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器

    on-failure:3,指定启动的次数,在容器非正常退出时重启容器,最多重启3次

  • always,在容器退出时总是重启容器

  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

容器如果被守护进程重新拉起后,容器的id和名称都是不变的,但是对应在主机上的进程号会变化。

例如:

docker run -p 8092:80 --name apicloud -v /home/lifehaier:/var/www/html -d --restart=on-failure:3 hub.docker.terminus.io:5000/aabb:20180315

解释:使用docker run命令运行一个容器,该容器内部监听80端口,与宿主机系统8092端口映射,命名该容器名称为apicloud,宿主机系统目录/home/lifehaier与容器内部/var/www/html路径映射,如果容器对应的images路径/var/www/html下面有数据的话,则被宿主机/home/lifehaier路径下面的数据覆盖,-d参数是让容器后台运行,–restart=on-failure:3是指容器在未来出现异常退出(退出码非0)的情况下循环重启3次;hub.docker.terminus.io:5000/aabb:20180315 是images名称,容器基于此images进行启动。

通过–restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。

  • --restart选项通常只用于detached模式的容器。

  • --restart选项不能与–rm选项同时使用。显然,--restart选项适用于detached模式的容器,而--rm选项适用于foreground模式的容器。

2. Docker容器的退出状态码

docker run的退出状态码如下:

  • 0,表示正常退出

  • 非0,表示异常退出(退出状态码采用chroot标准)

    • 125,Docker守护进程本身的错误

    • 126,容器启动后,要执行的默认命令无法调用

    • 127,容器启动后,要执行的默认命令不存在

    • 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码

3. 不同操作,对应容器的状态

3.1 策略为always

3.1.1 初次创建容器

初次创建容器,并设定容器重启策略为always

docker run -d --name myredis3 --restart=always myredis:exec

此时容器状态

        "State": {
    
            "Status": "running",    'running'
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 19018,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-07-25T07:38:31.390940404Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        }
        "RestartCount": 0,
        "HostConfig": {
    

            "RestartPolicy": {
                  '记录了重启策略'
                "Name": "always",
                "MaximumRetryCount": 0
            },
        

3.1.2 docker stop

docker stop

        "State": {
    
            "Status": "exited",      'exited'
            "Running": false,
            "Paused": false,
            "Restarting": false,
           "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-07-25T04:15:15.052478152Z",
            "FinishedAt": "2021-07-25T04:16:57.238324749Z"
        }
        "RestartCount": 0,          '仍为0,不影响重启次数'

3.1.3 docker start

        "State": {
    
            "Status": "running",         '又变回running'
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 19018,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-07-25T07:38:31.390940404Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "RestartCount": 0,          '仍为0,不影响重启次数'

3.1.4 docker restart

docker restart :

        "State": {
    
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 12989,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-07-25T07:44:12.506647419Z",
            "FinishedAt": "2021-07-25T07:44:12.145349632Z"
        }
        "RestartCount": 0,   '注意:不影响重启次数'

注意:不影响重启次数,说明docker restart 仍属于正常退出场景

3.1.5 我们干掉容器的进程

[root]$ docker inspect -f '{
    {.State.Pid}}' myredis4
12989

[root]$ kill -9 12989

再来看状态:

        "State": {
    
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 26088,
            "ExitCode": 0,      '退出码为0'
            "Error": "",
            "StartedAt": "2021-07-25T07:51:29.371543467Z",
            "FinishedAt": "2021-07-25T07:51:28.874326028Z"
        },
        "RestartCount": 1,     '次数+1 了'

可以反复试下干掉进程,理论上由于是always 策略,会一直重新拉起,不限次数。

注意: 此时退出码为0,理解为进程被杀死,来不及写状态码。

3.1.6 docker kill

docker kill myredis4

查看状态:

        "State": {
    
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 137,      '137,表示接收137好命令状态码'
            "Error": "",
            "StartedAt": "2021-07-25T07:51:29.371543467Z",
            "FinishedAt": "2021-07-25T08:00:22.509279442Z"
        },
        "RestartCount": 1

3.1.7 127错误码,容器启动后,要执行的默认命令不存在

我们故意在启动redis容器后面执行aaa,是个不存在的命令:

[[email protected]:/home/ubuntu]$ docker run -d --name myredis5 --restart=always myredis:exec   aaa
a983d983c8e4db7567b3b56402cf6509c9b959b28a7f0825411e26cd9d311505            '显示容器创建成功'
docker: Error response from daemon: oci runtime error: container_linux.go:300: starting container process caused "exec: \"aaa\": executable file not found in $PATH".

日志显示容器创建成功,看下容器的状态:

        "State": {
    
            "Status": "created",        '状态为created'
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 127,       '127码'
            "Error": "oci runtime error: container_linux.go:300: starting container process caused \"exec: \\\"aaa\\\": executable file not found in $PATH\"\n",
            "StartedAt": "0001-01-01T00:00:00Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "RestartCount": 0,

状态为created,说明发生异常,就没有启动该容器,只是创建了该容器。

3.1.8 总结

docker restart 命令让容器正常重启,不累加重启次数

干掉进程,容器会重启,累加次数

docker kill,容器不重启,但是给出137退出码

另外,错误码对应特定的,例如我们演示的127错误码

3.2 on-failure

我们在always场景下,如果是干掉进程,就会立即启动该容器,但是退出码是0,所以,我们需要针对该场景,进行一个对比。

启动容器,设置策略为on-failure:10

$ docker run -d --name myredis6 --restart=on-failure:10 myredis:exec
8ce68b1f63040411e6261f8569a8af3579f5506156111e0f2edbc628673e1b2d

干掉进程:

[[email protected]:/home/ubuntu]$ docker inspect -f '{
    {.State.Pid}}' myredis6
3164
[[email protected]:/home/ubuntu]$ kill -9 3164
        "State": {
    
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 17901,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-07-25T08:22:00.859191669Z",
            "FinishedAt": "2021-07-25T08:22:00.30237101Z"
        },
         "RestartCount": 1,
         "RestartPolicy": {
    
             "Name": "on-failure",
             "MaximumRetryCount": 10
         },

我们发现容器也可以被重启,说明干掉进程仍归类为异常退出,只是没记记录ExitCode字段而已。

4. 示例与补充

示例:

docker run -d --restart=always bba-208
docker run -d --restart=on-failure:10 bba-208

补充:

#查看容器重启次数
docker inspect -f "{
    { .RestartCount }}" bba-208
#查看容器最后一次的启动时间
docker inspect -f "{
    { .State.StartedAt }}" bba-208
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_45406092/article/details/119083568

智能推荐

子载波间隔_kkkeep learning的博客-程序员秘密_子载波间隔

1. 子载波间隔(SCS)?载波是通信系统里的频域资源概念,子载波可以认为是可独立调制的一小段频域资源,一般来说载波>子载波。一个子信道有一个或者多个子载波,子载波就是一个个载波,比如100MHz带宽里,假设15KHz是一个子载波,这里边有很多个子载波。(这里子载波数并不是100M/15K。例如,小区带宽配置为20MHz,对应的RB[资源块]为100个,子载波数就是1200个,15KHz的子载波间隔,传输带宽就是1200*15KHz = 18M,实际上小于20M带宽。那么剩余的2M带宽去哪了呢

R语言使用matrix函数创建空矩阵、使用nrow参数和ncol参数指定矩阵的行列数_sdgfbhgfj的博客-程序员秘密_nrow和ncol

R语言使用matrix函数创建空矩阵、使用nrow参数和ncol参数指定矩阵的行列数

HTTPSQS(HTTP Simple Queue Service)消息队列_weixin_34085658的博客-程序员秘密

HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。  项目网址:http://code.google.com/p/httpsqs/  使用文档:http://blog.s135.com/httpsqs/  使...

随便推点

R语言使用cbind函数将多个向量数据纵向合并起来形成矩阵的数据列、使用指定的行数据范围和列索引列表索引矩阵数据_sdgfbhgfj的博客-程序员秘密_r语言纵向合并

R语言使用cbind函数将多个向量数据纵向合并起来形成矩阵的数据列、使用指定的行数据范围和列索引列表索引矩阵数据

R语言使用cbind函数将多个向量数据纵向合并起来形成矩阵的数据列、索引矩阵的第M行第N列的元素_sdgfbhgfj的博客-程序员秘密

R语言使用cbind函数将多个向量数据纵向合并起来形成矩阵的数据列、索引矩阵的第M行第N列的元素

effective-java 之 考虑使用静态工厂方法替代构造方法_馨新欣心1的博客-程序员秘密

优点:1.可以有自己的名字;2.不用每次调用是创建一个新对象;3.可以返回任何类型的子类;4.返回类型可以根据传入参数不同而不同;5.返回对象的类不需要存在;缺点:1.没有公共或受保护构造方法的类不能被子类化;2.程序员很难找到它们;示例:public static Boolean valueOf(boolean b) { return...

推荐文章

热门文章

相关标签