目次

docker run の引数を徹底解説:実行結果で学ぶ使い方

docker run は最もよく使われ、引数も最も多い Docker コマンドです。基本形式は次のとおりです。

docker run [引数] イメージ[:tag] [コマンド] [コマンドの引数]

イメージ名の後の部分は、イメージのデフォルトコマンド(CMD)を置き換えます。

$ docker run --rm alpine:3.23 cat /etc/alpine-release
3.23.6

--rm は Docker に渡す引数です。cat /etc/alpine-release はコンテナ内で実行するコマンドで、alpine のデフォルトの /bin/sh を置き換えます。

引数は必ずイメージ名より前に書く

イメージ名の後に書いたものはすべて、コンテナ内のコマンドとして扱われます。

$ docker run alpine:3.23 --rm echo hi
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: exec: "--rm": executable file not found in $PATH

Run 'docker run --help' for more information

Docker はコンテナ内で --rm という名前のプログラムを実行しようとしますが、当然見つかりません(executable file not found)。このエラーが表示されたら、まず引数の位置を確認してください。

実行モード

引数説明
-d, --detachバックグラウンドで実行し、コンテナ ID を表示してすぐに戻る
-i, --interactive標準入力を開いたままにする
-t, --tty仮想端末を割り当てる
--rmコンテナ終了後に自動で削除する
--nameコンテナ名を指定する。指定しない場合はランダムに生成される(例:dreamy_solomon)
docker run -it --rm ubuntu:26.04 bash      # 対話型で入り、終了後に自動削除
docker run -d --name cache redis:8-alpine  # バックグラウンドサービス

-it は対話型シェルに入るため、ほとんどの場合セットで使います。-i だけを使うと、パイプでデータをコンテナに渡せます。

$ echo "hello" | docker run -i --rm alpine:3.23 cat
hello

ポート:-p

形式は -p ホストのポート:コンテナのポート です。次の 3 つの書き方を実際の結果で比較します。

$ docker run -d --name p1 -p 8080:80 nginx:1.30
27b89a4fae92dfe05bf051e11700033c7b9bb71f8747acc986d2a535cc1baa00

$ docker run -d --name p2 -p 127.0.0.1:8081:80 nginx:1.30
3327f3c1df4fa1e03fa3a120e5d889859fc0cb53d0aaf269826c81b25f4411c2

$ docker run -d --name p3 -P nginx:1.30
57c9a309c4758786361738b7b9a4231f404cb9bbab28f38cad39b4b6e996d9e0

$ docker port p1
80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080

$ docker port p2
80/tcp -> 127.0.0.1:8081

$ docker port p3
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768
書き方結果
-p 8080:80すべてのネットワークインターフェース(0.0.0.0 と IPv6 の [::])にバインドするため、ほかのコンピューターからも接続できる
-p 127.0.0.1:8081:80ローカルホストのみにバインドするため、このコンピューターからのみ接続できる
-Pイメージの EXPOSE ポートをランダムなホストポートに割り当てる(今回は 32768 が割り当てられた)

docker port コンテナ名 で実際のポート割り当てを確認できます。UDP ポートは -p 5353:53/udp のように指定します。

-p 8080:80 をクラウドホストで使うと、外部から直接接続できるようになります。また、Docker はファイアウォールルールを自動的に書き換えるため、ufw の設定では遮断できない場合があります。データベースなど外部公開すべきでないサービスは、127.0.0.1 にバインドするか、-p を使わずにカスタムネットワークでコンテナ同士を接続してください。

データ:-v と --mount

-v ホストのパス:コンテナのパス を使うと、ホスト上のフォルダーをコンテナにマウントできます(bind mount)。site フォルダーを用意し、その中に index.html を置きます。

$ ls site
index.html

$ docker run -d --name site -p 8080:80 -v "$(pwd)/site:/usr/share/nginx/html:ro" nginx:1.30
e91f46b91ff8f0f64d59d6605bfddea0ee5bca809de86d81cbd5051815e65dd1

$ curl -s http://localhost:8080 | head -n 3
<!doctype html>
<html><head><meta charset="utf-8"><title>My site</title>
<style>body{font-family:system-ui,sans-serif;max-width:640px;margin:60px auto;padding:0 16px;color:#1f2937}h1{color:#1d63ed}</style></head>

Windows での書き方(タブをクリックして切り替えます):

docker run -d --name site -p 8080:80 -v "$(pwd)/site:/usr/share/nginx/html:ro" nginx:1.30
docker run -d --name site -p 8080:80 -v "${PWD}/site:/usr/share/nginx/html:ro" nginx:1.30
docker run -d --name site -p 8080:80 -v "%cd%/site:/usr/share/nginx/html:ro" nginx:1.30
bind mount したウェブページを表示する nginx
nginx はホスト上の site/index.html の内容を表示します

末尾の :ro は読み取り専用を意味します。コンテナ内からこのフォルダーに書き込もうとすると拒否されます。

$ docker exec site sh -c "echo test > /usr/share/nginx/html/x.txt"
sh: 1: cannot create /usr/share/nginx/html/x.txt: Read-only file system

もう 1 つのマウント方法は、Docker が管理する Volume(-v 名前:コンテナのパス)を使う方法です。データベースなどのデータ保存に適しています。

docker run -d -v pgdata:/var/lib/postgresql postgres:18

--mount はより長く、明確に書く方法です。両者の違いや使い分けについては、Volume と Bind Mountを参照してください。

環境変数:-e と --env-file

$ docker run --rm -e GREETING=hello -e APP_ENV=dev alpine:3.23 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=18f035817c43
GREETING=hello
APP_ENV=dev
HOME=/root

-e 変数名(値を指定しない場合)は、ホスト上にある同名の環境変数の現在値を引き継ぎます。

$ APP_ENV=prod docker run --rm -e APP_ENV alpine:3.23 sh -c 'echo $APP_ENV'
prod

変数が多い場合は --env-file ファイル を使います。詳しくは環境変数と .env ファイルを参照してください。

ネットワーク

同じカスタムネットワーク内のコンテナは、コンテナ名を使って相互に接続できます。

$ docker network create mynet
2ecd542737519b0b8919061077814e007a72e2d07973f0840608b1b5454c678e

$ docker run -d --name myweb --network mynet nginx:1.30
9a6ca3dca3a003e28b9870f3eec436cf7023a6872e8ddd4cee971d29f845583b

$ docker run --rm --network mynet alpine:3.23 ping -c 2 myweb
PING myweb (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.094 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.064 ms

--- myweb ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.064/0.079/0.094 ms

$ docker run --rm alpine:3.23 ping -c 1 -W 2 myweb
ping: bad address 'myweb'
  • 1つ目の ping コンテナは mynet 内にあり、myweb は Docker 内蔵 DNS によって 172.19.0.2 に名前解決されます。
  • 2つ目は --network を指定していないため、デフォルトネットワークにあり、myweb を見つけられません(bad address)。

コンテナ名には web や app のような、トップレベルドメイン(TLD)と同じ単語を使わないでください。同じネットワークに参加していない場合、このような名前は外部 DNS によって奇妙なアドレス(例:127.0.53.53)に名前解決され、デバッグがさらに難しくなります。

docker run --network host nginx:1.30     # ホストネットワークを直接使用(Linux)
docker run --network none alpine:3.23    # ネットワークなし

詳しくはネットワークとコンテナの接続を参照してください。

再起動ポリシー

docker run -d --restart unless-stopped nginx:1.30

使用できる値は no、on-failure、always、unless-stopped です。実際の動作についてはコンテナのライフサイクルを参照してください。

リソース制限

$ docker run -d --name limited --memory 64m --cpus 0.5 nginx:1.30
2e65ce89f346cb7d9d57f1e6ad529d63ad53d1d914b6d3178dc3344a1d3325f0

$ docker stats --no-stream limited
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O         PIDS
2e65ce89f346   limited   0.00%     3.922MiB / 64MiB    6.13%     736B / 126B   1.77MB / 8.19kB   2

MEM USAGE / LIMIT は 3.922MiB / 64MiB と表示され、メモリ上限が適用されています。nginx のアイドル時の使用量は 4 MB 未満です。

パラメーター説明
--memory, -mメモリ上限。例:512m、2g。上限を超えるとプロセスが終了します(OOM、終了コード 137)。
--memory-swapメモリと swap の合計上限
--cpus使用できる CPU 数。小数も指定でき、0.5 は CPU の半分を表します
--pids-limitコンテナ内で実行できるプロセスの最大数

メモリ上限を超えたときの実際の動作については、ログの確認とデバッグの OOM の例を参照してください。

イメージのデフォルト値を上書きする

$ docker run --rm --entrypoint sh nginx:1.30 -c "nginx -v; whoami"
nginx version: nginx/1.30.5
root

$ docker run --rm -u 1000:1000 alpine:3.23 id
uid=1000 gid=1000 groups=1000

$ docker run --rm -w /tmp alpine:3.23 pwd
/tmp

$ docker run --rm -h myhost alpine:3.23 hostname
myhost
パラメーター説明
--entrypointENTRYPOINT を上書きします。サービスをすぐに起動するイメージの中を確認するときによく使います
-u, --user指定したユーザー(UID:GID)で実行します
-w, --workdir作業ディレクトリを上書きします
-h, --hostnameコンテナのホスト名

-u は、コンテナが生成するファイルの所有者を root ではなく自分にするためによく使います。

docker run --rm -u "$(id -u):$(id -g)" -v "$(pwd):/work" -w /work node:24-alpine npm install

読み取り専用ファイルシステム

$ docker run --rm --read-only alpine:3.23 touch /hello
touch: /hello: Read-only file system

--read-only を指定すると、コンテナのファイルシステム全体が読み取り専用になり、プログラムが侵入されてもファイルを変更できません。書き込みが必要な場所には --tmpfs /tmp または Volume を使って書き込みを許可してください。詳しくはセキュリティのベストプラクティスを参照してください。

その他の便利なパラメーター

パラメーター説明
--init小さな init プロセスを PID 1 として使い、シグナルを正しく転送します(docker stop が 10 秒待たずに済みます。コンテナのライフサイクルを参照)
--platformプラットフォームを指定します。例:linux/amd64
--add-hosthosts レコードを追加します。例:--add-host host.docker.internal:host-gateway
--labelフィルタリングに便利なラベルを追加します
--pull always実行前に毎回イメージを再取得します
--log-opt max-size=10mログファイルのサイズを制限します

その他のオプション早見表

以下は docker run --help(Docker 29)をもとに、この章では詳しく紹介していないものの、実用的なオプションをまとめたものです。全一覧は docker run --help を実行してください。

分類オプション説明
セキュリティ--cap-add / --cap-dropLinux capabilities を追加または削除します。実際の使用例はセキュリティのベストプラクティスを参照してください
セキュリティ--security-optno-new-privileges や seccomp の設定など、セキュリティオプションを指定します
セキュリティ--privilegedコンテナにすべての権限を与え、隔離をほぼ無効にします。使用は避けてください
セキュリティ--userns使用する user namespace を指定します
ヘルスチェック--health-cmd--health-cmd "curl -f http://localhost/" など、ヘルスチェックのコマンドを指定します
ヘルスチェック--health-interval / --health-timeout / --health-retriesチェック間隔、タイムアウト、何回連続で失敗したら unhealthy とするかを指定します
ヘルスチェック--health-start-period / --health-start-interval起動時の猶予期間とチェック間隔を指定します
ヘルスチェック--no-healthcheckイメージに設定された HEALTHCHECK を無効にします
ネットワーク--network-aliasネットワーク上で別名を追加します。docker networkを参照してください
ネットワーク--ipカスタムネットワーク内で固定 IP を指定します
ネットワーク--dns / --dns-searchDNS サーバーと検索ドメインを指定します
ネットワーク--exposeポートを宣言します(ホストには割り当てません)。Dockerfile の EXPOSE と同じ効果です
ネットワーク-P, --publish-all宣言済みのすべてのポートを、ランダムなホストポートに割り当てます
停止--stop-signaldocker stop が送信するシグナルを指定します。デフォルトは SIGTERM です
停止--stop-timeoutdocker stop が待機する秒数を指定します。デフォルトは 10 秒です
リソース--cpuset-cpus使用する CPU を指定します。例:0,1 または 0-3
リソース-c, --cpu-sharesCPU の相対的な重みを指定します(リソースを競合した場合にのみ有効です)
リソース--memory-reservationメモリのソフト上限を指定します
リソース--shm-size/dev/shm のサイズを指定します。PostgreSQL やブラウザーなどのプログラムでは拡大が必要なことがあります
リソース--ulimitたとえば --ulimit nofile=65535:65535 で、開けるファイル数の上限を調整します
リソース--oom-kill-disableメモリ不足時の強制終了を無効にします(--memory と併用してください)
デバイス--device/dev/ttyUSB0 など、ホストのデバイスをコンテナに渡します
デバイス--gpus--gpus all などで GPU を使用します(NVIDIA Container Toolkit が必要です)
名前空間--pid host / --ipc / --utsホストまたは別のコンテナの名前空間を共有します。仕組みは内部の仕組みを参照してください
システム--sysctlnet.core.somaxconn=1024 など、コンテナのカーネルパラメーターを設定します
システム--umaskコンテナ内のプロセスの umask を指定します
マウント--volumes-from別のコンテナのすべての Volume をマウントします
その他--cidfileスクリプトで使いやすいよう、コンテナ ID をファイルに書き込みます
その他--label-fileファイルからラベルを読み込みます
その他--log-driverjson-file、local、syslog などのログドライバーを指定します
その他-q, --quietイメージのダウンロード中に進行状況を表示しません
その他--use-api-socketDocker API socket とログイン認証情報をコンテナにマウントします(ホストの root 権限と同等です。セキュリティのベストプラクティスを参照してください)

よく使う組み合わせの例

# 1. 使い捨てのツールコンテナ:現在のディレクトリでコマンドを実行
docker run --rm -v "$(pwd):/data" -w /data alpine:3.23 ls -la

# 2. ローカル開発用データベース:ローカルからの接続のみ許可
docker run -d --name devdb --restart unless-stopped \
  -p 127.0.0.1:5432:5432 \
  -e POSTGRES_PASSWORD=dev \
  -v devdb:/var/lib/postgresql \
  postgres:18

# 3. 本番サービス:リソースとログサイズを制限
docker run -d --name api --restart unless-stopped \
  --memory 1g --cpus 2 \
  --log-opt max-size=10m --log-opt max-file=3 \
  --env-file .env -p 3000:3000 \
  myorg/api:1.4.2
# 1. 使い捨てのツールコンテナ:現在のディレクトリでコマンドを実行
docker run --rm -v "${PWD}:/data" -w /data alpine:3.23 ls -la

# 2. ローカル開発用データベース:ローカルからの接続のみ許可
docker run -d --name devdb --restart unless-stopped `
  -p 127.0.0.1:5432:5432 `
  -e POSTGRES_PASSWORD=dev `
  -v devdb:/var/lib/postgresql `
  postgres:18

# 3. 本番サービス:リソースとログサイズを制限
docker run -d --name api --restart unless-stopped `
  --memory 1g --cpus 2 `
  --log-opt max-size=10m --log-opt max-file=3 `
  --env-file .env -p 3000:3000 `
  myorg/api:1.4.2
# 1. 使い捨てのツールコンテナ:現在のディレクトリでコマンドを実行
docker run --rm -v "%cd%:/data" -w /data alpine:3.23 ls -la

# 2. ローカル開発用データベース:ローカルからの接続のみ許可
docker run -d --name devdb --restart unless-stopped ^
  -p 127.0.0.1:5432:5432 ^
  -e POSTGRES_PASSWORD=dev ^
  -v devdb:/var/lib/postgresql ^
  postgres:18

# 3. 本番サービス:リソースとログサイズを制限
docker run -d --name api --restart unless-stopped ^
  --memory 1g --cpus 2 ^
  --log-opt max-size=10m --log-opt max-file=3 ^
  --env-file .env -p 3000:3000 ^
  myorg/api:1.4.2

オプションが増えると、コマンドの管理が難しくなります。長時間実行する場合や複数のコンテナを連携させる場合は、Docker Composeを使って設定をファイルに記述することをおすすめします。

まとめ

  • オプションはイメージ名の前に記述し、その後ろにはコンテナ内で実行するコマンドを記述します。
  • よく使う組み合わせは -d、--rm、--name、-p、-v、-e です。
  • --memory、--cpus、--pids-limit でリソースを制限します。
  • --entrypoint、-u、-w でイメージのデフォルト値を上書きします。

練習問題

練習 1:バックグラウンドで nginx:1.30-alpine を実行するコマンドを書いてください。名前は site、ローカルからのみ 8080 ポートに接続できるようにし、メモリ上限を 128 MB に設定して、終了後にコンテナを保持しないようにします。

解答
docker run -d --rm --name site -p 127.0.0.1:8080:80 --memory 128m nginx:1.30-alpine

--rm によって、コンテナは停止後に自動的に削除されます。

練習 2:postgres:18 イメージの ENTRYPOINT はデータベースを起動します。データベースを起動せずに、その shell だけに入るにはどうすればよいですか?

解答
docker run --rm -it --entrypoint sh postgres:18

--entrypoint はイメージの ENTRYPOINT を上書きします。

よくある質問

イメージ名の後に引数を書くと、なぜ反映されないのですか?

イメージ名の後の内容は、コンテナ内で実行するコマンドとして扱われます。docker run の引数は必ずイメージ名より前に書いてください。

-p 8080:80 と -p 127.0.0.1:8080:80 はどう違いますか?

前者はすべてのネットワークインターフェースにバインドするため、ほかのコンピューターからも接続できます。後者はローカルホストのみにバインドします。データベースなど外部公開が不要なサービスでは、後者を使うか -p を付けないでください。

docker run には引数がいくつありますか?

Docker 29 の docker run --help には約 100 個の引数が記載されています。この章ではよく使うものを紹介し、最後の「その他の引数リファレンス」で便利な引数をまとめています。

更新日 2026年10月14日