ガイド/Dockerコンテナを停止する方法
MacでDockerコンテナを停止する方法(1つだけ、またはすべて)
結論
Dockerコンテナを1つ停止するには、docker stopのあとに名前かIDを付けて実行します。一覧はdocker psで表示できます。実行中のすべてのコンテナを停止するには、docker stop $(docker ps -q)を実行します。Composeプロジェクトでは、docker compose stopでコンテナを停止し、docker compose downなら削除までします。docker stopはコンテナにシャットダウンを求め、10秒後に強制終了します。停止しても戻ってくるコンテナには再起動ポリシーがあり、docker update --restart=noでオフにできます。Mac用システムモニタのVitalsなら、メニューバーからコンテナを停止できます。“コンテナ”リストに各コンテナのメモリが表示され、確認のうえワンクリックで停止します。
ターミナルからDockerコンテナを停止する方法
- 01
docker psを実行して、実行中のコンテナを名前とIDとともに一覧表示します。 - 02
docker stopと名前で1つ停止します。たとえばdocker stop web-1です。1つのコマンドで複数の名前を指定できます。 - 03
docker stop $(docker ps -q)で、実行中のすべてのコンテナを停止します。docker ps -qはIDだけを出力し、docker stopがそれをすべて受け取ります。 - 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を送る | ほぼいつでも。アプリが書き込みを終えて接続を閉じられる |
| 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を送ったあと、コンテナのメインプロセスが終了するのを待ちます。シグナルを無視するプロセス(シグナルを渡さないシェルスクリプトであることが多い)があると、Dockerが強制終了するまで丸10秒待たされます。docker stop -t 2で待ち時間を短くできます。イメージを直せばすぐに停止するようになります。エントリポイントのスクリプトでexecを使ってアプリを起動するか、Composeでサービスにinit: trueを設定しましょう。
コンテナの停止とメモリの取り戻し
Macでは、コンテナは1つのLinux仮想マシンの中で動いています。停止するとその中でメモリは解放されますが、仮想マシンがそのメモリを抱えたままのことがあるため、アクティビティモニタには大きなVirtual Machine Service for Dockerが表示され続けることがあります。“Resource Saver”を使うかDocker Desktopを終了すれば、macOSにメモリが返されます。設定についてはDockerのメモリ使用量が多すぎるときを参照してください。
ターミナルを使わずにコンテナを停止する
Docker Desktopの“Containers”画面には、各コンテナと各Composeプロジェクトに停止ボタンがあります。Docker Desktopのウインドウ内にあるので、使うにはアプリを開く必要があります。Captainなどのメニューバーアプリは、メニューバーアイコンの下にコンテナを一覧表示し、それぞれに起動と停止のボタンがあります。Vitalsもメニューバーから同じことができるうえ、それらのどれも表示しない、各コンテナが使っているメモリとCPUの量も表示するので、どれを停止すべきかがわかります。
Vitalsでできること
Vitalsなら、メモリを確認しながらMacのメニューバーからコンテナを停止できます。
- ドロップダウンの“コンテナ”リスト: 実行中の各コンテナを、Composeプロジェクト、イメージ、メモリのバーとともに表示
- コンテナにポインタを合わせ、表示される×をクリック。行で確認したあと、
docker stopと同じように10秒のシャットダウン時間を与えて停止 - ウインドウの“コンテナ”タブでは、複数を選択してControlキーを押しながらクリックすると一度に停止。Composeプロジェクトを同様にクリックして“すべて停止”を選ぶこともできます
- Docker Desktop、OrbStack、Colima、Rancher Desktop、Podmanで、すべてのコンテナのメモリ、CPU、ネットワーク、ディスク、公開ポートを表示
知っておくと便利なこと
- Vitalsは何かを停止する前に必ず確認し、コンテナを起動、削除、変更することはありません。
- 再起動ポリシーのあるコンテナは、エンジンによって再び起動されることがあります。確認時にウインドウにその旨が表示されます。
- エンジンが拒否したり応答しなかったりした場合は、行にコンテナがまだ実行中であると表示されます。
- “コンテナ”リストは、エンジンが動いている間だけ表示されます。
よくある質問
Dockerコンテナをすべて一度に停止するには?
docker stop $(docker ps -q)を実行します。実行中のすべてのコンテナのIDを一覧にし、1つずつ停止します。Vitalsでは、“コンテナ”タブでコンテナを選択し、Controlキーを押しながらクリックすると一度に停止できます。
docker stopとdocker killの違いは?
docker stopはSIGTERMを送り、最大10秒待ってからSIGKILLでコンテナを強制終了します。docker killはすぐにSIGKILLを送るので、アプリは書き込みを終えたり接続を閉じたりできません。
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に対応しています。