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
コンテナのコマンドは、1回に1つのコンテナIDを停止するのをサポートしています。
まず、docker ps
コマンドを使用してすべてのコンテナをリストし、コンテナIDを docker stop
コマンドに渡します。以下に示します。

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

上記の
$(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
です。

SIGQUIT
as the signal when starting and then stopping a Docker container. Dockerfileを使用して停止シグナルを指定することもできます。これにより、Dockerにコンテナのビルド方法を指示できます。たとえば、
STOPSIGNAL SIGQUIT
というエントリをDockerfileに追加することで停止シグナルを指定できます。SIGQUIT
は任意の停止シグナルに切り替えることができます。
docker kill
を使用してコンテナを直ちに終了する
Grace期間を与えずにコンテナを終了させたい場合があります。 docker kill
コマンドはコンテナを直ちに停止します。
以下の例では、コンテナID 2aa318273db5
をdocker kill
に渡します。 コンテナは直ちにSIGKILLシグナルで終了します。 コンテナにGracefulな終了は許可されません。 コマンドの結果として、コンテナが終了し、コンテナのIDが表示されます。
コマンド
docker kill $(docker ps -q)
ですべてのコンテナを終了します。 ここでは(docker ps -q
)がサブ式であることに注意してください。
docker rm
を使用してコンテナを停止および削除する
デフォルトでは、コンテナを作成するときに、そのコンテナは以前と同じように構築されます:それは冪等です。コンテナを削除すると、最小限の影響があります。そのことを考慮すると、docker rm
を使用してコンテナを強制停止および削除できます。Dockerは、メインプロセスにSIGKILL
シグナルを発行し、コンテナをDockerインストールで利用可能なコンテナのリストから削除します。
コンテナが変更された内部ファイルを保持する必要がある場合、またはその状態を保持する必要がある場合、コンテナを削除すると、それらの変更が破壊されます。ポテンシャルなトラブルに注意してください!
次の例では、おそらくkind_galileo
という名前が割り当てられたコンテナを開始しました。コンテナを削除する前に、以下に示すようにコンテナを停止する必要があります。例のコンテナのステータスはExited
です。

コンテナが停止したので、docker rm
コマンドを実行すると、コンテナが完全に削除されます。
コンテナを停止してからコンテナを削除する代わりに、--force
とdocker rm
の組み合わせを使用すると、コンテナを1回の操作で停止して削除できます。コンテナlaughing_elion
はもはや実行できません。
--force
コマンドを指定しない場合、エラーメッセージError response from daemon: You cannot remove a running container...
が表示されます。

Docker ComposeでDockerコンテナを停止します
Dockerコマンドは通常、単一のコンテナで使用されますが、複数のコンテナが協力して動作するサービスを作成することもできます。Docker Composeツールを使用すると、複数のコンテナから構成されるサービスを一緒に動作させることができます。
サービス内のコンテナは一緒に動作するように設計されているため、個々のコンテナではなく、サービス全体を正常に停止することが最善です。
複数のコンテナで実行中のサービスがある場合、[docker-compose stop]
コマンドを使用して、コンテナやサービスを削除せずにサービスを停止します。以下の手順に従って、Docker Composeサービスを作成し、サービスを起動し、最終的に正常にサービスを停止します。
1. 設定ファイルを保存するためのディレクトリを作成します。この例では、ディレクトリ C:\Articles\Ubuntu に設定ファイルを保存します。
2. 次に、docker-compose.yml という名前のファイルを作成します。以下の構成を含めたファイルです。以下のDocker Composeファイルは、2つのUbuntuコンテナを持つサービスを作成し、起動時にコンテナがすぐに終了しないようにします。
3. ターミナルセッションで、この例ではC:\Articles\UbuntuにあるカスタムのDocker設定ファイルディレクトリに移動します。バックグラウンドで作成されたサービスを開始するには、docker-compose up -d
を実行します。

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

docker-compose
コマンドは、docker
コマンドと同様に、rm --force
およびkill
パラメーターを持っています。docker-compose
パラメーターは、単一のコンテナではなくサービスに対して機能します。docker-compose kill
コマンドには、停止シグナルを指定する-s
オプションもあります。
結論
Dockerコンテナは、開発や本番利用のためのユニークで分離された環境を作成する強力なツールです。この記事では、Dockerが1つまたは複数のコンテナを停止するさまざまな方法を学びました。また、Dockerが使用するデフォルトの停止シグナルについても学び、それを変更する方法も学びました。
この知識を持っていると、Dockerコンテナを停止する方法や、実行中のコンテナを停止する際に問題が発生しない方法についての詳細を理解しています。この新しい知識を持って、今後どのようにコンテナを停止する予定ですか?
Source:
https://adamtheautomator.com/docker-stop-containers/