コンテナ操作
コンテナ起動の主要オプション
# デタッチモード(バックグラウンド実行)
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 を順に押す ※ attachとexecの違い: 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