关于docker:Docker-笔记-Docker-容器重启策略-restart-介绍和实战

9次阅读

共计 5337 个字符,预计需要花费 14 分钟才能阅读完成。

1. Docker 容器的重启策略

目标
为了保障容器运行时健壮性(自愈),Docker 提供了容器重启策略,即应用参数 –restart,它能够让容器在退出时主动尝试重启。

场景
Docker 容器的重启策略个别用于生产环境,开发环境和试验环境能够疏忽。例如应用 Docker 运行 Nginx。Nginx 作为目前罕用的 web 服务器,咱们必定更心愿看到它在因停电、主机重启等意外事件中尝试主动复原。

原理
Docker 容器的主动重启是由 Docker 守护过程实现的。在较老版本 Docker 中,如果 docker 守护过程重启,容器会全副挂掉。新版本 Docker 中,容许设置,当 docker 守护过程重启,容器不受影响。该场景比拟多见,例如批改了 docker 的配置而须要从新加载 docker 守护过程,如果 docker 容器重启,业务会短暂中断,尤其是在生产环境这是不可承受的。所以这个设置很有必要。
具体设置办法有两种:
第一种,编辑 /etc/docker/daemon.json,增加 “live-restore”: true:

{"live-restore": true,}

第二种,命令启用

dockerd --live-restore systemd

Docker 容器的重启策略具体如下:

  • no
    默认策略,在容器退出时不重启容器。启动容器时不增加参数 –restart 即可。
  • on-failure
    在容器非正常退出时(退出状态非 0),才会重启容器。
  • on-failure:n
    在容器非正常退出时重启容器,并且指定重启次数。n 为正整数。如果不指定次数,则会始终重启。
  • always
    只有容器退出就重启容器。
  • unless-stopped
    在容器退出时总是重启容器,然而 Docker 守护过程启动之前就曾经进行运行的容器不算在内。

2. Docker 容器的退出状态码

Docker 容器也有退出状态码,这一点相似 Linux 命令。Docker 容器的重启策略就是基于状态码。具体如下:

  • 0
    示意容器失常退出。例如 stop 容器。
  • 非 0
    示意容器退出异样(退出状态码采纳 chroot 规范)。例如执行 docker run 失败后的容器退出。
  • 125
    Docker 守护过程自身有谬误。
  • 126
    容器启动后,要执行的默认命令无奈调用。
  • 127
    容器启动后,要执行的默认命令不存在。
  • 其余命令状态码
    容器启动后在容器外部执行命令,该命令退出时的返回状态码,就作为容器的退出状态码

3. 获取 Docker 容器退出状态码的办法

3.1 应用命令 docker ps -a

该命令后果的 第 5 列中 Exited 前面括号中的数字就是容器的退出状态码。如下所示,Exited (1) 33 minutes ago,1 就是这个容器的退出状态码。然而 1 并不是容器自身的退出状态码,而是容器中运行的命令执行失败后退出的状态码。在 Linux 零碎定义的命令退出状态码中,1 示意未知,即零碎不晓得具体谬误的起因。这时候就须要看具体的日志来判断。

[root@k8s-master /]# docker ps -a | grep nginx
3e64cad716c0   192.168.100.20:5000/mynginx:latest   "nginx"   36 minutes ago   Exited (1) 33 minutes ago    nginx-demo

3.2 应用 inspect 命令

inspect 命令是用来获取容器的命令,配合其余参数就能获取容器的退出状态码。如下所示,还是下面案例中的容器,取得其退出状态码为 1

[root@k8s-master /]# docker inspect 3e64cad716c0 --format='{{.State.ExitCode}}'
1

4. docker run 的 –restart 参数阐明

  • –restart 选项通常只用于 detached 模式的容器。
    detached 即 后盾运行模式(类比 Linux 命令的前台运行和后盾运行)。Docker 容器的两种运行模式:Foreground,Detached。docker run 时增加了 -d 或者 -d=true 参数,就是后盾模式运行。
  • –restart 选项不能与 –rm 选项同时应用。
    因为 –rm 选项只实用于 foreground 模式的容器。
  • 在 docker ps 查看容器时,对于应用了 –restart 选项的容器,其可能的状态只有 Up 或 Restarting 两种状态。

5. –restart 参数中的其余设定

猜想一下,–restart 的重启工夫距离是怎么的?这个参数会生效吗?又会在什么状况下生效?

来看试验:
启动一个 Nginx 容器,当它找不到配置文件时,Nginx 报错并且过程退出,容器也随之推出。此时该容器会尝试重启。

如下所示:

[root@k8s-master /]# docker run -d --name nginx-demo -p 8010:80 -v /data/nginx/html/:/usr/share/nginx/html/ -v /data/nginx/logs/:/var/log/nginx/ -v /data/nginx/conf/:/etc/nginx/ --restart=always 192.168.100.20:5000/mynginx:latest
3e64cad716c0d60e9249dc72c11cc5cc7ece42d3f69fcf276ff28fd84782ed89
[root@k8s-master /]#
[root@k8s-master /]# ls /data/nginx/*
/data/nginx/conf:
/data/nginx/html:
/data/nginx/logs:
error.log
[root@k8s-master /]#
[root@k8s-master /]# tail -f /data/nginx/logs/error.log
2022/03/30 04:00:54 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:00:55 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:00:55 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:00:56 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:00:57 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:00:58 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:02 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:08 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:21 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:47 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:02:39 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
[root@k8s-master /]#
[root@k8s-master /]# docker stop nginx-demo
nginx-demo
[root@k8s-master /]#
[root@k8s-master /]# tail -f /data/nginx/logs/error.log
2022/03/30 04:00:56 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:00:57 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:00:58 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:02 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:08 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:21 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:01:47 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:02:39 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:03:39 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2022/03/30 04:04:39 [emerg] 1#0: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)

通过下面的试验,发现了几个很有意思的景象:

04:00:54,容器首次重启失败。04:00:55,容器开始第一次尝试重启,直到第 5 次重启,每次重启工夫距离为 1 秒。04:01:02,从第 6 次重启开始,工夫距离变为 3 秒。04:01:08,从第 7 次重启开始,工夫距离变为 6 秒。04:01:21,从第 8 次重启开始,工夫距离变为 13 秒。04:01:47,从第 9 次重启开始,工夫距离变为 26 秒。04:02:39,从第 10 次重启开始,工夫距离变为 52 秒。从这之后,工夫距离稳固变为 1 分钟。

从试验中咱们推断出对于 –restart 重启策略中的一些设定:

  • 对于工夫策略的设定:
    - 前 5 次工夫距离为 1 秒
    - 第 6 次开始工夫距离为之前的 2 倍。
    - 直到工夫距离超过 1 分钟时,后续的每一次重启的工夫距离都固定为 1 分钟。
  • 对于 –restart 策略生效的设定:
    - 当执行容器 stop 时,--restart 生效,容器不再尝试重启。试验中,重启日志始终停留在“2022/03/30 04:04:39”。

6. 容器启动时遗记应用 –restart=always 如何补救

6.1 应用 update 命令

[root@k8s-master /]# docker container update --restart=always 3e64cad716c0
3e64cad716c0

6.2 批改容器的配置文件

vim /var/lib/docker/containers/ 容器 ID/hostconfig.json,找到关键字 RestartPolicy,将 no 改为 always
批改前:

"RestartPolicy:{"Name":"no","MaximumRetryCount":0}

批改后:

"RestartPolicy:{"Name":"always","MaximumRetryCount":0}

重启容器即可。如果无奈批改容器的配置,可先将容器进行,批改配置文件后再启动。

7. 获取容器重启信息

查看容器重启次数

[root@k8s-master /]# docker inspect -f "{{.RestartCount}}" 3e64cad716c0
13

查看容器最初一次的启动工夫

[root@k8s-master /]# docker inspect -f "{{.State.StartedAt}}" 3e64cad716c0
2022-03-30T04:04:39.87804495Z
正文完
 0