docker run --restart no,always,on-failure,unless-stopped
笔记250406
docker run --restart
用于配置容器的自动重启策略,当容器意外退出时,Docker 会根据策略自动重新启动容器。这是确保服务高可用的重要参数。
语法
bash
docker run --restart <策略> [其他参数] <镜像>
可选策略
-
no
默认值,容器退出后不会自动重启。
-
on-failure[:max-retries]
- 容器以非 0 状态码退出时自动重启(例如程序崩溃)。
- 可选的
:max-retries
指定最大重试次数(例如on-failure:3
)。
-
always
- 无论退出状态码是什么,都自动重启容器(包括手动停止容器后,Docker 服务重启时也会启动该容器)。
- 注意:
docker stop
手动停止的容器不会触发此策略。
-
unless-stopped
- 无论退出状态码是什么,都自动重启容器。
- 与
always
的区别:如果容器是手动停止 的(docker stop
),即使 Docker 服务重启,容器也不会自动启动。
策略 | 说明 |
---|---|
no |
默认值,容器退出后不会自动重启。 |
always |
无论容器因何退出(包括手动停止),都会无限次尝试重启。 (除非使用 docker stop 停止容器,否则会一直重启) |
on-failure |
仅在容器以非零状态码退出 时重启。 可指定最大重试次数(如 on-failure:3 表示最多尝试重启3次)。 |
unless-stopped |
类似 always ,但如果容器被手动停止 (docker stop ),则不会自动重启,直到 Docker 服务重启(如宿主机重启后)。 |
使用示例
-
容器崩溃时自动重启(最多重试 3 次)
bashdocker run --restart=on-failure:3 my_app
-
始终自动重启(适合关键服务)
bashdocker run --restart=always nginx
-
除非手动停止,否则自动重启
bashdocker run --restart=unless-stopped mysql
1. 总是自动重启
bash
docker run -d --restart always nginx
- 场景 :需要容器始终保持运行,即使被手动停止(除非显式执行
docker stop
)。 - 注意:如果容器因错误退出(如内部崩溃),会无限重启。
2. 仅在失败时重启
bash
docker run -d --restart on-failure:5 my_app
- 场景:容器正常退出时(如任务完成)无需重启,仅在崩溃(非零退出码)时重启。
on-failure:5
表示最多尝试重启5次,超过后不再重启。
3. 除非手动停止,否则重启
bash
docker run -d --restart unless-stopped redis
- 场景:容器需要长期运行,但允许手动停止后不再重启(除非宿主机重启)。
- 行为 :
- 如果手动执行
docker stop
,容器停止且不会自动重启。 - 如果宿主机重启,Docker 服务启动后,容器会自动重启。
- 如果手动执行
注意事项
-
手动停止的优先级:
- 如果使用
docker stop
停止容器,always
和unless-stopped
策略会暂停重启 ,但unless-stopped
在宿主机重启后恢复。 on-failure
不会因手动停止触发重启。
- 如果使用
-
退出状态码:
on-failure
仅在容器进程返回非零退出码 时生效。例如:- 程序崩溃(非零码) → 触发重启。
- 正常退出(退出码0) → 不重启。
-
Docker 服务重启:
always
和unless-stopped
策略的容器会在 Docker 服务重启(如宿主机重启)后自动启动。
-
查看重启策略:
bashdocker inspect --format='{{.HostConfig.RestartPolicy.Name}}' <容器名>
常见问题
-
如何查看容器的重启策略?
bashdocker inspect --format='{{.HostConfig.RestartPolicy.Name}}' 容器名
-
为什么
always
策略的容器被手动停止后仍会重启?如果 Docker 服务(守护进程)重启,或者宿主机重启,
always
策略的容器会被重新启动。若需避免此行为,改用unless-stopped
。 -
如何诊断容器频繁重启的问题?
- 查看容器日志:
docker logs 容器名
- 检查容器退出状态码:
docker inspect 容器名
(关注State.ExitCode
)
- 查看容器日志:
总结
策略 | 适用场景 | 手动停止后的行为 |
---|---|---|
no |
临时任务或测试容器 | 停止后不再启动 |
always |
必须持续运行的服务(如 Web 服务器) | 手动停止后仍会重启 |
on-failure |
需要容错的后台服务(如定时任务) | 手动停止后不会重启 |
unless-stopped |
长期运行且允许手动暂停的服务(如数据库) | 手动停止后需宿主机重启才会恢复 |
docker run
的 --restart
参数用于定义容器的自动重启策略,确保容器在意外退出或系统故障后自动恢复。以下是详细说明和示例:
参数取值及行为
策略值 | 行为说明 |
---|---|
no (默认) |
容器退出后不自动重启。 |
on-failure |
仅在容器非正常退出(退出码非0)时自动重启,适合批处理任务或临时服务。 |
always |
无论退出码是什么,容器都会自动重启,适合长期运行的服务(如 Web 服务器)。 |
unless-stopped |
始终重启容器,除非显式执行 docker stop 或 docker rm 。 |
使用示例
-
始终自动重启容器(如 Web 服务)
bashdocker run -d --restart always nginx
- 无论容器因何退出(如配置错误、崩溃),都会自动重启。
-
仅在容器异常退出时重启(如批处理任务)
bashdocker run --restart on-failure:5 my-script.sh
:5
表示最多重启5次,超过后不再尝试。
-
后台运行并设置重启策略(如数据库)
bashdocker run -d --name my-db --restart unless-stopped postgres
- 容器会随 Docker 服务启动而自动运行,除非手动停止。
注意事项
-
重启策略生效条件:
- 容器必须是通过
docker run
启动的。 - 如果容器被
docker stop
或docker rm
显式停止,unless-stopped
策略不会触发重启。
- 容器必须是通过
-
资源消耗风险:
- 避免为可能频繁崩溃的容器设置
always
,可能导致系统资源耗尽。
- 避免为可能频繁崩溃的容器设置
-
查看当前策略:
bashdocker inspect <容器ID> --format='{{.HostConfig.RestartPolicy.Name}}'
完整命令示例
启动一个自动重启的 Redis 服务,并限制最大重启次数:
bash
docker run -d \
--name redis-server \
--restart on-failure:10 \
redis
- 容器最多自动重启10次,若仍失败则停止。
通过合理配置 --restart
,可以显著提升容器的健壮性和可用性。
以下是关于 Docker --restart
参数的详细说明,结合知识库中的信息整理而成:
1. 参数作用
--restart
是 docker run
命令中的一个选项,用于设置容器的重启策略 ,控制容器在退出后的自动重启行为。
Docker 守护进程会根据策略决定是否在容器退出时自动重启它。
2. 支持的策略类型
Docker 支持以下四种重启策略(来自知识库条目[1][4][7]):
策略 | 描述 |
---|---|
no | 默认策略。容器退出时,不会自动重启。 |
on-failure | 容器退出状态码非 0 时自动重启。可指定最大重试次数(如 on-failure:3 )。 |
always | 无论退出状态码如何,容器退出时总会自动重启。 |
unless-stopped | 与 always 类似,但排除了一种情况:如果容器是通过 docker stop 或 docker restart 手动停止的,则不会自动重启。 |
3. 使用示例
(1) 启动容器时设置重启策略
bash
# 使用 always 策略(总是重启)
docker run --restart=always -d nginx
# 使用 on-failure 策略并指定最大重试次数
docker run --restart=on-failure:3 -d my_app
# 使用 unless-stopped 策略
docker run --restart=unless-stopped -d mysql
(2) 修改已运行容器的重启策略
如果容器已经启动,可以通过 docker update
命令修改策略(来自知识库条目[1][2][4]):
bash
# 将容器 my_container 的策略改为 always
docker update --restart=always my_container
4. 关键注意事项
-
适用场景:
always
:适用于需要持续运行的服务(如数据库、Web 服务器)。on-failure
:适用于需要避免因错误退出导致服务中断的场景(如应用崩溃)。unless-stopped
:适合希望容器始终保持运行,除非手动停止的情况。
-
限制条件(来自知识库条目[2][5][7]):
- 需后台运行 :
--restart
仅对 后台模式(-d) 的容器生效,不能与--rm
参数同时使用。 - 成功启动后生效:重启策略仅在容器成功启动(至少运行 10 秒)后生效,否则可能触发无限重启循环。
- Docker 守护进程重启 :若 Docker 守护进程本身重启,所有设置了
always
或unless-stopped
的容器会自动重启。
- 需后台运行 :
-
退出状态码:
0
:正常退出,不会触发on-failure
策略。- 非
0
:表示异常退出,触发on-failure
策略。 - 特殊状态码(如
125
、126
、127
)通常与容器启动失败相关,可能不会触发重启(需结合具体场景)。
5. 实际场景示例
场景 1:确保容器始终运行
bash
# 启动 Nginx 容器并设置 always 策略
docker run --restart=always -d -p 80:80 --name webserver nginx
- 即使主机重启或容器意外退出,Docker 会自动重启该容器。
场景 2:条件性重启
bash
# 启动应用容器,仅在非正常退出时重启,最多尝试 3 次
docker run --restart=on-failure:3 -d my_app
- 若容器因代码错误(状态码非
0
)退出,会尝试重启最多 3 次。
场景 3:手动停止后不自动重启
bash
# 使用 unless-stopped 策略
docker run --restart=unless-stopped -d mysql
- 正常退出时会自动重启,但若手动执行
docker stop mysql
,则即使 Docker 守护进程重启,容器也不会自动启动。
6. 验证策略设置
查看容器的重启策略
bash
# 方法 1:通过 docker inspect
docker inspect --format='{{.HostConfig.RestartPolicy}}' <容器名/ID>
# 方法 2:通过 docker ps(显示简要信息)
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.RestartStatus}}"
7. 其他相关命令
-
停止容器 :
bashdocker stop <容器名/ID> # 平稳停止 docker kill <容器名/ID> # 强制停止(状态码非 0,可能触发 on-failure)
-
删除容器 :
bashdocker rm <容器名/ID> # 需先停止容器 docker rm -f <容器名/ID> # 强制删除(即使正在运行)
总结
通过 --restart
参数,可以灵活控制容器的自动重启行为,确保关键服务的高可用性。根据实际需求选择策略,并注意其限制条件(如后台模式、状态码判断)。更多高级用法(如结合 docker-compose
)可参考知识库中的配置示例。
docker run --restart
选项用于指定容器的重启策略,当容器退出时,Docker 守护进程会根据指定的策略来决定是否重启容器。这在保证容器持续运行、提高应用的可用性方面非常有用。以下是 --restart
支持的几种策略及其详细介绍:
no
- 含义:默认策略,容器退出时,Docker 不会自动重启该容器。
- 示例:
bash
docker run --restart=no nginx
on-failure[:max-retries]
- 含义 :仅在容器以非零退出状态码退出时才会自动重启。可以选择性地指定
max-retries
参数,用于限制 Docker 尝试重启容器的最大次数。 - 示例:
bash
# 容器以非零状态码退出时自动重启,最多尝试重启 3 次
docker run --restart=on-failure:3 nginx
always
- 含义:无论容器以何种状态退出(正常退出或异常退出),Docker 都会自动重启该容器。即使 Docker 守护进程重启,之前处于运行状态的容器也会在守护进程启动后自动重启。
- 示例:
bash
docker run --restart=always nginx
unless-stopped
- 含义 :与
always
类似,无论容器以何种状态退出都会自动重启。不同之处在于,如果在 Docker 守护进程停止之前,用户手动停止了容器,那么在守护进程重启后,该容器不会自动重启。 - 示例:
bash
docker run --restart=unless-stopped nginx
在实际应用中,你可以根据容器运行的应用特性和需求来选择合适的重启策略。例如,对于一些关键的服务,如数据库、Web 服务器等,可以选择 always
或 unless-stopped
策略,以确保服务的高可用性;对于一些一次性任务的容器,则可以选择 no
策略。
docker run
命令中的 --restart
选项用于指定容器的重启策略,确保容器在退出时能够按照指定的策略自动重启。以下是一些常用的重启策略及其说明:
常用的重启策略
策略 | 说明 |
---|---|
no |
默认值,表示容器退出时,Docker 不自动重启容器。 |
on-failure |
当容器非正常退出时(退出状态码不为 0),Docker 会自动重启容器。 |
on-failure:n |
当容器非正常退出时重启容器,并且最多重启 n 次。 |
always |
无论容器退出状态如何,只要容器退出就自动重启。 |
unless-stopped |
容器退出时自动重启,但不会重启那些 Docker 守护进程启动时已经停止的容器。 |
使用示例
-
总是重启容器
bashdocker run --restart always nginx
这会确保 Nginx 容器在退出后会自动重启。
-
仅在异常退出时重启
bashdocker run --restart on-failure:3 nginx
容器在非正常退出时最多重启 3 次。
-
除非手动停止,否则总是重启
bashdocker run --restart unless-stopped nginx
这种策略在生产环境中非常实用,因为它会自动重启容器,除非是手动停止的。
查看容器重启次数
可以使用以下命令查看容器的重启次数:
bash
docker inspect -f "{{ .RestartCount }}" <container_id_or_name>
查看容器最后一次启动时间
可以使用以下命令查看容器最后一次的启动时间:
bash
docker inspect -f "{{ .State.StartedAt }}" <container_id_or_name>
更新现有容器的重启策略
对于已经创建的容器,可以使用 docker update
命令来修改其重启策略:
bash
docker update --restart unless-stopped <container_id_or_name>
这些策略和命令可以帮助你根据实际需求灵活地管理容器的重启行为,确保容器化应用的高可用性和稳定性。
docker run --restart
参数用于设置容器的重启策略。当容器因为某些原因停止运行时,Docker 可以根据这个策略自动重启容器。以下是 --restart
参数的几种设置方式及其含义:
--restart
参数的设置
-
no(默认值)
- 容器退出时不重启。
-
on-failure
- 当容器非正常退出(即退出状态码非0)时,会根据指定的次数尝试重启。
- 可以与一个可选的重启次数参数一起使用,例如
--restart=on-failure:3
,表示最多重启3次。
-
always
- 无论容器退出状态码是什么,总是尝试重启容器。
- 即使 Docker 服务重启,也会自动重启该容器。
-
unless-stopped
- 类似于
always
,但有一些例外:- 如果容器被手动停止(使用
docker stop
),则不会自动重启。 - 如果 Docker 服务重启,会自动重启该容器。
- 如果容器被手动停止(使用
- 类似于
示例
-
总是重启容器
bashdocker run --restart always --name my-container nginx
-
在失败时重启容器,最多重启3次
bashdocker run --restart on-failure:3 --name my-container my-image
-
除非手动停止,否则总是重启容器
bashdocker run --restart unless-stopped --name my-container my-image
注意事项
- 设置
--restart
参数时,需要考虑业务需求和系统资源,避免因频繁重启导致资源浪费或服务不稳定。 - 在生产环境中,合理配置重启策略可以提高系统的可用性和稳定性。
通过合理使用 --restart
参数,可以确保容器在遇到问题时能够自动恢复,从而提高系统的健壮性。
Docker的docker run --restart
参数用于配置容器的自动重启策略。这个功能在容器意外退出时非常有用,可以帮助保持服务的持续可用性。以下是详细说明:
参数格式
bash
docker run --restart <策略类型> [其他参数] <镜像名>
重启策略类型
-
no
(默认)- 不自动重启容器
- 示例:
docker run --restart no nginx
-
on-failure[:max-retries]
-
当容器以非0状态码退出时自动重启
-
可选的
:max-retries
指定最大重试次数(需Docker 1.11+) -
示例:
bashdocker run --restart on-failure:5 my-app
-
-
always
-
无条件自动重启(无论退出状态码如何)
-
注意:如果容器被手动停止(
docker stop
),则不会自动重启 -
示例:
bashdocker run --restart always redis
-
-
unless-stopped
-
类似
always
,但排除手动停止的情况 -
如果容器是手动停止的,即使Docker守护进程重启,容器也不会自动启动
-
示例:
bashdocker run --restart unless-stopped mysql
-
典型应用场景
-
关键服务保活
使用
always
或unless-stopped
确保数据库、Web服务器等高优先级服务持续运行。 -
调试任务
对可能崩溃的调试程序使用
on-failure
策略,避免无限重启干扰日志分析。 -
定时任务容器
对执行一次性任务的容器保持默认
no
策略。
注意事项
-
与Docker守护进程的关系
自动重启策略依赖Docker守护进程(
dockerd
)的运行。若守护进程停止,所有重启策略将暂停,直到守护进程恢复。 -
手动停止优先级
使用
docker stop
命令停止的容器会忽略always
策略,但unless-stopped
会记住最后一次停止状态。 -
无限重启风险
如果容器因配置错误立即退出,可能触发重启循环。可通过
docker inspect
查看退出原因。
补充:在Docker Compose中配置
在docker-compose.yml
中通过restart
字段指定策略:
yaml
services:
web:
image: nginx
restart: unless-stopped
通过合理选择重启策略,可以显著提升容器化服务的健壮性。建议根据实际需求选择最匹配的策略类型。
Docker run --restart
参数详解
一、重启策略类型及适用场景
--restart
参数用于定义容器退出时的自动重启策略,是 Docker 生产环境中管理容器稳定性的重要选项。以下是支持的策略类型及说明:
-
no
• 默认策略 ,容器退出时 不自动重启 。
• 适用场景:临时测试容器或需手动控制的场景。
• 示例:
docker run --restart=no nginx
-
on-failure[:max-retries]
• 异常退出时重启 :仅在容器以 非0状态码退出 时触发重启(如程序崩溃)。
• 可指定最大重试次数(如
on-failure:3
),超过次数则放弃重启。• 适用场景:需自动恢复关键服务但避免无限重启的故障场景。
• 示例:
docker run --restart=on-failure:5 myapp
-
always
• 无条件重启 :无论退出状态码如何,容器退出后 总是自动重启 (包括手动停止后重启 Docker 守护进程的情况)。
• 注意:若宿主机重启,容器会在 Docker 服务启动后自动重启。
• 适用场景:需长期运行且需高可用的服务(如 Web 服务器)。
• 示例:
docker run -d --restart=always mysql
-
unless-stopped
• 智能重启 :容器退出时自动重启,但 排除手动停止的情况 (若手动停止容器后重启 Docker 守护进程,该容器不会自动启动)。
• 适用场景:需自动恢复服务,但允许手动干预停止的场景。
• 示例:
docker run --restart=unless-stopped redis
二、退出状态码与策略关联
Docker 根据容器的 退出状态码 决定是否触发重启策略:
• 0 :正常退出,仅 always
和 unless-stopped
会重启。
• 非0 :异常退出,触发 on-failure
和 always
/unless-stopped
策略。
• 特殊状态码 :
• 125 :Docker 守护进程自身错误(如镜像不存在)。
• 126 :容器启动命令无法执行。
• 127:启动命令不存在。
三、配置方法与操作示例
-
启动时指定策略
bashdocker run -d --restart=always --name=my_nginx nginx
-
更新已运行容器的策略
若容器未设置
--restart
,可通过docker update
修改:bashdocker update --restart=unless-stopped my_nginx
-
查看重启状态
• 查看重启次数:
docker inspect -f "{``{ .RestartCount }}" my_nginx
• 查看最后一次启动时间:
docker inspect -f "{``{ .State.StartedAt }}" my_nginx
四、注意事项
- 与
--rm
的冲突 :--restart
不能与--rm
(退出后自动删除容器)同时使用。 - 资源限制 :频繁重启可能占用过多资源,建议配合
--memory
和--cpus
限制资源。 - 日志监控 :长期运行容器需监控日志,避免因无限重启导致日志堆积(可通过
--log-opt
限制日志大小)。
五、典型场景对比
场景 | 推荐策略 | 理由 |
---|---|---|
数据库服务(如 MySQL) | always |
需持续运行,即使宿主机重启也需自动恢复 |
批处理任务 | on-failure:3 |
任务失败时重试,但避免无限循环 |
开发环境临时容器 | no |
手动控制生命周期,避免干扰开发流程 |
需手动干预的后台服务 | unless-stopped |
自动恢复服务,同时允许手动停止 |
通过合理配置 --restart
,可显著提升容器服务的可靠性。建议结合监控工具(如 Prometheus)进一步优化运维流程。
Docker 的 --restart
参数用于设置容器的自动重启策略,控制容器在退出或 Docker 守护进程重启时的行为。以下是详细说明:
可用策略
-
no
(默认)容器退出时不自动重启,且 Docker 守护进程重启时也不会启动容器。
-
always
容器退出时总是重启,并且 Docker 守护进程重启时也会启动容器。
bashdocker run --restart always -d nginx
-
unless-stopped
类似
always
,但若容器被手动停止过,则即使 Docker 重启也不会自动启动。bashdocker run --restart unless-stopped -d mysql
-
on-failure
仅当容器退出码非
0
(即异常退出)时重启。可指定最大重试次数(可选)。bash# 退出码非0时最多重启3次 docker run --restart on-failure:3 -d my-app
注意事项
-
策略仅对容器退出 或Docker 守护进程重启时生效,不适用于手动停止的容器。
-
若容器通过
--rm
参数运行,--restart
将被忽略。 -
已运行容器可通过
docker update
修改重启策略:bashdocker update --restart=always 容器ID/名称
示例
-
关键服务(如数据库)自动恢复:
bashdocker run --restart unless-stopped -d postgres
-
仅在失败时重启:
bashdocker run --restart on-failure:5 -d my-flaky-service
需要进一步解释或具体场景的应用吗?