指南/如何停止Docker容器

如何在Mac上停止Docker容器,停止一个或全部

Atta 🐬

Vitals创始人

发布于

简要回答

要停止一个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容器

  1. 01 运行docker ps列出正在运行的容器及其名称和ID。
  2. 02 用docker stop加名称停止一个容器,例如docker stop web-1。一条命令中可以指定多个。
  3. 03 用docker stop $(docker ps -q)停止所有正在运行的容器。docker ps -q只输出ID,docker stop会接收所有这些ID。
  4. 04 对于Compose项目,在它的文件夹中运行docker compose stop停止它的服务,或者运行docker compose down停止服务并移除容器和项目的网络。除非加上-v,否则卷会保留。
  5. 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在停止任何东西之前都会先询问,而且从不启动、移除或更改容器。
  • 设有重启策略的容器可能会被它的引擎重新启动。窗口在询问时会说明这一点。
  • 如果引擎拒绝或没有响应,这一行会显示容器仍在运行。
  • “容器”列表在有引擎运行时显示。
购买Vitals $9 首发期$9,之后$29。14天内可退款。

常见问题

如何一次停止所有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。

术语表中的相关条目

更多指南