一、问题现象
在使用 Docker Desktop 的时候,有些容器会在每次启动 Docker Desktop 后自动启动。
比如我本地有一个 JRebel License Server 容器:
bash jrebel-license-active-server
每次打开 Docker Desktop,它都会自动运行。
但是这个服务我并不是每次都需要用,所以希望它不要跟随 Docker Desktop 自动启动,而是在需要的时候手动启动。
二、为什么容器会自动启动?
Docker 容器是否会自动启动,主要取决于它的 Restart Policy,也就是容器的重启策略。
常见的重启策略有下面几种:
| 策略 | 含义 |
|---|---|
| no | 不自动重启,Docker 启动时也不会自动启动容器 |
| always | Docker 启动后自动启动容器,容器退出后也会自动重启 |
| unless-stopped | 除非手动停止,否则 Docker 启动后会自动启动容器 |
| on-failure | 只有容器异常退出时才自动重启 |
如果一个容器每次 Docker Desktop 启动后都会自动启动,大概率是因为它的重启策略被设置成了:
bash --restart=always
或者:
bash --restart=unless-stopped
三、查看当前容器的重启策略
可以使用下面的命令查看容器当前的重启策略:
bash docker inspect 容器名 --format '{{.HostConfig.RestartPolicy.Name}}'
例如查看 jrebel-license-active-server:
bash docker inspect jrebel-license-active-server --format '{{.HostConfig.RestartPolicy.Name}}'
如果输出是:
bash always
或者:
bash unless-stopped
说明这个容器会有自动启动的行为。
四、关闭容器自动启动
使用下面的命令,把容器的重启策略改成 no:
bash docker update --restart=no 容器名
例如:
bash docker update --restart=no jrebel-license-active-server
执行成功后,终端一般会返回容器名称:
bash jrebel-license-active-server
这就表示修改成功了。
五、验证是否修改成功
再次执行查看命令:
bash docker inspect jrebel-license-active-server --format '{{.HostConfig.RestartPolicy.Name}}'
如果输出是:
bash no
说明已经设置成功。
以后启动 Docker Desktop 时,这个容器就不会自动启动了。
六、以后需要用的时候如何手动启动?
关闭自动启动之后,并不是删除容器,只是让它不再跟随 Docker Desktop 自动启动。
需要用的时候,可以手动启动:
bash docker start jrebel-license-active-server
如果要停止它:
bash docker stop jrebel-license-active-server
七、Docker Desktop 图形界面怎么操作?
也可以在 Docker Desktop 里手动操作:
- 打开 Docker Desktop
- 进入左侧 Containers
- 找到对应容器
- 点击右侧蓝色三角形按钮启动
- 点击停止按钮即可停止容器
不过修改"是否自动启动"这种配置,用命令行更直接。
八、常用命令整理
查看所有容器
bash docker ps -a
查看正在运行的容器
bash docker ps
查看容器重启策略
bash docker inspect 容器名 --format '{{.HostConfig.RestartPolicy.Name}}'
关闭容器自启动
bash docker update --restart=no 容器名
设置容器自动启动
如果以后想恢复自动启动,可以执行:
bash docker update --restart=always 容器名
或者:
bash docker update --restart=unless-stopped 容器名
手动启动容器
bash docker start 容器名
手动停止容器
bash docker stop 容器名
九、多个容器批量关闭自启动
如果有多个容器都不想自动启动,可以分别执行:
bash docker update --restart=no jenkins docker update --restart=no redis-7.2 docker update --restart=no mysql-8.0.31 docker update --restart=no jrebel-license-active-server
不过需要注意:
像 MySQL、Redis、Jenkins 这种开发常用服务,如果经常使用,可以保留自动启动。
像 JRebel License Server 这种不是每次都需要用的服务,可以设置成不自动启动,需要时再手动启动。
十、实际案例
我这次遇到的问题是:
Docker Desktop 里有一个容器:
bash jrebel-license-active-server
每次启动 Docker Desktop 时,它可能会自动启动。
我执行了下面的命令:
bash docker update --restart=no jrebel-license-active-server
终端返回:
bash jrebel-license-active-server
说明修改成功。
然后可以用下面命令再次确认:
bash docker inspect jrebel-license-active-server --format '{{.HostConfig.RestartPolicy.Name}}'
如果结果是:
bash no
就表示以后 Docker Desktop 启动时,这个容器不会自动启动了。
十一、总结
Docker 容器是否会自动启动,主要看它的重启策略。
如果不希望容器跟随 Docker Desktop 自动启动,执行:
bash docker update --restart=no 容器名
如果想确认是否成功,执行:
bash docker inspect 容器名 --format '{{.HostConfig.RestartPolicy.Name}}'
输出为:
bash no
就说明设置成功。
以后需要使用该容器时,再手动启动即可:
bash docker start 容器名