Docker: `docker run` でコンテナを起動する
最終更新:2026-08-26
docker run は最も頻繁に使われる Docker コマンドです — コンテナを作成して起動します。そのパラメータをマスターすることは、コンテナ実行 essentials をマスターすることを意味します。
1. 学べること
docker runの主要パラメータ- フォアグラウンド実行とバックグラウンド実行モード
- ポートマッピングの仕組み
- コンテナ命名と自動クリーンアップ
- リソース制限(CPU/メモリ)
2. バックエンド開発者の実話
(1) 問題点:複数バージョンのデータベース間の競合
Alice はローカルマシン上で PostgreSQL の 3 つのバージョン(v15、v14、v13)を同時に実行して互換性テストを行う必要があります。従来のインストール方法では、一度に 1 バージョンしかインストールできず、バージョンを切り替えるにはアンインストールと再インストールが必要で、毎回 30 分かかります。さらに悪いことに、異なるバージョンの設定ファイルとデータディレクトリが互いに競合する可能性があります。
(2) 複数の Docker コンテナを並列実行するソリューション
Docker を使って、たった 1 つのコマンドで 3 つの PostgreSQL インスタンスを起動し、それぞれを異なるポートにマッピングしました。
# 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) 基本構文
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 サービスをバックグラウンドで起動 (難易度: ⭐)
# Nginx をデタッチモードで実行
docker run -d -p 8080:80 --name web nginx:latest
# バックグラウンドコンテナのログを表示
docker logs web
a1b2c3d4e5f6... (コンテナ ID)
/docker-entrypoint.sh: Launching nginx...
▶ サンプル:インタラクティブな Ubuntu コンテナを起動 (難易度: ⭐⭐)
# Ubuntu をインタラクティブターミナルで実行
docker run -it ubuntu:22.04 bash
# コンテナ内:OS 情報を確認
cat /etc/os-release
# コンテナを終了
exit
root@a1b2c3d4e5f6:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
...
root@a1b2c3d4e5f6:/# exit
exit はコンテナを停止します。コンテナから切り離して実行状態を維持したい場合は、Ctrl+P を押してから Ctrl+Q を押してください(デタッチショートカット)。
5. ポートマッピング
デフォルトでは、コンテナ内部のサービスポートは外部からアクセスできません。ポートマッピングはコンテナのポートをホストに公開します。
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 のマルチポートマッピング (難易度: ⭐⭐)
# 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
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 で一時タスクを実行 (難易度: ⭐)
# 単発コマンドを実行、終了後にコンテナ自動削除
docker run --rm alpine:latest echo "Hello from Alpine!"
# 検証:コンテナが消えている
docker ps -a
Hello from Alpine!
--rm は特に CI/CD のビルドタスクや一時的なテストに適しており、コンテナの蓄積を防ぐのに役立ちます。
(2) 再起動ポリシー
再起動ポリシーは、コンテナが終了した後に自動的に再起動するかどうかを決定します。
| 戦略 | 動作 | 適用シナリオ |
|---|---|---|
no(デフォルト) |
再起動しない | 一時タスク |
on-failure[:max] |
ゼロ以外の終了時に再起動(再起動回数の制限オプション付き) | 散発的にクラッシュする可能性のあるサービス |
always |
継続的に再起動(デーモンの手動停止後の再起動も含む) | コアサービス(Web/DB) |
unless-stopped |
「always」と似ているが、手動停止後は再起動しない | 手動制御が必要なサービス |
▶ サンプル:自動再起動を設定 (難易度: ⭐⭐)
# Nginx を再起動ポリシーで実行
docker run -d --name web --restart=always -p 8080:80 nginx:latest
# クラッシュをシミュレート:コンテナプロセスを kill
docker kill web
# 数秒待ち、確認:自動的に再起動された
docker ps
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 に制限 (難易度: ⭐⭐)
# メモリ制限 256 MB のコンテナを実行
docker run -d --name limited-app --memory=256m nginx:latest
# メモリ制限を検証
docker inspect limited-app --format='{{.HostConfig.Memory}}'
268435456
8. コンテナライフサイクルと状態遷移
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 コンテナを起動
# ============================================
# 完全なチュートリアル: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}}'
# 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
❓ よくある質問
-d と -it を一緒に使えますか?-d はバックグラウンドで実行され、-it はインタラクティブターミナルです。両者は相互に排他的です。コンテナをバックグラウンドで実行し、時々アクセスする必要がある場合は、-d で起動してから docker exec -it でコンテナに入ります。-v でボリュームをマウントしていない場合、コンテナが削除されるときにデータは失われます。コンテナが停止(stop)した後もデータは残りますが、削除(rm)された後は消えます。データを永続化するには、必ずボリュームまたはバインドマウントを使用してください。--rm はいつ使うべきですか?--rm を追加して、ビルドノードでのコンテナバックログを防ぐ必要があります。-p 8080:80 の 2 つのポート番号はどちらがどちらですか?host IP:8080 にアクセスすると、コンテナ内のポート 80 で実行されているサービスに移動します。docker system df で詳細な使用量を確認できます。docker run のすべてのパラメータを表示するには?docker run --help ですべてのパラメータが一覧表示されます。このレッスンでカバーした 15 個程度の最も一般的に使用されるものがそこにあります。残りは必要に応じて参照してください。📖 まとめ
docker run= コンテナを作成して起動する。最も essential な Docker コマンド-dバックグラウンドサービスとして実行、-itインタラクティブデバッグ。両者は相互に排他的- ポートマッピング
-p host:containerはコンテナサービスをホストに公開する --rmは一時タスクの自動クリーンアップに使用、--restartはサービスの自動復旧に使用--memory/--cpusはリソースを制限し、単一のコンテナがすべてのホストリソースを使い果たすのを防ぐ- コンテナには完全な状態ライフサイクルがある:Created → Running → Paused → Stopped → Deleted
📝 練習問題
- 基本練習 (難易度: ⭐): ローカルマシン上でポート 8080 にマッピングされた Nginx コンテナを起動し、ブラウザでアクセスしてページが正しく表示されることを確認してください。
- 応用問題 (難易度 ⭐⭐): インタラクティブな Ubuntu コンテナを起動し、コンテナ内で
apt update && apt install -y curlを実行し、curlを使って Web ページにアクセスしてください。 - チャレンジ (難易度: ⭐⭐⭐): コンテナのメモリを 256MB に制限し、ストレステストツール(
progrium/stressなど)を実行して、メモリ超過時にコンテナが OOM(Out of Memory)エラーで強制終了されるかどうかを観察してください(ヒント:docker events --filter event=oom)。