docker run --restart no,always,on-failure,unless-stopped
笔记250406docker run --restart
用于配置容器的自动重启策略,当容器意外退出时,Docker 会根据策略自动重新启动容器。这是确保服务高可用的重要参数。
语法
docker run --restart <策略> [其他参数] <镜像>
no
默认值,容器退出后不会自动重启。
on-failure[:max-retries]
:max-retries
指定最大重试次数(例如 on-failure:3
)。always
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
docker run -d --restart always nginx
docker stop
)。docker run -d --restart on-failure:5 my_app
on-failure:5
表示最多尝试重启5次,超过后不再重启。docker run -d --restart unless-stopped redis
docker stop
,容器停止且不会自动重启。注意事项
手动停止的优先级:
docker stop
停止容器,always
和 unless-stopped
策略会暂停重启,但 unless-stopped
在宿主机重启后恢复。on-failure
不会因手动停止触发重启。退出状态码:
on-failure
仅在容器进程返回非零退出码时生效。例如:
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 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
通过合理配置 --restart
,可以显著提升容器的健壮性和可用性。
以下是关于 Docker --restart
参数的详细说明,结合知识库中的信息整理而成:
--restart
是 docker run
命令中的一个选项,用于设置容器的重启策略,控制容器在退出后的自动重启行为。
Docker 守护进程会根据策略决定是否在容器退出时自动重启它。
Docker 支持以下四种重启策略(来自知识库条目[1][4][7]):
策略 | 描述 |
---|---|
no | 默认策略。容器退出时,不会自动重启。 |
on-failure | 容器退出状态码非 0 时自动重启。可指定最大重试次数(如 on-failure:3 )。 |
always | 无论退出状态码如何,容器退出时总会自动重启。 |
unless-stopped | 与 always 类似,但排除了一种情况:如果容器是通过 docker stop 或 docker restart 手动停止的,则不会自动重启。 |
# 使用 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
如果容器已经启动,可以通过 docker update
命令修改策略(来自知识库条目[1][2][4]):
# 将容器 my_container 的策略改为 always
docker update --restart=always my_container
适用场景:
always
:适用于需要持续运行的服务(如数据库、Web 服务器)。on-failure
:适用于需要避免因错误退出导致服务中断的场景(如应用崩溃)。unless-stopped
:适合希望容器始终保持运行,除非手动停止的情况。限制条件(来自知识库条目[2][5][7]):
--restart
仅对 后台模式(-d) 的容器生效,不能与 --rm
参数同时使用。always
或 unless-stopped
的容器会自动重启。退出状态码:
0
:正常退出,不会触发 on-failure
策略。0
:表示异常退出,触发 on-failure
策略。125
、126
、127
)通常与容器启动失败相关,可能不会触发重启(需结合具体场景)。# 启动 Nginx 容器并设置 always 策略
docker run --restart=always -d -p 80:80 --name webserver nginx
# 启动应用容器,仅在非正常退出时重启,最多尝试 3 次
docker run --restart=on-failure:3 -d my_app
0
)退出,会尝试重启最多 3 次。# 使用 unless-stopped 策略
docker run --restart=unless-stopped -d mysql
docker stop mysql
,则即使 Docker 守护进程重启,容器也不会自动启动。# 方法 1:通过 docker inspect
docker inspect --format='{{.HostConfig.RestartPolicy}}' <容器名/ID>
# 方法 2:通过 docker ps(显示简要信息)
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.RestartStatus}}"
docker stop <容器名/ID> # 平稳停止
docker kill <容器名/ID> # 强制停止(状态码非 0,可能触发 on-failure)
docker rm <容器名/ID> # 需先停止容器
docker rm -f <容器名/ID> # 强制删除(即使正在运行)
通过 --restart
参数,可以灵活控制容器的自动重启行为,确保关键服务的高可用性。根据实际需求选择策略,并注意其限制条件(如后台模式、状态码判断)。更多高级用法(如结合 docker-compose
)可参考知识库中的配置示例。
docker run --restart
选项用于指定容器的重启策略,当容器退出时,Docker 守护进程会根据指定的策略来决定是否重启容器。这在保证容器持续运行、提高应用的可用性方面非常有用。以下是 --restart
支持的几种策略及其详细介绍:
docker run --restart=no nginx
max-retries
参数,用于限制 Docker 尝试重启容器的最大次数。# 容器以非零状态码退出时自动重启,最多尝试重启 3 次
docker run --restart=on-failure:3 nginx
docker run --restart=always nginx
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
--restart=on-failure:3
,表示最多重启3次。always
unless-stopped
always
,但有一些例外:
docker stop
),则不会自动重启。总是重启容器
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]
: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 run --restart unless-stopped mysql
关键服务保活
使用always
或unless-stopped
确保数据库、Web服务器等高优先级服务持续运行。
调试任务
对可能崩溃的调试程序使用on-failure
策略,避免无限重启干扰日志分析。
定时任务容器
对执行一次性任务的容器保持默认no
策略。
与Docker守护进程的关系
自动重启策略依赖Docker守护进程(dockerd
)的运行。若守护进程停止,所有重启策略将暂停,直到守护进程恢复。
手动停止优先级
使用docker stop
命令停止的容器会忽略always
策略,但unless-stopped
会记住最后一次停止状态。
无限重启风险
如果容器因配置错误立即退出,可能触发重启循环。可通过docker inspect
查看退出原因。
在docker-compose.yml
中通过restart
字段指定策略:
services:
web:
image: nginx
restart: unless-stopped
通过合理选择重启策略,可以显著提升容器化服务的健壮性。建议根据实际需求选择最匹配的策略类型。
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
--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