1、 Docker容器的重启策略
Docker容器的重启策略如下:
no
,默认策略,在容器退出时不重启容器on-failure
,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3
,指定启动的次数,在容器非正常退出时重启容器,最多3次always
,在容器退出时总是重启容器unless-stoped
,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止的容器
容器如果被守护进程重新拉起后,容器的id和名称都是不变的,但是对应在主机上的进程号会变化。
示例:
docker run -d --name nginx -P --restart=always nginx:latest
运行一个nginx容器,通过 --restart 选项来指定 重启策略
2、 Docker容器的退出状态码
docker run 的退出状态码如下:
- 0,表示正常退出
- 非0,表示异常退出(退出状态码采用chroot标准)
- 125,Docker守护进程本身的错误
- 126,容器启动后,要执行的默认命令无法调用
- 127,容器启动后,要执行的默认命令不存在
- 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
3、 不同操作,对应容器的状态
3.1、策略为always
创建容器,并设置容器重启策略为always
docker run -d --name nginx -P --restart=always nginx:latest
3.2、查看各种状态码
查看容器详细信息:
docker inspect nginx
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2303,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-08-18T07:44:13.874147547Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"RestartPolicy": { # 记录重启策略
"Name": "always",
"MaximumRetryCount": 0 # 最大重启次数,0代表无限制
},
停止nginx看看:
docker stop nginx
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-08-18T07:44:13.874147547Z",
"FinishedAt": "2023-08-18T08:49:14.335913583Z"
},
"RestartCount": 0, # 为0,不影响重启次数
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
},
再次启动看看:
docker start nginx 或 docker restart nginx
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2647,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-08-18T09:15:43.425600429Z",
"FinishedAt": "2023-08-18T08:49:14.335913583Z"
},
"RestartCount": 0, # 为0 不影响重启次数
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
},
kill掉nginx容器的进程,使它异常停止:
docker top nginx # 获取到进程PID
kill -9 PID # 杀死进程
再次使用docker top nginx 查看进程时发现进程号已经改变
再次查看状态:
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2799,
"ExitCode": 0, # 退出码为0
"Error": "",
"StartedAt": "2023-08-18T09:19:04.157110157Z",
"FinishedAt": "2023-08-18T09:19:03.938362559Z"
},
"RestartCount": 1, # 重启次数为 1
"Name": "always",
"MaximumRetryCount": 0
},
多次killnginx进程会发现,RestartCount 会一直累加
注意: “ExitCode”: 0 退出码 为0 ,是因为进程被强制杀死,来不及写状态码
docker kill nginx # 使用docker kill 杀死容器时,退出码是137,并且容器不会重启
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137, # docker kill 使用137作为退出码
"Error": "",
"StartedAt": "2023-08-18T09:32:49.4100902Z",
"FinishedAt": "2023-08-18T09:35:24.230482296Z"
}
127错误吗,容器启动后,要执行的默认命令不存在:
创建一个容器并执行命令 aaa
docker run -d --name nginx-01 -P --restart=always nginx:latest aaa
执行docker ps 查看容器运行状态
可以发现容器限制状态码127
查看容器的详情状态:
"State": {
"Status": "restarting",
"Running": true,
"Paused": false,
"Restarting": true,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 127, # 状态码为127
"Error": "",
"StartedAt": "2023-08-18T09:44:23.065924794Z",
"FinishedAt": "2023-08-18T09:44:23.14536617Z"
},
容器状态码为127表示,容器启动后。要执行的默认命令不存在
参考文章:https://blog.csdn.net/m0_45406092/article/details/119083568