dockerを使って開発環境を構築しようとしていた時に、
dockerのコンテナ内に入ろうとしたところ、
なぜか入れない...
でもコンテナは正常に起動しているし、問題なさそうなのに、なぜ...?
この時、今までdockerでの開発環境構築時に、先輩から教わったコマンドを
なんとなーく入力して進めてしまっていたことに気がつきました。
というわけで、今回はdockerコンテナに入るコマンドで、
主要っぽい4つの方法を調べてまとめてみました。
1. docker exec
指定したコンテナ内で新しいシェルを開始するためのコマンド
✍️ 記述方法
docker exec -it <コンテナ名またはID> bash
💡 ポイント
- 新しいシェルを開き、コンテナ内でコマンドを実行できる状態にしてくれる
- 稼働中のコンテナに対してのみ実行できる
- 複数回実行して、複数のシェルを開くことも可能
2. docker compose exec
docker-compose.yml ファイルで管理されるサービスに限定して使用されるコマンド
docker exec
と同様に、新しいシェルを開始する
✍️ 記述方法
docker compose exec <サービス名> bash
💡 ポイント
- docker-compose.ymlファイルに記載された、サービス名を指定して実行する
(指定するのはコンテナ名でないことに注意!) -
docker exec
と同様、新しいシェルを開いてコマンドを
実行可能な状態にしてくれる
3. docker attach
stdinなどコンテナの標準入出力に接続するためのコマンド
✍️ 記述方法
docker attach <コンテナ名>
💡 ポイント
- 実行中のプロセスの標準入出力にアクセスするだけで、新しいシェルは開かない
- プロセスが出力するログやエラーメッセージを確認できる
- コンテナ内でのコマンド実行はできない
- セッションの切断時には、
Ctrl
+C
だとコンテナ自体を停止させる可能性が
あるため、Ctrl
+P
(一時的にコマンド入力モードにするショートカット)を
実行後にCtrl
+Q
(ターミナルセッションを切断するショートカット)を
実行した方が良い
4. docker start -ai
停止中のコンテナを起動し、そのコンテナの標準入出力に接続するコマンド
✍️ 記述方法
docker start -ai <コンテナ名>
💡 ポイント
- 停止中のコンテナに対して実行して起動し、その起動時の標準入出力に接続する
-
docker attach
同様、実行後に新しいシェルを開かない - 実行中のプロセスにアクセスするのではなく、
コンテナの開始時から出力を確認できる
筆者がやらかしていた凡ミス
それで結局、筆者は何でdockerコンテナ内に入れなかったのか?というと、
私はdocker compose exec
でコンテナ内に入ろうとしていたのですが、
ここでdocker-compose.yml内に記載してある「サービス名」ではなく、
dockerの「コンテナ名」を指定していたんです。
docker-compose.yml内で定義されていない名前をサービス名として
指定していたんだから、service 〇〇 is not running
と言われるのも納得ですね。