デタッチドモードでContainerをバックグラウンド実行する
デタッチドモード(-dフラグ)を使用してDocker containerをバックグラウンドで実行する方法を学びます。containerのライフサイクル管理、ログアクセス、実行中のcontainerへの再接続について解説します。
詳細な説明
-dによるバックグラウンドContainer
デフォルトでは、docker runはターミナルをcontainerの標準出力と標準エラーストリームに接続します。デタッチドモードフラグ(-d)はcontainerをバックグラウンドで実行し、ターミナルを他の作業に使えるようにします:
docker run -d nginx
Dockerは完全なcontainer IDを出力し、すぐにshellプロンプトに戻ります。Nginxサーバーはバックグラウンドで実行され続けます。
Container IDと命名
デタッチドcontainerが起動すると、Dockerは64文字の16進数container IDを出力します:
a3f5b7c9e1d2f4a6b8c0e2d4f6a8b0c2e4d6f8a0b2c4e6d8f0a2b4c6e8d0f2
containerは完全なID、短いプレフィックス(最初の12文字)、または名前で参照できます。本番環境では命名を強く推奨します:
docker run -d --name my-webserver nginx
ログの確認
containerの出力はターミナルに接続されていないため、docker logsで確認します:
docker logs my-webserver # すべてのログ
docker logs -f my-webserver # フォロー(tail -fと同様)
docker logs --tail 50 my-webserver # 最後の50行
Containerへの再接続
ターミナルをデタッチドcontainerに再接続できます:
docker attach my-webserver
注意: 接続中にCtrl+Cを押すと、containerのPID 1にSIGINTが送信され、containerが停止する可能性があります。停止せずにデタッチするにはCtrl+P、Ctrl+Qを使用してください。
実行中のContainerでコマンドを実行する
接続する代わりに、実行中のデタッチドcontainer内で追加コマンドを実行できます:
docker exec -it my-webserver bash
これによりメインのNginxプロセスに影響を与えずに、container内で新しいbashセッションが開始されます。
デタッチドモードを使うべき場面
- 継続的に実行するWebサーバー(Nginx、Apache)。
- バックグラウンドサービスとして実行するデータベース(PostgreSQL、MySQL、Redis)。
- メッセージキュー(RabbitMQ、Kafka)やその他の長時間実行インフラ。
- ジョブ間で永続化が必要なCI/CDエージェント。
ユースケース
開発マシンや本番サーバーで、ターミナルセッションを占有せずに、バックグラウンドで継続的に実行する必要があるWebサーバーやデータベースをデプロイする場合に使用します。