指南/如何停止Docker容器
如何在Mac上停止Docker容器,停止一个或全部
简要回答
要停止一个Docker容器,运行docker stop加它的名称或ID;docker ps会列出它们。要停止所有正在运行的容器,运行docker stop $(docker ps -q)。在Compose项目中,docker compose stop会停止它的容器,docker compose down还会移除它们。docker stop会请容器关闭,10秒后强制关闭。会自己回来的容器设有重启策略;用docker update --restart=no把它关掉。Vitals是一款Mac系统监控工具,能从菜单栏停止容器:它的“容器”列表显示每个容器的内存,询问后一键即可停止。
如何在“终端”中停止Docker容器
- 01 运行
docker ps列出正在运行的容器及其名称和ID。 - 02 用
docker stop加名称停止一个容器,例如docker stop web-1。一条命令中可以指定多个。 - 03 用
docker stop $(docker ps -q)停止所有正在运行的容器。docker ps -q只输出ID,docker stop会接收所有这些ID。 - 04 对于Compose项目,在它的文件夹中运行
docker compose stop停止它的服务,或者运行docker compose down停止服务并移除容器和项目的网络。除非加上-v,否则卷会保留。 - 05 再运行一次
docker ps。仍在列表中的容器还在关闭过程中,过一会儿又回来的容器则设有重启策略。
当docker命令指向OrbStack、Colima和Rancher Desktop时,同样的命令也适用。Podman有podman stop,podman stop -a会停止全部容器。
停止容器会结束它的进程,其他一切(文件、设置和卷)都会保留,随时可用docker start再次启动。所以,要从不用的容器那里收回内存和CPU,这是安全的做法。下表把它和人们常一并想到的几条命令做了比较。
docker stop、kill、pause、rm与compose down
| 命令 | 作用 | 适用情况 |
|---|---|---|
| docker stop | 发送SIGTERM,10秒后发送SIGKILL | 几乎所有情况:App可以写完数据并关闭连接 |
| docker kill | 立即发送SIGKILL | 容器不理会docker stop |
| docker pause | 冻结进程,进程保留各自的内存 | 你想暂时收回CPU,而不是内存 |
| docker rm | 移除已停止的容器,加上-f可移除正在运行的容器 | 你不再需要它了;命名卷会保留 |
| docker compose stop | 停止项目的容器并保留它们 | 你很快会再次启动同一个项目 |
| docker compose down | 停止并移除容器和网络 | 你想下次从头开始;加上-v可同时移除卷 |
已停止的容器为什么又启动了
设有重启策略的容器会被Docker重新启动。使用always时,你停止的容器会在下次Docker Desktop启动时回来,所以昨天停掉的容器在重启后又在运行了。使用unless-stopped时,你停止的容器会保持停止。Compose文件常常给数据库和缓存设置restart: always。
要查看容器的策略,运行docker inspect --format '{{.HostConfig.RestartPolicy.Name}}'加它的名称。要关闭它,运行docker update --restart=no加名称,或者更改Compose文件中的restart:。
docker stop为什么要等10秒
docker stop发送SIGTERM后,会等待容器的主进程退出。不理会这个信号的进程(通常是没有把信号传下去的shell脚本)会让停止操作拖满10秒,直到Docker将它强行结束。docker stop -t 2可以缩短等待时间。修正镜像能让它立即停止:在entrypoint脚本中用exec启动App,或者在Compose中给服务设置init: true。
停止容器,并收回内存
在Mac上,容器在一个Linux虚拟机里运行。停止容器会释放它们在虚拟机内部的内存,但虚拟机可能仍占着这些内存,所以活动监视器中的Virtual Machine Service for Docker可能依然很大。Resource Saver或退出Docker Desktop,才会把内存还给macOS;相关设置请参阅Docker占用内存过多。
不用“终端”停止容器
Docker Desktop的Containers视图在每个容器和每个Compose项目上都有Stop按钮。它在Docker Desktop的窗口里,所以要打开App才能用。Captain这类菜单栏App会在菜单栏图标下列出容器,每个都能启动和停止。Vitals在它的菜单栏中也能做到,还加上了它们都不显示的内容:每个容器用了多少内存和CPU,让你知道该停哪一个。
Vitals能多做什么
Vitals能从Mac的菜单栏停止容器,内存占用一目了然。
- 下拉面板中的“容器”列表:每个正在运行的容器,附上它的Compose项目、镜像和一条内存条
- 指向某个容器,点按出现的×。这一行会先询问,然后像
docker stop那样停止它,给它10秒钟关闭 - 在窗口的“容器”标签页中,选中多个并按住Control键点按,即可一起停止;或者按住Control键点按某个Compose项目,选取“全部停止”
- 每个容器的内存、CPU、网络、磁盘和已发布的端口,支持Docker Desktop、OrbStack、Colima、Rancher Desktop和Podman
须知
- Vitals在停止任何东西之前都会先询问,而且从不启动、移除或更改容器。
- 设有重启策略的容器可能会被它的引擎重新启动。窗口在询问时会说明这一点。
- 如果引擎拒绝或没有响应,这一行会显示容器仍在运行。
- “容器”列表在有引擎运行时显示。
常见问题
如何一次停止所有Docker容器?
运行docker stop $(docker ps -q)。它会列出所有正在运行的容器的ID,并逐个停止。在Vitals中,在“容器”标签页中选中它们,按住Control键点按即可一起停止。
docker stop和docker kill有什么区别?
docker stop发送SIGTERM,最多等待10秒,然后用SIGKILL强制结束容器。docker kill立即发送SIGKILL,所以App没有机会写完数据或关闭连接。
docker compose stop和down有什么区别?
docker compose stop停止容器并保留它们,随时可用docker compose start再次启动。docker compose down停止它们,并移除容器和项目的网络;除非加上-v,否则卷会保留。
为什么我停止Docker容器后它又启动了?
它的重启策略是always,所以Docker Desktop启动时Docker会再次启动它。运行docker update --restart=no加它的名称,或者更改Compose文件中的restart:。
停止容器会删除它的数据吗?
不会。已停止的容器会保留它的文件和卷,docker start可以再次运行它。docker rm会移除容器;命名卷会一直保留,直到你移除它们。
可以从Mac菜单栏停止Docker容器吗?
可以,用Vitals。它的菜单栏下拉面板会列出正在运行的容器及其内存,询问后一键即可停止某个容器。它支持Docker Desktop、OrbStack、Colima、Rancher Desktop和Podman。