使用 Docker 停止容器而不搞砸事情!

有困難停止 Docker 容器嗎? 找到正確的方法來停止容器在能夠創建許多不同容器的情況下是困難的。 在本文中,您將學習到停止容器或所有容器的 Docker 命令。

繼續閱讀以了解更多!

先決條件

要按照本教程進行操作,請確保您具備以下條件:

  • Windows 10 – 本教程使用 Windows 運行 Docker,但您也可以將相同的一般步驟應用於 Linux 或 macOS。
  • Docker Desktop – 本教程使用版本 3.5.2。 如果您使用的是 Linux,則可用 Docker 引擎,因為 GUI 不可用。
  • A running Docker container or containers.

使用 docker stop Containers 命令結束容器

讓我們從第一個命令開始:docker stop 容器命令以及它如何完成停止容器的任務。

例如,也許您需要停止名為 mystifying_hofstadter 且 ID 為 fb66ed502096 的正在運行的容器。 如下例所示,使用 docker stop 容器命令停止容器。

# 通過名稱停止容器
docker stop mystifying_hofstadter
# 通過ID停止容器(同一容器)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

如果您有多個運行中的容器,並且希望停止它們,則docker stop容器命令支持逐個停止多個容器ID。

首先,通過docker ps命令列出所有容器,並將容器ID傳遞給docker stop容器命令,如下所示。

# 列出所有運行中的容器
docker ps
# 通過容器ID停止以下Docker容器
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

如果您希望停止所有運行中的容器,而無需手動檢索容器ID並將其傳遞給docker stop,則docker ps -q命令將完成此操作。

# 創建三個容器。分號分隔每個命令
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# 列出所有運行中的容器
docker ps -q
# 檢索所有運行中的容器ID並將其傳遞給docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

上述的$(docker ps -q)構造在Linux上的Bash和Windows上的PowerShell中都是子表達式。子表達式指示shell先處理一組命令docker ps -q,然後將結果返回給原始命令docker stop

docker stop容器命令使用SIGTERM信號。Linux信號向進程通知事件,但進程決定如何對給定的信號做出反應。

使用SIGTERM信號時,Docker使用該信號優雅地停止進程,等待默認的10秒鐘,然後發送SIGKILL信號,立即終止進程。

使用進程信號停止容器

您了解到在停止容器時,使用docker stop容器命令時,Docker的默認行為(停止信號)。但您可能不希望使用默認行為,而是指示Docker使用替代的停止信號。

使用docker run命令的--stop-signal標誌,您可以在啟動容器時指定停止信號。該標誌設置當您希望停止容器時將發送給運行中容器的信號。

在下面的示例中,--stop-signal標誌採用SIGQUIT值,這告訴Docker在停止容器時發送SIGQUIT信號。該示例還使用以下參數:

  • d – Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.
  • t – allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.
  • “映像名稱” – 從哪個Docker映像提供容器,本例中為ubuntu映像。
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying SIGQUIT as the signal when starting and then stopping a Docker container.

您還可以使用Dockerfile指定停止信號,這告訴Docker如何構建容器。您可以向Dockerfile添加一個條目,並使用STOPSIGNAL SIGQUIT指定停止信號,例如。您可以將SIGQUIT替換為您想要的任何停止信號。

使用docker kill立即退出容器

有時您會希望立即退出容器而不允許它們有寬限期。 docker kill命令立即停止容器。

下面的示例將帶有ID 2aa318273db5的容器傳遞給docker kill。容器將立即通過SIGKILL信號退出。容器將不被允許優雅退出。由於該命令,容器將退出,並顯示容器的ID。

docker kill 2aa318273db5

使用命令docker kill $(docker ps -q)殺死所有容器。注意,(docker ps -q)在這裡是一個子表達式。

使用docker rm停止並刪除容器

默認情況下,當您創建一個容器時,該容器與以前的容器相同:它是幂等的。刪除容器的影響很小,因此 docker rm 命令可以強制停止並刪除容器。Docker 向主進程發送 SIGKILL 信號,並將容器從可用容器列表中刪除。

如果容器必須保留更改過的內部文件或者需要保留其狀態,那麼刪除容器將破壞這些更改。請小心潛在的錯誤!

在下面的示例中,您可能已經啟動了一個名為 kind_galileo 的容器。在刪除容器之前,容器必須停止,如下所示。 docker ps -a 命令顯示示例容器的狀態為 Exited

Listing all containers, including stopped containers.

現在容器已經停止,發出 docker rm 命令將完全刪除容器。

docker rm kind_galileo

不需要先停止容器再刪除容器,使用 --forcedocker rm 的組合將在一個操作中停止並刪除容器。容器 laughing_elion 將無法運行。

docker rm --force laughing_elion

如果不指定 --force 命令,您將遇到錯誤消息 Error response from daemon: You cannot remove a running container...

Stopping and removing a container.

使用 Docker Compose 停止 Docker 容器

Docker 命令通常用于单个容器,但您可以创建一个由多个容器协同工作的服务。Docker Compose 工具允许您配置由多个容器组成的服务以协同工作。

由于服务中的容器是设计为协同工作的,最好优雅地停止整个服务,而不是任何单个容器。

如果您正在运行一个包含多个容器的服务,[docker-compose stop] 命令将停止服务,但不会删除容器或服务。请按照下面的步骤创建一个 Docker Compose 服务,启动该服务,并最终优雅地停止该服务。

1. 创建一个目录来存储您的配置文件。在这个示例中,目录 C:\Articles\Ubuntu 将存储该文件。

mkdir C:\Articles\Ubuntu

2. 接下来,创建名为 docker-compose.yml 的文件,其中包含以下配置。下面的 Docker Compose 文件创建了一个包含两个 Ubuntu 容器的服务,并且当启动时,容器不会立即退出。

# docker-compose 的版本规范
version: "3.9"
# 组成该服务的应用程序集合
services:
  # 第一个 Ubuntu 容器
  container1:
    image: ubuntu
    # 与 -t 选项相同,分配一个伪终端,以便容器不会立即退出。
    tty: true
  # 第二个 Ubuntu 容器
  container2:
    image: ubuntu
    tty: true

3. 在終端會話中,導航到您的自定義 Docker 配置文件目錄,本例中為C:\Articles\Ubuntu。執行docker-compose up -d命令,在後台生成並啟動在前一步中創建的服務,如-d選項所示。

Starting a Docker Compose service.

4. 在相同的終端會話和目錄中,發出命令docker-compose stop以優雅地結束服務和容器。

Stopping a Docker Compose service.

docker命令一樣,docker-compose命令也有rm --forcekill參數。這些docker-compose參數作用於服務而不是單個容器。docker-compose kill命令還接受一個-s選項來指定停止信號。

結論

Docker 容器是一個強大的工具,用於創建開發和生產使用的獨特和分段的環境。在本文中,您學到了幾種 Docker 停止一個或多個,甚至所有容器的方法。您還了解了 Docker 使用的默認停止信號以及如何更改它。

有了這些知識,您現在了解了停止 Docker 容器的各種細節,以及在停止運行容器時如何不出錯。有了這些新發現的知識,您打算如何停止您的容器?

Source:
https://adamtheautomator.com/docker-stop-containers/