物事を台無しにせずにDockerコンテナを停止する方法!

Dockerのコンテナを停止する方法に問題がありますか? 多種多様なコンテナを作成できる能力があるため、コンテナを停止する正しい方法を見つけるのは難しいです。この記事では、コンテナを停止するためのDockerコマンドを学びます。

詳細をご覧ください!

前提条件

このチュートリアルに従うには、次のものが必要です。

  • Windows 10 – このチュートリアルではWindowsを使用してDockerを実行しますが、同じ一般的な手順をLinuxやmacOSにも適用できます。
  • Docker Desktop – このチュートリアルではバージョン3.5.2を使用しています。 Linuxを使用している場合は、GUIが利用できないため、Dockerエンジンが利用可能です。
  • A running Docker container or containers.

docker stopコンテナコマンドを使用してコンテナを終了する

最初のコマンドである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 コンテナのコマンドは、1回に1つのコンテナIDを停止するのをサポートしています。

まず、docker ps コマンドを使用してすべてのコンテナをリストし、コンテナIDを docker stop コマンドに渡します。以下に示します。

# 実行中のすべてのコンテナをリストする
docker ps
# 以下の Docker コンテナをコンテナIDを使用して停止する
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

手動でコンテナIDを取得し、それらを docker stop に渡さずにすべての実行中のコンテナを停止したい場合はどうすればよいですか? docker ps -q コマンドを使用します。 docker ps コマンドの -q パラメータは、コンテナのIDのみを出力します。

# 3つのコンテナを作成します。各コマンドはセミコロンで区切られています
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の両方でサブ式として機能します。サブ式は、シェルに対して一連のコマンド、docker ps -qを最初に処理し、その結果を元のコマンドdocker stopに返すように指示します。

以下の例では、--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.
  • “image name” – この場合、コンテナをプロビジョニングする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にコンテナのビルド方法を指示できます。たとえば、STOPSIGNAL SIGQUITというエントリをDockerfileに追加することで停止シグナルを指定できます。 SIGQUITは任意の停止シグナルに切り替えることができます。

docker killを使用してコンテナを直ちに終了する

Grace期間を与えずにコンテナを終了させたい場合があります。 docker killコマンドはコンテナを直ちに停止します。

以下の例では、コンテナID 2aa318273db5docker killに渡します。 コンテナは直ちにSIGKILLシグナルで終了します。 コンテナにGracefulな終了は許可されません。 コマンドの結果として、コンテナが終了し、コンテナのIDが表示されます。

docker kill 2aa318273db5

コマンドdocker kill $(docker ps -q)ですべてのコンテナを終了します。 ここでは(docker ps -q)がサブ式であることに注意してください。

docker rmを使用してコンテナを停止および削除する

デフォルトでは、コンテナを作成するときに、そのコンテナは以前と同じように構築されます:それは冪等です。コンテナを削除すると、最小限の影響があります。そのことを考慮すると、docker rmを使用してコンテナを強制停止および削除できます。Dockerは、メインプロセスにSIGKILLシグナルを発行し、コンテナをDockerインストールで利用可能なコンテナのリストから削除します。

コンテナが変更された内部ファイルを保持する必要がある場合、またはその状態を保持する必要がある場合、コンテナを削除すると、それらの変更が破壊されます。ポテンシャルなトラブルに注意してください!

次の例では、おそらくkind_galileoという名前が割り当てられたコンテナを開始しました。コンテナを削除する前に、以下に示すようにコンテナを停止する必要があります。例のコンテナのステータスはExitedです。

Listing all containers, including stopped containers.

コンテナが停止したので、docker rmコマンドを実行すると、コンテナが完全に削除されます。

docker rm kind_galileo

コンテナを停止してからコンテナを削除する代わりに、--forcedocker rmの組み合わせを使用すると、コンテナを1回の操作で停止して削除できます。コンテナ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ファイルは、2つのUbuntuコンテナを持つサービスを作成し、起動時にコンテナがすぐに終了しないようにします。

# docker-composeの仕様バージョン
version: "3.9"
# このサービスを構成するアプリケーションのコレクション
services:
  # 最初のUbuntuコンテナ
  container1:
    image: ubuntu
    # -tオプションと同じで、擬似TTYを割り当てるので、コンテナがすぐに終了しません。
    tty: true
  # 2番目のUbuntuコンテナ
  container2:
    image: ubuntu
    tty: true

3. ターミナルセッションで、この例ではC:\Articles\UbuntuにあるカスタムのDocker設定ファイルディレクトリに移動します。バックグラウンドで作成されたサービスを開始するには、docker-compose up -dを実行します。

Starting a Docker Compose service.

4. 同じターミナルセッションとディレクトリで、docker-compose stopコマンドを発行して、サービスとコンテナを正常に終了します。

Stopping a Docker Compose service.

docker-composeコマンドは、dockerコマンドと同様に、rm --forceおよびkillパラメーターを持っています。 docker-composeパラメーターは、単一のコンテナではなくサービスに対して機能します。 docker-compose killコマンドには、停止シグナルを指定する-sオプションもあります。

結論

Dockerコンテナは、開発や本番利用のためのユニークで分離された環境を作成する強力なツールです。この記事では、Dockerが1つまたは複数のコンテナを停止するさまざまな方法を学びました。また、Dockerが使用するデフォルトの停止シグナルについても学び、それを変更する方法も学びました。

この知識を持っていると、Dockerコンテナを停止する方法や、実行中のコンテナを停止する際に問題が発生しない方法についての詳細を理解しています。この新しい知識を持って、今後どのようにコンテナを停止する予定ですか?

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