DockerでWebサーバーやアプリケーションを動かしていると、コンテナを「バックグラウンド」で起動しておきたい場面が多くあります。
しかし、「コンテナを起動したら画面がフリーズ?」「起動中にターミナルを閉じると止まる?」そんな経験ありませんか?
この記事では、Dockerコンテナをバックグラウンド(非対話モード)で起動する方法と、よくある注意点や確認方法も含めてわかりやすく解説します。
バックグラウンド起動とは?
Dockerコンテナは、起動時に標準で前面モード(フォアグラウンド)で動きます。
このモードでは、コンテナの標準出力がターミナルに直接表示され、ターミナルはそのコンテナ用に占有されてしまいます。
フォアグラウンド起動の特徴:
- コンテナのログがリアルタイムでターミナルに表示される
- Ctrl+Cを押すとコンテナが停止する
- ターミナルを閉じるとコンテナも終了することがある
対して、バックグラウンド起動とは「起動だけして、ターミナルはすぐ使える状態に戻る」=非対話的に起動して裏で動かすことです。
バックグラウンド起動のメリット:
- 同じターミナルで他のコマンドを実行できる
- ターミナルを閉じてもコンテナは動き続ける
- 複数のコンテナを効率的に管理できる
- 開発環境やサーバー環境で常駐サービスとして実行できる
-d オプションの基本的な使い方
Dockerでは -d
(または --detach
)オプションを使うことで、コンテナをバックグラウンドで起動できます。
基本構文:
docker run -d [その他オプション] イメージ名 [コマンド]
実践例:
例1:Nginxコンテナをバックグラウンドで起動
docker run -d -p 8080:80 --name my-nginx nginx
このコマンドの各部分の意味:
-d
:バックグラウンドで起動する-p 8080:80
:ホストの8080ポートをコンテナの80ポートにマッピング--name my-nginx
:コンテナに「my-nginx」という名前を付けるnginx
:使用するイメージ名
実行すると、コンテナIDが表示されるだけで、ターミナルはすぐに制御が戻ります:
3a4b2c5d6f7812345678901234567890
例2:MySQLをバックグラウンドで起動
docker run -d \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
-p 3306:3306 \
mysql:8.0
-e
:環境変数を設定- 複数のオプションを使用する場合は、見やすくするために改行(
\
)で区切ることもできます
例3:独自コマンドを指定してバックグラウンド実行
docker run -d ubuntu sleep 3600
このコマンドは、Ubuntuコンテナを起動して「sleep 3600」(1時間スリープ)というコマンドをバックグラウンドで実行します。
コンテナの状態確認方法(docker ps)
バックグラウンドで起動したコンテナの状態は、docker ps
コマンドで確認できます:
docker ps
出力例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a4b2c5d6f78 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp my-nginx
7e8f9d1c2b3a mysql:8.0 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp my-mysql
この出力から以下の情報が確認できます:
- コンテナが正常に起動しているか(
STATUS
がUp
になっている) - どのポートがマッピングされているか(
PORTS
列) - 起動してからの時間(
STATUS
のUp XX seconds/minutes
部分)
バックグラウンドで起動したコンテナが見当たらない場合は、すぐに終了している可能性があります。
その場合は、すべてのコンテナ(停止中も含む)を表示する -a
オプションを追加しましょう:
docker ps -a
ログの確認方法(docker logs)
バックグラウンドで起動したコンテナのログは、直接ターミナルに表示されなくなるため、必要に応じて docker logs
コマンドで確認します。
基本的なログ確認:
docker logs コンテナ名またはID
例:
docker logs my-nginx
これにより、コンテナの起動時から現在までのすべてのログが表示されます。
リアルタイムでログを監視:
docker logs -f コンテナ名またはID
例:
docker logs -f my-nginx
-f
(または--follow
)オプションを使うと、ログをリアルタイムで監視できます- この状態を終了するには
Ctrl + C
を押します
直近のログだけを表示:
docker logs --tail 50 my-nginx
これにより、最新の50行だけが表示されます。
タイムスタンプを表示:
docker logs -t my-nginx
各ログ行の先頭にタイムスタンプが追加されます。
よくある注意点とエラー対策
コンテナがすぐに終了してしまう
症状: docker run -d
でコンテナを起動したが、docker ps
で表示されない。
原因: Dockerコンテナは、メインプロセスが終了するとコンテナ自体も終了します。
バックグラウンド起動したコンテナがすぐに終了する主な理由は:
- コンテナのメインプロセスがすぐに完了して終了した
- コンテナ内でエラーが発生して異常終了した
- 常駐プロセスとして動くよう設計されていないイメージを使用した
対処法:
docker logs コンテナID
でエラーメッセージを確認する- 常駐プロセスを持つイメージを使用する(nginx, mysql, redis など)
- コマンドを指定する場合は、長時間実行されるコマンドを使用する(例:
sleep infinity
)
ポートのバインドエラー
症状: 「Bind for 0.0.0.0:8080 failed: port is already allocated」などのエラーが表示される。
原因: 指定したホスト側のポートが既に使用されています。
対処法:
- 別のポートを使用する:
-p 8081:80
など - 既存のコンテナを停止する:
docker stop コンテナ名
- 使用中のポートを確認する:
netstat -tuln
(Linux/Mac) またはnetstat -aon
(Windows)
メモリ不足エラー
症状: コンテナが起動するが、すぐに終了する。ログに「Out of memory」などのメッセージがある。
原因: コンテナに割り当てられたメモリが不足しています。
対処法:
- メモリ制限を設定する:
-m 512m
または--memory=512m
- Dockerデスクトップのリソース設定を確認・調整する
イメージが見つからない
症状: 「Unable to find image ‘…’ locally」というエラーの後、ダウンロードが始まらない。
原因: 指定したイメージ名が存在しないか、アクセス権がありません。
対処法:
- イメージ名とタグを確認する(大文字小文字も区別されます)
docker pull イメージ名
で事前にダウンロードを試みる- プライベートリポジトリの場合は、認証情報を確認する
まとめ
Dockerでのバックグラウンド起動は、本番運用や開発時の複数サービス実行に欠かせない基本テクニックです。
ポイント:
docker run -d
でコンテナをバックグラウンドで起動docker ps
で起動中のコンテナを確認docker logs
でバックグラウンドコンテナのログを確認- コンテナは常駐プロセスがないと自動的に終了するので注意
- 名前を付けておくと管理が楽になる(
--name
オプション)
よく使うコマンド例:
# Nginxをバックグラウンドで起動し、ホストの8080ポートに公開
docker run -d --name web -p 8080:80 nginx
# コンテナの状態を確認
docker ps
# ログを確認
docker logs web
# コンテナを停止
docker stop web
# コンテナを再起動
docker start web
バックグラウンド起動を使いこなせば、複数のサービスを同時に稼働させたり、開発環境を効率的に構築したりできます。
「画面を占有せずに動かしたい」と思ったら、ぜひこの方法を使ってみてください!
コメント