Docker: `docker run` でコンテナを起動する

最終更新:2026-08-26

docker run は最も頻繁に使われる Docker コマンドです — コンテナを作成して起動します。そのパラメータをマスターすることは、コンテナ実行 essentials をマスターすることを意味します。

1. 学べること


2. バックエンド開発者の実話

(1) 問題点:複数バージョンのデータベース間の競合

Alice はローカルマシン上で PostgreSQL の 3 つのバージョン(v15、v14、v13)を同時に実行して互換性テストを行う必要があります。従来のインストール方法では、一度に 1 バージョンしかインストールできず、バージョンを切り替えるにはアンインストールと再インストールが必要で、毎回 30 分かかります。さらに悪いことに、異なるバージョンの設定ファイルとデータディレクトリが互いに競合する可能性があります。

(2) 複数の Docker コンテナを並列実行するソリューション

Docker を使って、たった 1 つのコマンドで 3 つの PostgreSQL インスタンスを起動し、それぞれを異なるポートにマッピングしました。

BASH
# 3 つの PostgreSQL バージョンを並行して実行
docker run -d --name pg15 -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres:15
docker run -d --name pg14 -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres:14
docker run -d --name pg13 -e POSTGRES_PASSWORD=secret -p 5434:5432 postgres:13

(3) メリット:ゼロ競合で複数バージョンが並列実行

3 つの PostgreSQL インスタンスが互いに干渉することなく並列実行され、Alice はクロスバージョン互換性テストを 5 分で完了しました — 従来の方法なら 2 時間かかる作業です。


3. docker run 構文と主要パラメータ

(1) 基本構文

BASH
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
コンポーネント 説明
OPTIONS ランタイムパラメータ(ポート/環境/リソースなど) -d -p 8080:80 --name web
IMAGE イメージ名:タグ nginx:latest / postgres:15
COMMAND イメージのデフォルト起動コマンドを上書き bash / sleep 3600
ARG COMMAND に渡される引数 -c "echo hello"

(2) 一般的なパラメータのクイックリファレンス

パラメータ 機能
-d バックグラウンドで実行(detached) docker run -d nginx
-it インタラクティブターミナル docker run -it ubuntu bash
-p ポートマッピング(ホスト:コンテナ) -p 8080:80
-P ランダムポートマッピング docker run -P nginx
--name コンテナ命名 --name my-app
--rm ログアウト後に自動削除 docker run --rm alpine echo hi
-e 環境変数を設定 -e MYSQL_ROOT_PASSWORD=secret
-v ボリュームマウント(ホスト:コンテナ) -v /data:/var/lib/mysql
--restart 再起動ポリシー --restart=always
--cpus CPU 制限 --cpus=1.5
--memory メモリ制限 --memory=256m
--network ネットワーク指定 --network=my-net
-w 作業ディレクトリ -w /app
--user 実行ユーザー --user 1000:1000

4. フォアグラウンド実行 vs バックグラウンド実行

コンテナには 2 つの実行モードがあり、-it-d で制御されます。

(1) 実行モードの比較

観点 フォアグラウンドモード -it バックグラウンドモード -d
ターミナル占有 現在のターミナルを占有 ターミナルを解放
出力表示 ターミナルに直接出力 docker logs で表示
ユースケース 対話とデバッグ サービス指向アプリ(Web/DB)
終了方法 Ctrl+C または exit docker stop
docker run -it ubuntu bash docker run -d nginx

▶ サンプル:Nginx サービスをバックグラウンドで起動 (難易度: ⭐)

BASH
# Nginx をデタッチモードで実行
docker run -d -p 8080:80 --name web nginx:latest

# バックグラウンドコンテナのログを表示
docker logs web
💻 出力:

TEXT 📖 参照専用
a1b2c3d4e5f6... (コンテナ ID)
/docker-entrypoint.sh: Launching nginx...

▶ サンプル:インタラクティブな Ubuntu コンテナを起動 (難易度: ⭐⭐)

BASH
# Ubuntu をインタラクティブターミナルで実行
docker run -it ubuntu:22.04 bash

# コンテナ内:OS 情報を確認
cat /etc/os-release

# コンテナを終了
exit
💻 出力:

TEXT 📖 参照専用
root@a1b2c3d4e5f6:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
...
root@a1b2c3d4e5f6:/# exit
⚠️ 注意: exit はコンテナを停止します。コンテナから切り離して実行状態を維持したい場合は、Ctrl+P を押してから Ctrl+Q を押してください(デタッチショートカット)。


5. ポートマッピング

デフォルトでは、コンテナ内部のサービスポートは外部からアクセスできません。ポートマッピングはコンテナのポートをホストに公開します。

100%
graph LR
    A["ホスト<br/>ポート 8080"] -->|"-p 8080:80"| B["コンテナ<br/>ポート 80"]
    C["ホスト<br/>ポート 5432"] -->|"-p 5432:5432"| D["コンテナ<br/>ポート 5432"]

(1) ポートマッピングポリシー

方法 構文 説明
ポート指定 -p host:container ホストポート → コンテナポート -p 8080:80
アドレス指定 -p ip:host:container 特定の IP にバインド -p 127.0.0.1:8080:80
ランダムポート -P ホストのランダムポートに自動マッピング -P
範囲マッピング -p 8080-8090:80-90 ポート範囲マッピング Linux のみ

▶ サンプル:PostgreSQL のマルチポートマッピング (難易度: ⭐⭐)

BASH
# PostgreSQL をポートマッピングと環境変数で実行
docker run -d \
  --name pg15 \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  postgres:15

# PostgreSQL に接続
docker exec -it pg15 psql -U postgres -d myapp
💻 出力:

TEXT 📖 参照専用
myapp=# \l
                                  List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    
 ----------+----------+----------+------------+------------
  myapp    | postgres | UTF8     | en_US.utf8 | en_US.utf8
  postgres | postgres | UTF8     | en_US.utf8 | en_US.utf8

6. 自動クリーンアップと再起動ポリシー

(1) --rm 一時コンテナ

--rm コンテナ終了後に自動的に削除されます。一回限りのタスクに適しています。

▶ サンプル:--rm で一時タスクを実行 (難易度: ⭐)

BASH
# 単発コマンドを実行、終了後にコンテナ自動削除
docker run --rm alpine:latest echo "Hello from Alpine!"

# 検証:コンテナが消えている
docker ps -a
💻 出力:

TEXT 📖 参照専用
Hello from Alpine!
💡 ヒント: --rm は特に CI/CD のビルドタスクや一時的なテストに適しており、コンテナの蓄積を防ぐのに役立ちます。

(2) 再起動ポリシー

再起動ポリシーは、コンテナが終了した後に自動的に再起動するかどうかを決定します。

戦略 動作 適用シナリオ
no(デフォルト) 再起動しない 一時タスク
on-failure[:max] ゼロ以外の終了時に再起動(再起動回数の制限オプション付き) 散発的にクラッシュする可能性のあるサービス
always 継続的に再起動(デーモンの手動停止後の再起動も含む) コアサービス(Web/DB)
unless-stopped 「always」と似ているが、手動停止後は再起動しない 手動制御が必要なサービス

▶ サンプル:自動再起動を設定 (難易度: ⭐⭐)

BASH
# Nginx を再起動ポリシーで実行
docker run -d --name web --restart=always -p 8080:80 nginx:latest

# クラッシュをシミュレート:コンテナプロセスを kill
docker kill web

# 数秒待ち、確認:自動的に再起動された
docker ps
💻 出力:

TEXT 📖 参照専用
CONTAINER ID   IMAGE          STATUS                     PORTS                  NAMES
b2c3d4e5f6a7   nginx:latest   Up 3 seconds (healthy)     0.0.0.0:8080->80/tcp   web

7. リソース制限

Docker はコンテナが使用する CPU とメモリの量を制限でき、単一のコンテナがホストのリソースを使い果たすことを防ぎます。

(1) リソース制限パラメータ

リソース パラメータ 説明
CPU コア数 --cpus 使用する最大 CPU コア数 --cpus=1.5
CPU 重み --cpu-shares 相対的重み(デフォルト 1024) --cpu-shares=512
メモリ制限 --memory / -m 最大メモリ --memory=256m
スワップ --memory-swap メモリ + スワップの最大 --memory-swap=512m

▶ サンプル:コンテナメモリを 256MB に制限 (難易度: ⭐⭐)

BASH
# メモリ制限 256 MB のコンテナを実行
docker run -d --name limited-app --memory=256m nginx:latest

# メモリ制限を検証
docker inspect limited-app --format='{{.HostConfig.Memory}}'
💻 出力:

TEXT 📖 参照専用
268435456
⚠️ 注意: 268435456 バイト = 256 MB。メモリ制限を超えたコンテナは OOM Killer によって終了されます(終了コード 137)。


8. コンテナライフサイクルと状態遷移

100%
stateDiagram-v2
    [*] --> Created : docker create / docker run
    Created --> Running : docker start / docker run
    Running --> Paused : docker pause
    Paused --> Running : docker unpause
    Running --> Stopped : docker stop / docker kill
    Stopped --> Running : docker start
    Running --> Restarting : crash + restart policy
    Restarting --> Running : restart succeeds
    Stopped --> Deleted : docker rm
    Running --> Deleted : docker rm -f
    Deleted --> [*]

9. 完全な例:環境変数で PostgreSQL コンテナを起動

BASH
# ============================================
# 完全なチュートリアル:Docker で PostgreSQL を実行
# 範囲:-d、-e、-p、--name、--restart、--memory
# ============================================

# 1. 完全な設定で PostgreSQL 15 を実行
docker run -d \
  --name pg15 \
  -e POSTGRES_USER=appuser \
  -e POSTGRES_PASSWORD=secret123 \
  -e POSTGRES_DB=appdb \
  -p 5432:5432 \
  --restart=unless-stopped \
  --memory=512m \
  postgres:15

# 2. コンテナが実行中であることを確認
docker ps

# 3. コンテナ内の psql クライアント経由で接続
docker exec -it pg15 psql -U appuser -d appdb

# 4. psql 内:テストテーブルを作成
# CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(100));
# INSERT INTO users (name) VALUES ('Alice'), ('Bob');
# SELECT * FROM users;

# 5. コンテナのリソース使用状況を確認
docker stats pg15 --no-stream

# 6. コンテナ設定を表示
docker inspect pg15 --format='Memory: {{.HostConfig.Memory}}, RestartPolicy: {{.HostConfig.RestartPolicy.Name}}'
💻 出力(抜粋):

TEXT 📖 参照専用
# docker ps
CONTAINER ID   IMAGE         STATUS         PORTS                    NAMES
a1b2c3d4e5f6   postgres:15   Up 30 seconds  0.0.0.0:5432->5432/tcp   pg15

# docker stats --no-stream
CONTAINER ID   NAME   CPU %   MEM USAGE / LIMIT   MEM %
a1b2c3d4e5f6   pg15   0.02%   38.5MiB / 512MiB    7.52%

# docker inspect --format
Memory: 536870912, RestartPolicy: unless-stopped

❓ よくある質問

Q -d-it を一緒に使えますか?
A いいえ。-d はバックグラウンドで実行され、-it はインタラクティブターミナルです。両者は相互に排他的です。コンテナをバックグラウンドで実行し、時々アクセスする必要がある場合は、-d で起動してから docker exec -it でコンテナに入ります。
Q コンテナが終了したときデータは失われますか?
A -v でボリュームをマウントしていない場合、コンテナが削除されるときにデータは失われます。コンテナが停止(stop)した後もデータは残りますが、削除(rm)された後は消えます。データを永続化するには、必ずボリュームまたはバインドマウントを使用してください。
Q --rm はいつ使うべきですか?
A 一回限りのタスク:テストの実行、スクリプトの実行、ツールバージョンの確認。永続データを必要とするサービスには適していません。CI/CD パイプラインのほぼすべてのステップに --rm を追加して、ビルドノードでのコンテナバックログを防ぐ必要があります。
Q -p 8080:80 の 2 つのポート番号はどちらがどちらですか?
A 左のポート(8080)はホストポート、右のポート(80)はコンテナポートです。記憶法:「左がホスト、右がコンテナ」。host IP:8080 にアクセスすると、コンテナ内のポート 80 で実行されているサービスに移動します。
Q コンテナはどれくらいのディスクスペースを占有しますか?
A 各コンテナの書き込み可能レイヤー(変更可能な部分)は通常、数 KB から数十 MB しか占有しません。コンテナはイメージを複製せず、イメージの読み取り専用レイヤーを共有します。合計使用量 = イメージサイズ + コンテナの書き込み可能レイヤー。docker system df で詳細な使用量を確認できます。
Q docker run のすべてのパラメータを表示するには?
A docker run --help ですべてのパラメータが一覧表示されます。このレッスンでカバーした 15 個程度の最も一般的に使用されるものがそこにあります。残りは必要に応じて参照してください。

📖 まとめ


📝 練習問題

  1. 基本練習 (難易度: ⭐): ローカルマシン上でポート 8080 にマッピングされた Nginx コンテナを起動し、ブラウザでアクセスしてページが正しく表示されることを確認してください。
  2. 応用問題 (難易度 ⭐⭐): インタラクティブな Ubuntu コンテナを起動し、コンテナ内で apt update && apt install -y curl を実行し、curl を使って Web ページにアクセスしてください。
  3. チャレンジ (難易度: ⭐⭐⭐): コンテナのメモリを 256MB に制限し、ストレステストツール(progrium/stressなど)を実行して、メモリ超過時にコンテナが OOM(Out of Memory)エラーで強制終了されるかどうかを観察してください(ヒント: docker events --filter event=oom)。
前のレッスン: Docker のインストールと環境設定 次のレッスン: イメージ管理 — プル / list / 削除
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%