コンテナ操作

コンテナ起動の主要オプション

# デタッチモード(バックグラウンド実行)
docker run -d nginx

# コンテナ名を指定
docker run --name my-nginx nginx

# ポートマッピング(ホスト:コンテナ)
docker run -p 8080:80 nginx
docker run -p 127.0.0.1:8080:80 nginx  # IP指定

# 複数ポートのマッピング
docker run -p 8080:80 -p 8443:443 nginx

# ボリュームマウント(データ永続化)
docker run -v /host/path:/container/path nginx
docker run -v $(pwd):/app node:18

# 読み取り専用でマウント
docker run -v /host/path:/container/path:ro nginx

# 名前付きボリュームを使用
docker run -v my-volume:/data nginx

# 環境変数の設定
docker run -e NODE_ENV=production node:18
docker run -e DB_HOST=localhost -e DB_PORT=5432 my-app

# 環境変数をファイルから読み込む
docker run --env-file .env my-app

# コンテナ終了時に自動削除
docker run --rm nginx

# インタラクティブモード(シェル操作)
docker run -it ubuntu bash
docker run -it --rm alpine sh

# リソース制限
docker run --memory="512m" --cpus="1.5" nginx

# 再起動ポリシーの設定
docker run --restart=always nginx
docker run --restart=unless-stopped nginx
docker run --restart=on-failure:3 nginx  # 最大3回まで

実行中コンテナでコマンド実行

docker execを使うと、実行中のコンテナ内でコマンドを実行できます。

# コンテナ内でbashを起動
docker exec -it コンテナ名 bash
docker exec -it my-nginx bash

# Alpine Linuxの場合(shを使用)
docker exec -it コンテナ名 sh

# コマンドを直接実行
docker exec コンテナ名 ls -la /app
docker exec my-nginx nginx -v

# rootユーザーで実行
docker exec -u root -it コンテナ名 bash

# 環境変数を設定して実行
docker exec -e MY_VAR=value コンテナ名 printenv

# 作業ディレクトリを指定して実行
docker exec -w /app コンテナ名 npm install

コンテナのログ確認

# コンテナのログを表示
docker logs コンテナ名
docker logs my-nginx

# リアルタイムでログを追跡(tail -f相当)
docker logs -f コンテナ名

# 最後の100行だけ表示
docker logs --tail 100 コンテナ名

# タイムスタンプ付きで表示
docker logs -t コンテナ名

# 特定時刻以降のログを表示
docker logs --since 2024-01-01T00:00:00 コンテナ名
docker logs --since 10m コンテナ名  # 10分前から

# 特定時刻までのログを表示
docker logs --until 2024-01-31T23:59:59 コンテナ名

コンテナのステータス確認

# コンテナのリソース使用状況を確認
docker stats

# 特定コンテナのみ表示
docker stats コンテナ名

# 一度だけ表示(更新なし)
docker stats --no-stream

# コンテナ内のプロセス一覧
docker top コンテナ名

# コンテナの詳細情報を確認
docker inspect コンテナ名

# 特定の情報を取得
docker inspect --format='{{.State.Status}}' コンテナ名
docker inspect --format='{{.NetworkSettings.IPAddress}}' コンテナ名

# ポートマッピングの確認
docker port コンテナ名

ファイルのコピー

ホストとコンテナ間でファイルをコピーできます。

# ホストからコンテナへ
docker cp /host/file.txt コンテナ名:/container/path/
docker cp ./config.json my-nginx:/etc/nginx/

# コンテナからホストへ
docker cp コンテナ名:/container/file.txt /host/path/
docker cp my-nginx:/var/log/nginx/access.log ./logs/

# ディレクトリごとコピー
docker cp /host/directory コンテナ名:/container/path/
docker cp コンテナ名:/app/logs ./backup/

コンテナへのアタッチ

# 実行中コンテナにアタッチ(出力を見る)
docker attach コンテナ名

# アタッチを解除(コンテナを止めずに)
# Ctrl+P, Ctrl+Q を順に押す

attachexecの違い: attachはメインプロセスに接続、execは新しいプロセスを起動

コンテナの一時停止と再開

# コンテナを一時停止(プロセスを凍結)
docker pause コンテナ名

# 停止したコンテナを再開
docker unpause コンテナ名

コンテナの削除

# 停止中コンテナを削除
docker rm コンテナ名
docker rm my-nginx

# 実行中コンテナを強制削除
docker rm -f コンテナ名

# 複数コンテナを削除
docker rm コンテナ1 コンテナ2 コンテナ3

# 停止中の全コンテナを削除
docker container prune

# 確認なしで削除
docker container prune -f

# 全コンテナを停止して削除
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)

コンテナからイメージを作成

# 実行中コンテナからイメージを作成
docker commit コンテナ名 my-custom-image:1.0

# メッセージと作者情報を付けて作成
docker commit -m "Added custom config" -a "Your Name" コンテナ名 my-image:1.0

# コンテナを停止せずに作成
docker commit --pause=false コンテナ名 my-image:1.0

※ 本番環境ではDockerfileを使用することを推奨します

実用例集

# WordPress + MySQL を起動
# MySQL
docker run -d \
  --name wordpress-db \
  -e MYSQL_ROOT_PASSWORD=root \
  -e MYSQL_DATABASE=wordpress \
  mysql:8.0

# WordPress
docker run -d \
  --name wordpress \
  -p 8080:80 \
  -e WORDPRESS_DB_HOST=wordpress-db:3306 \
  -e WORDPRESS_DB_PASSWORD=root \
  --link wordpress-db \
  wordpress

# Redisをキャッシュサーバーとして起動
docker run -d \
  --name redis-cache \
  -p 6379:6379 \
  redis:alpine

# PostgreSQLをデータボリュームで起動
docker run -d \
  --name postgres-db \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_DB=mydb \
  -v postgres-data:/var/lib/postgresql/data \
  -p 5432:5432 \
  postgres:15

# MongoDBを起動
docker run -d \
  --name mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  -v mongo-data:/data/db \
  -p 27017:27017 \
  mongo:7