docker run --restart no,always,on-failure,unless-stopped 笔记250406
 
docker run --restart 用于配置容器的自动重启策略,当容器意外退出时,Docker 会根据策略自动重新启动容器。这是确保服务高可用的重要参数。
语法
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 次)
docker run --restart=on-failure:3 my_app -  
始终自动重启(适合关键服务)
docker run --restart=always nginx -  
除非手动停止,否则自动重启
docker run --restart=unless-stopped mysql 
1. 总是自动重启
docker run -d --restart always nginx
 
- 场景:需要容器始终保持运行,即使被手动停止(除非显式执行 
docker stop)。 - 注意:如果容器因错误退出(如内部崩溃),会无限重启。
 
2. 仅在失败时重启
docker run -d --restart on-failure:5 my_app
 
- 场景:容器正常退出时(如任务完成)无需重启,仅在崩溃(非零退出码)时重启。
 on-failure:5表示最多尝试重启5次,超过后不再重启。
3. 除非手动停止,否则重启
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 服务重启(如宿主机重启)后自动启动。
 -  
查看重启策略:
docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' <容器名> 
常见问题
-  
如何查看容器的重启策略?
docker 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 服务)
docker run -d --restart always nginx- 无论容器因何退出(如配置错误、崩溃),都会自动重启。
 
 -  
仅在容器异常退出时重启(如批处理任务)
docker run --restart on-failure:5 my-script.sh:5表示最多重启5次,超过后不再尝试。
 -  
后台运行并设置重启策略(如数据库)
docker run -d --name my-db --restart unless-stopped postgres- 容器会随 Docker 服务启动而自动运行,除非手动停止。
 
 
注意事项
-  
重启策略生效条件:
- 容器必须是通过 
docker run启动的。 - 如果容器被 
docker stop或docker rm显式停止,unless-stopped策略不会触发重启。 
 - 容器必须是通过 
 -  
资源消耗风险:
- 避免为可能频繁崩溃的容器设置 
always,可能导致系统资源耗尽。 
 - 避免为可能频繁崩溃的容器设置 
 -  
查看当前策略:
docker inspect <容器ID> --format='{{.HostConfig.RestartPolicy.Name}}' 
完整命令示例
启动一个自动重启的 Redis 服务,并限制最大重启次数:
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) 启动容器时设置重启策略
# 使用 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]):
# 将容器 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:确保容器始终运行
# 启动 Nginx 容器并设置 always 策略
docker run --restart=always -d -p 80:80 --name webserver nginx
 
- 即使主机重启或容器意外退出,Docker 会自动重启该容器。
 
场景 2:条件性重启
# 启动应用容器,仅在非正常退出时重启,最多尝试 3 次
docker run --restart=on-failure:3 -d my_app
 
- 若容器因代码错误(状态码非 
0)退出,会尝试重启最多 3 次。 
场景 3:手动停止后不自动重启
# 使用 unless-stopped 策略
docker run --restart=unless-stopped -d mysql
 
- 正常退出时会自动重启,但若手动执行 
docker stop mysql,则即使 Docker 守护进程重启,容器也不会自动启动。 
6. 验证策略设置
查看容器的重启策略
# 方法 1:通过 docker inspect
docker inspect --format='{{.HostConfig.RestartPolicy}}' <容器名/ID># 方法 2:通过 docker ps(显示简要信息)
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.RestartStatus}}"
 
7. 其他相关命令
- 停止容器:
docker stop <容器名/ID> # 平稳停止 docker kill <容器名/ID> # 强制停止(状态码非 0,可能触发 on-failure) - 删除容器:
docker rm <容器名/ID> # 需先停止容器 docker rm -f <容器名/ID> # 强制删除(即使正在运行) 
总结
通过 --restart 参数,可以灵活控制容器的自动重启行为,确保关键服务的高可用性。根据实际需求选择策略,并注意其限制条件(如后台模式、状态码判断)。更多高级用法(如结合 docker-compose)可参考知识库中的配置示例。
docker run --restart 选项用于指定容器的重启策略,当容器退出时,Docker 守护进程会根据指定的策略来决定是否重启容器。这在保证容器持续运行、提高应用的可用性方面非常有用。以下是 --restart 支持的几种策略及其详细介绍:
no
- 含义:默认策略,容器退出时,Docker 不会自动重启该容器。
 - 示例:
 
docker run --restart=no nginx
 
on-failure[:max-retries]
- 含义:仅在容器以非零退出状态码退出时才会自动重启。可以选择性地指定 
max-retries参数,用于限制 Docker 尝试重启容器的最大次数。 - 示例:
 
# 容器以非零状态码退出时自动重启,最多尝试重启 3 次
docker run --restart=on-failure:3 nginx
 
always
- 含义:无论容器以何种状态退出(正常退出或异常退出),Docker 都会自动重启该容器。即使 Docker 守护进程重启,之前处于运行状态的容器也会在守护进程启动后自动重启。
 - 示例:
 
docker run --restart=always nginx
 
unless-stopped
- 含义:与 
always类似,无论容器以何种状态退出都会自动重启。不同之处在于,如果在 Docker 守护进程停止之前,用户手动停止了容器,那么在守护进程重启后,该容器不会自动重启。 - 示例:
 
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 守护进程启动时已经停止的容器。 | 
使用示例
-  
总是重启容器
docker run --restart always nginx这会确保 Nginx 容器在退出后会自动重启。
 -  
仅在异常退出时重启
docker run --restart on-failure:3 nginx容器在非正常退出时最多重启 3 次。
 -  
除非手动停止,否则总是重启
docker run --restart unless-stopped nginx这种策略在生产环境中非常实用,因为它会自动重启容器,除非是手动停止的。
 
查看容器重启次数
可以使用以下命令查看容器的重启次数:
docker inspect -f "{{ .RestartCount }}" <container_id_or_name>
 
查看容器最后一次启动时间
可以使用以下命令查看容器最后一次的启动时间:
docker inspect -f "{{ .State.StartedAt }}" <container_id_or_name>
 
更新现有容器的重启策略
对于已经创建的容器,可以使用 docker update 命令来修改其重启策略:
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 服务重启,会自动重启该容器。
 
 - 如果容器被手动停止(使用 
 
 - 类似于 
 
示例
-  
总是重启容器
docker run --restart always --name my-container nginx -  
在失败时重启容器,最多重启3次
docker run --restart on-failure:3 --name my-container my-image -  
除非手动停止,否则总是重启容器
docker run --restart unless-stopped --name my-container my-image 
注意事项
- 设置 
--restart参数时,需要考虑业务需求和系统资源,避免因频繁重启导致资源浪费或服务不稳定。 - 在生产环境中,合理配置重启策略可以提高系统的可用性和稳定性。
 
通过合理使用 --restart 参数,可以确保容器在遇到问题时能够自动恢复,从而提高系统的健壮性。
Docker的docker run --restart参数用于配置容器的自动重启策略。这个功能在容器意外退出时非常有用,可以帮助保持服务的持续可用性。以下是详细说明:
参数格式
docker run --restart <策略类型> [其他参数] <镜像名>
 
重启策略类型
-  
no(默认)- 不自动重启容器
 - 示例:
docker run --restart no nginx 
 -  
on-failure[:max-retries]- 当容器以非0状态码退出时自动重启
 - 可选的
:max-retries指定最大重试次数(需Docker 1.11+) - 示例:
docker run --restart on-failure:5 my-app 
 -  
always- 无条件自动重启(无论退出状态码如何)
 - 注意:如果容器被手动停止(
docker stop),则不会自动重启 - 示例:
docker run --restart always redis 
 -  
unless-stopped- 类似
always,但排除手动停止的情况 - 如果容器是手动停止的,即使Docker守护进程重启,容器也不会自动启动
 - 示例:
docker 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字段指定策略:
services:web:image: nginxrestart: 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:启动命令不存在。
三、配置方法与操作示例
-  
启动时指定策略
docker run -d --restart=always --name=my_nginx nginx -  
更新已运行容器的策略
若容器未设置--restart,可通过docker update修改:docker 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 守护进程重启时也会启动容器。docker run --restart always -d nginx -  
unless-stopped
类似always,但若容器被手动停止过,则即使 Docker 重启也不会自动启动。docker run --restart unless-stopped -d mysql -  
on-failure
仅当容器退出码非0(即异常退出)时重启。可指定最大重试次数(可选)。# 退出码非0时最多重启3次 docker run --restart on-failure:3 -d my-app 
注意事项
- 策略仅对容器退出或Docker 守护进程重启时生效,不适用于手动停止的容器。
 - 若容器通过 
--rm参数运行,--restart将被忽略。 - 已运行容器可通过 
docker update修改重启策略:docker update --restart=always 容器ID/名称 
示例
-  
关键服务(如数据库)自动恢复:
docker run --restart unless-stopped -d postgres -  
仅在失败时重启:
docker run --restart on-failure:5 -d my-flaky-service 
需要进一步解释或具体场景的应用吗?
docker的run命令 笔记250406
