イメージを理解したところで、次はコンテナの操作を学びましょう。この記事では、Dockerコンテナの実行と管理に必要なすべての基本操作をカバーします。
最初のコンテナを実行する
docker runコマンドは、イメージから新しいコンテナを作成して起動します:
# 基本構文
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# nginxを実行
docker run nginx
# カスタムコマンドで実行
docker run alpine echo "Hello, Docker!"
よく使うrunオプション
| オプション | 説明 | 例 |
|---|---|---|
-d |
デタッチモード(バックグラウンド)で実行 | docker run -d nginx |
-p |
ポートマッピング(ホスト:コンテナ) | docker run -p 8080:80 nginx |
--name |
名前を割り当て | docker run --name web nginx |
-e |
環境変数を設定 | docker run -e DEBUG=true app |
-v |
ボリュームをマウント | docker run -v /data:/app/data app |
--rm |
終了時にコンテナを削除 | docker run --rm alpine echo "hi" |
-it |
インタラクティブ+TTY | docker run -it alpine sh |
実践的な例
# Webサーバーをバックグラウンドで実行、ポート8080でアクセス可能
docker run -d -p 8080:80 --name my-nginx nginx
# インタラクティブシェルを実行
docker run -it --name my-alpine alpine sh
# 環境変数付きで実行
docker run -d -e MYSQL_ROOT_PASSWORD=secret --name my-mysql mysql:8
# 自動クリーンアップ付きで実行
docker run --rm alpine cat /etc/os-release
コンテナのライフサイクル
コンテナのライフサイクルを理解することは、効果的な管理に不可欠です:
stateDiagram-v2
[*] --> Created: docker create
Created --> Running: docker start
Running --> Paused: docker pause
Paused --> Running: docker unpause
Running --> Stopped: docker stop
Stopped --> Running: docker start
Running --> Stopped: docker kill
Stopped --> Deleted: docker rm
Deleted --> [*]
ライフサイクルコマンド
# 起動せずに作成
docker create --name my-container nginx
# 作成済みまたは停止中のコンテナを起動
docker start my-container
# 実行中のコンテナを停止(正常終了)
docker stop my-container
# コンテナを強制終了(即時)
docker kill my-container
# コンテナを再起動
docker restart my-container
# 一時停止/再開
docker pause my-container
docker unpause my-container
# 停止中のコンテナを削除
docker rm my-container
# 実行中のコンテナを強制削除
docker rm -f my-container
コンテナの一覧表示
実行中のコンテナを表示
# 実行中のコンテナを一覧
docker ps
# 出力:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc123def456 nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp my-nginx
すべてのコンテナを表示
# すべてのコンテナを一覧(停止中を含む)
docker ps -a
# コンテナIDのみ表示
docker ps -q
# 最後に作成されたコンテナを表示
docker ps -l
# コンテナをフィルタ
docker ps -f "status=exited"
docker ps -f "name=my-"
# カスタムフォーマットで出力
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
ステータスの理解
| ステータス | 説明 |
|---|---|
Created |
コンテナは作成されたが起動されていない |
Up X minutes |
コンテナは実行中 |
Exited (0) |
コンテナは正常に停止した |
Exited (1) |
コンテナはエラーで停止した |
Paused |
コンテナは一時停止中 |
Restarting |
コンテナは再起動中 |
コンテナのログ
ログはデバッグと監視に不可欠です:
# すべてのログを表示
docker logs my-nginx
# リアルタイムでログを追跡
docker logs -f my-nginx
# 最後のN行を表示
docker logs --tail 100 my-nginx
# タイムスタンプ付きでログを表示
docker logs -t my-nginx
# 特定の時間以降のログを表示
docker logs --since 2025-01-18T10:00:00 my-nginx
docker logs --since 30m my-nginx
# オプションを組み合わせる
docker logs -f --tail 50 -t my-nginx
ロギングドライバー
Dockerは異なるロギングドライバーをサポートしています:
# 特定のロギングドライバーで実行
docker run -d --log-driver json-file --log-opt max-size=10m nginx
# ロギングドライバーを確認
docker inspect --format='{{.HostConfig.LogConfig.Type}}' my-nginx
| ドライバー | 説明 |
|---|---|
json-file |
デフォルト、JSONとしてログを保存 |
syslog |
syslogに書き込み |
journald |
systemd journalに書き込み |
fluentd |
Fluentdに送信 |
awslogs |
AWS CloudWatchに送信 |
none |
ロギングを無効化 |
コンテナ内でコマンドを実行
docker execコマンドは実行中のコンテナ内でコマンドを実行します:
# 単一のコマンドを実行
docker exec my-nginx cat /etc/nginx/nginx.conf
# インタラクティブシェルを開始
docker exec -it my-nginx bash
docker exec -it my-nginx sh # Alpineベースのイメージの場合
# 特定のユーザーとして実行
docker exec -u root my-nginx whoami
# コマンドに環境変数を設定
docker exec -e MY_VAR=value my-nginx env
# 作業ディレクトリを設定
docker exec -w /var/log my-nginx ls
よくある使用例
# プロセスリストを確認
docker exec my-nginx ps aux
# 環境変数を表示
docker exec my-nginx env
# ネットワーク問題をデバッグ
docker exec my-nginx curl localhost
# データベースCLIにアクセス
docker exec -it my-mysql mysql -u root -p
# デバッグツールをインストール(一時的)
docker exec my-nginx apt-get update && apt-get install -y curl
コンテナの検査
コンテナの詳細情報を取得します:
# 完全な検査(JSON出力)
docker inspect my-nginx
# 特定のフィールドを取得
docker inspect --format='{{.State.Status}}' my-nginx
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx
# 環境変数を取得
docker inspect --format='{{json .Config.Env}}' my-nginx | jq
# マウントされたボリュームを取得
docker inspect --format='{{json .Mounts}}' my-nginx | jq
便利なinspectクエリ
| クエリ | 出力 |
|---|---|
{{.State.Status}} |
実行状態 |
{{.State.StartedAt}} |
開始時刻 |
{{.NetworkSettings.IPAddress}} |
コンテナIP |
{{.Config.Env}} |
環境変数 |
{{.HostConfig.Memory}} |
メモリ制限 |
{{.Mounts}} |
ボリュームマウント |
コンテナのプロセスを表示
# コンテナ内のプロセスを表示
docker top my-nginx
# 出力:
UID PID PPID C STIME TTY TIME CMD
root 1234 1233 0 10:00 ? 00:00:00 nginx: master process
nginx 1235 1234 0 10:00 ? 00:00:00 nginx: worker process
リソース使用状況の統計
# リアルタイムのリソース使用量を表示
docker stats
# 特定のコンテナの統計を表示
docker stats my-nginx my-mysql
# ストリーミングなしで統計を表示
docker stats --no-stream
# カスタムフォーマット
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
abc123def456 my-nginx 0.00% 2.5MiB / 7.77GiB 0.03% 1.2kB / 1.1kB 0B / 0B
ファイルのコピー
コンテナとホスト間でファイルをコピーします:
# コンテナからホストにコピー
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
# ホストからコンテナにコピー
docker cp ./custom.conf my-nginx:/etc/nginx/conf.d/
# ディレクトリ全体をコピー
docker cp my-nginx:/var/log/nginx/ ./logs/
# 停止中のコンテナからもコピー可能
docker cp stopped-container:/data ./backup/
コンテナの再起動ポリシー
自動再起動の動作を設定します:
# 常に再起動
docker run -d --restart always nginx
# 失敗時のみ再起動
docker run -d --restart on-failure nginx
# 失敗時に最大試行回数で再起動
docker run -d --restart on-failure:5 nginx
# 手動で停止しない限り再起動
docker run -d --restart unless-stopped nginx
| ポリシー | 説明 |
|---|---|
no |
再起動しない(デフォルト) |
always |
常に再起動 |
on-failure |
非ゼロ終了時のみ再起動 |
on-failure:N |
失敗時に再起動、最大N回 |
unless-stopped |
alwaysと同様だが手動停止を尊重 |
再起動ポリシーの更新
# 既存のコンテナのポリシーを更新
docker update --restart unless-stopped my-nginx
コンテナへのアタッチ
# 実行中のコンテナのメインプロセスにアタッチ
docker attach my-nginx
# 停止せずにデタッチ: Ctrl+P, Ctrl+Q
注意: attachはメインプロセス(PID 1)に接続します。新しいシェルにはexecを使用してください。
コンテナの名前変更
docker rename old-name new-name
一括操作
# すべての実行中のコンテナを停止
docker stop $(docker ps -q)
# すべての停止中のコンテナを削除
docker rm $(docker ps -aq -f "status=exited")
# すべてのコンテナを削除(注意!)
docker rm -f $(docker ps -aq)
# システムプルーン(未使用データを削除)
docker system prune
# 未使用のすべてを削除
docker system prune -a --volumes
Docker Debugでのデバッグ
シェルのない最小イメージの場合:
# デバッグセッションを開始(Docker Desktop機能)
docker debug my-nginx
# または、デバッグコンテナを使用
docker run -it --rm --pid=container:my-nginx \
--net=container:my-nginx \
nicolaka/netshoot
ベストプラクティス
1. 常にコンテナに名前を付ける
# 良い例
docker run -d --name redis-cache redis
# 自動生成名は避ける
docker run -d redis # "eager_pike"のようなランダムな名前になる
2. 本番環境では再起動ポリシーを使用
docker run -d --restart unless-stopped --name web nginx
3. リソース制限を設定
docker run -d \
--memory=512m \
--cpus=0.5 \
--name limited-app \
myapp
4. 定期的にクリーンアップ
# 終了したコンテナを削除
docker container prune
# 確認付きで削除
docker container prune -f
クイックリファレンス表
| 操作 | コマンド |
|---|---|
| コンテナを実行 | docker run -d --name NAME IMAGE |
| 実行中を一覧 | docker ps |
| すべてを一覧 | docker ps -a |
| コンテナを停止 | docker stop NAME |
| コンテナを起動 | docker start NAME |
| 再起動 | docker restart NAME |
| ログを表示 | docker logs -f NAME |
| コマンドを実行 | docker exec -it NAME sh |
| 検査 | docker inspect NAME |
| 統計を表示 | docker stats NAME |
| ファイルをコピー | docker cp NAME:/path ./local |
| 削除 | docker rm NAME |
重要なポイント
- バックグラウンドには
-d- サービスにはデタッチモードで実行 - インタラクティブには
-it- シェルやデバッグに使用 - 一時的には
--rm- 一回限りのコマンドには自動クリーンアップ attachではなくexecを使用 -execは新しいプロセスを開始、attachはPID 1に接続- 再起動ポリシーを設定 - サービスが障害から復旧できるように
- ログと統計で監視 - デバッグとパフォーマンスに不可欠
次のステップ
次の記事では、Dockerfileを使ってカスタムイメージを作成する方法を学びます。ゼロから独自のコンテナを定義しましょう。
参考文献
- Docker Deep Dive, 5th Edition - Nigel Poulton
- The Ultimate Docker Container Book, 3rd Edition - Dr. Gabriel N. Schenker
- Docker CLIリファレンス