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つ作って起動する」コマンドです。内部的には次をまとめて実行しています。

  1. ローカルにイメージがなければ取得(pull)
  2. コンテナを作成(create)
  3. コンテナを起動(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 で結果を確かめてみてください。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください