docker run の基本オプション完全ガイド
概要
docker run は Docker で最初に覚えるコマンドでありながら、オプションが多く「なんとなくコピペで済ませている」人が多いコマンドです。本記事では代表的なオプションを実行例とともに一つずつ整理し、docker run -d -p 8080:80 nginx のような長いコマンドを自分で読み書きできる状態を目指します。
対象読者は、Docker を触り始めたばかりの入門者です。
動作環境
- Docker Engine 20.10 以降
- OS は Linux / macOS / Windows(WSL2) いずれでも可
- 例では公式の
nginx/alpine/ubuntuイメージを使用
docker --version
docker run は何をしているのか
docker run は「イメージからコンテナを1つ作って起動する」コマンドです。内部的には次をまとめて実行しています。
- ローカルにイメージがなければ取得(pull)
- コンテナを作成(create)
- コンテナを起動(start)
書式は次のとおりです。
docker run [オプション] イメージ名[:タグ] [コンテナ内で実行するコマンド]
最小例:
docker run hello-world
主要オプション早見表
| オプション | 短縮 | 役割 |
|---|---|---|
--detach |
-d |
バックグラウンド実行 |
--name |
コンテナ名を指定 | |
--publish |
-p |
ポート公開(host:container) |
--env |
-e |
環境変数を渡す |
--env-file |
環境変数をファイルで渡す | |
--volume |
-v |
マウント(host:container) |
--interactive |
-i |
標準入力を維持 |
--tty |
-t |
擬似端末を割り当て |
--rm |
終了時に自動削除 | |
--restart |
再起動ポリシー | |
--network |
ネットワーク指定 |
-d / --detach(バックグラウンド実行)
docker run -d nginx
バックグラウンドで起動し、コンテナ ID を返します。Web サーバーや DB のように起動し続けてほしいプロセス向けです。付けない場合はフォアグラウンドで動き、ターミナルがログに占有されます。
--name(名前を付ける)
docker run -d --name web nginx
名前を付けると後続操作を名前で行えます。
docker logs web docker stop web docker exec -it web sh
名前は一意である必要があり、同名コンテナが残っていると起動に失敗します。使い捨てなら後述の --rm と組み合わせます。
-p / --publish(ポート公開)
ホスト側ポート:コンテナ側ポート の順で公開します。
docker run -d -p 8080:80 nginx # http://localhost:8080 でアクセス可能
複数指定も可能です。
docker run -d -p 8080:80 -p 8443:443 nginx
左がホスト、右がコンテナという順序を取り違えると繋がりません。
-e / --env と --env-file(環境変数)
docker run -d -e TZ=Asia/Tokyo -e APP_ENV=production myapp
数が多い場合はファイルにまとめられます。
docker run -d --env-file .env myapp
なお、パスワードや API キーなどの機密情報を -e で平文で渡すと docker inspect から参照できてしまいます。本番ではシークレット管理の仕組みを検討してください。
-v / --volume(マウント)
ホスト側パス:コンテナ側パス の順でマウントします。
# バインドマウント docker run -d -p 8080:80 -v "$(pwd)/html:/usr/share/nginx/html" nginx # 名前付きボリューム docker run -d -v mydata:/var/lib/mysql mysql:8 # 読み取り専用 docker run -d -v "$(pwd)/config:/etc/app/config:ro" myapp
コンテナを削除するとコンテナ内のデータは消えます。永続化したいデータはボリュームへ逃がすのが基本です。
-it(対話操作)
docker run -it ubuntu bash
-i(標準入力維持)と -t(擬似端末割り当て)をまとめた形です。デバッグやイメージ内部の確認に使う定番の形です。
--rm(終了時に自動削除)
docker run --rm -it alpine sh
終了と同時にコンテナを自動削除し、停止済みコンテナが溜まるのを防ぎます。ログも消えるため常駐サービスには使いません。
--restart(再起動ポリシー)
docker run -d --restart unless-stopped -p 8080:80 nginx
| 値 | 挙動 |
|---|---|
no(既定) |
再起動しない |
on-failure[:回数] |
異常終了時のみ再起動 |
always |
常に再起動 |
unless-stopped |
手動停止時以外は再起動 |
サーバー用途では unless-stopped がよく選ばれます。
ネットワークで複数コンテナを繋ぐ
docker network create appnet docker run -d --name db --network appnet postgres:16 docker run -d --name api --network appnet -p 3000:3000 myapi
同じネットワーク内では、api から db というホスト名で名前解決できます。
全部盛りの例
docker run -d \ --name web \ --restart unless-stopped \ -p 8080:80 \ -e TZ=Asia/Tokyo \ -v "$(pwd)/html:/usr/share/nginx/html:ro" \ --network appnet \ nginx:1.27
このコマンドは「nginx:1.27 を web という名前でバックグラウンド起動し、落ちても再起動、ホスト 8080→コンテナ 80 を公開、タイムゾーンを設定、ローカルの html を読み取り専用でマウント、appnet に接続する」という意味になります。
動作確認コマンド
docker ps docker ps -a docker logs -f web docker exec -it web sh docker inspect web docker port web
docker inspect で -p や -v、-e が意図通り効いているかを検証できます。
注意点
-pも-vも「host:container」の順。左右を混同しない。- 機密情報を
-eで平文で渡すとinspectから見える。 --rmは使い捨て専用。ログを残したいサービスには付けない。- 同名コンテナが残っていると
--nameで起動失敗する。 - 単発起動が増えてきたら Compose 化を検討する。
まとめ
docker run のオプションは役割ごとに整理すると数個のグループに収まります。
- 起動の仕方:
-d/--rm/--restart - 識別と接続:
--name/-p/--network - 設定とデータ:
-e/--env-file/-v - 対話操作:
-it
呪文として暗記するのではなく、「ホストとコンテナのどちらの話か」「起動・設定・データのどれの話か」で分類すると、初見の長いコマンドも読み解けるようになります。まずは本記事のコマンドを手元で1つずつ実行し、docker inspect で結果を確かめてみてください。
