📋 このステップで学ぶこと
Docker Composeが必要な理由
複数コンテナ管理の課題と解決策
docker-compose.ymlの基本構造
docker-compose upとdownコマンド
サービスの概念を理解する
実践演習で簡単なCompose環境を構築
🔧 0. このステップの前提知識
📚 これまでのステップの復習
このステップでは、以下の知識を使います。忘れた場合は復習してから進めましょう。
STEP 4-5 :docker runコマンドの基本(コンテナの起動・停止)
STEP 10 :ボリュームとデータ永続化(-vオプション)
STEP 11-14 :Dockerfileの作成とイメージビルド
0-1. 作業ディレクトリの準備
# 作業ディレクトリを作成して移動
mkdir -p ~/docker-practice/step15
cd ~/docker-practice/step15
# 現在の場所を確認
pwd
0-2. Docker Composeで実現できること
【Docker Composeの効果】
docker runの場合 Docker Composeの場合
───────────────────────── ─────────────────────────
コマンド4つ(各50文字以上) docker-compose up -d
起動順序を手動で管理 depends_onで自動管理
ネットワークを手動作成 自動でネットワーク作成
環境変数を毎回指定 YAMLファイルに一元管理
チームで共有しにくい YAMLファイルをGit管理
💡 このステップを学ぶと、複数コンテナの管理が
圧倒的に楽になります!
0-3. YAMLファイルの基本ルール
Docker ComposeではYAML(ヤムル) 形式のファイルを使います。
先にYAMLの基本ルールを確認しましょう。
【YAMLの基本ルール】
1. インデント(字下げ)でレベルを表現
※スペース2つが標準。タブは使えません!
親:
子: ← スペース2つ
孫: 値 ← スペース4つ
2. コロン(:)の後にスペースが必要
正しい: この書き方 ✓
間違い:この書き方 ✗(コロンの後にスペースがない)
3. リスト(配列)はハイフン(-)
リスト:
– 項目1
– 項目2
4. コメントはシャープ(#)
# これはコメント
設定: 値 # 行末にもコメント可
⚠️ YAMLでよくあるエラー
タブを使った :YAMLではタブは使えません。スペースに変換してください
コロンの後にスペースがない :key:valueは ✗、key: valueは ✓
インデントがずれている :同じレベルは同じインデントにする
🎯 1. Docker Composeが必要な理由
1-1. 複数コンテナ管理の課題
実際のアプリケーションでは、複数のコンテナを連携 させる必要があります。
【実際のWebアプリケーション構成例】
┌─────────────────────────────────────────────────────────────┐
│ Webアプリケーション │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Flask │ │PostgreSQL│ │ Redis │ │ pgAdmin │ │
│ │ (Web) │ │ (DB) │ │(キャッシュ)│ │ (管理) │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ └────────────┴────────────┴────────────┘ │
│ │ │
│ ネットワーク │
└─────────────────────────────────────────────────────────────┘
これら4つのコンテナを手動で起動・管理するのは大変…
1-2. docker runコマンドだけだと大変
各コンテナをdocker runで起動すると、こんなに長くなります。
# ❌ docker runだけで管理する場合
# 0. まずネットワークを作成
docker network create mynetwork
# 1. PostgreSQLを起動
docker run -d \
–name postgres \
–network mynetwork \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_USER=myuser \
-e POSTGRES_DB=mydb \
-v postgres_data:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:13
# 2. Redisを起動
docker run -d \
–name redis \
–network mynetwork \
-p 6379:6379 \
redis:alpine
# 3. Webアプリを起動
docker run -d \
–name webapp \
–network mynetwork \
-e DATABASE_URL=postgresql://myuser:secret@postgres:5432/mydb \
-e REDIS_URL=redis://redis:6379 \
-p 5000:5000 \
myapp:latest
# 4. pgAdminを起動
docker run -d \
–name pgadmin \
–network mynetwork \
-e PGADMIN_DEFAULT_EMAIL=admin@example.com \
-e PGADMIN_DEFAULT_PASSWORD=admin \
-p 5050:80 \
dpage/pgadmin4
# コマンドが長すぎる!
# 順番を間違えるとエラー!
# ネットワークを事前に作る必要がある!
⚠️ docker runだけの問題点
コマンドが長い: オプションが多くて覚えられない
順番が重要: 依存関係を考えて起動する必要がある
管理が大変: 停止・再起動・削除を個別に実行
再現が難しい: コマンドを保存・共有しにくい
環境変数の管理: どこに何を設定したか忘れる
1-3. Docker Composeが解決すること
💡 Docker Composeの利点
YAMLファイル1つ: すべての設定を1ファイルにまとめる
簡単なコマンド: docker-compose upで全起動
自動でネットワーク作成: コンテナ間通信が自動設定
依存関係管理: 正しい順番で起動してくれる
バージョン管理: YAMLファイルをGitで管理できる
チーム共有: 環境を簡単に再現できる
📝 例え話:レストランの調理
【docker runの場合】
シェフが1人で、野菜を切って、肉を焼いて、スープを作って、盛り付けて…すべて順番に1つずつ指示する必要があります。時間がかかって大変!
【Docker Composeの場合】
調理台に「レシピカード(docker-compose.yml)」を置いておくと、複数のシェフが同時に動いて、野菜を切る人、肉を焼く人、スープを作る人がそれぞれ作業して、最後にきれいにまとまります。効率的!
📄 2. docker-compose.ymlの基本構造
2-1. 基本構造の全体像
【docker-compose.ymlの基本構造】
docker-compose.yml
─────────────────────────────────────────────
version: ‘3.8’ ← Composeファイルのバージョン
(3.8を使えばOK)
services: ← サービス(コンテナ)の定義
サービス名1: ← 自由に名前を付ける
image: イメージ名
ports:
– “ホスト:コンテナ”
environment:
環境変数: 値
サービス名2:
image: イメージ名
…
volumes: ← ボリュームの定義(オプション)
ボリューム名:
networks: ← ネットワークの定義(オプション)
ネットワーク名:
─────────────────────────────────────────────
2-2. 最小構成の例
まずは最もシンプルな例を見てみましょう。
# docker-compose.yml(最小構成)
version: ‘3.8’
services:
# PostgreSQLコンテナ
postgres:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
ports:
– “5432:5432”
🎯 この設定の意味
version: '3.8':Composeファイルのバージョン
services::コンテナの定義を開始
postgres::サービス名(コンテナの名前のベース)
image::使用するDockerイメージ
environment::環境変数の設定
ports::ポートマッピング
2-3. 複数サービスの例
# docker-compose.yml(2つのサービス)
version: ‘3.8’
services:
# PostgreSQLコンテナ
postgres:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
POSTGRES_USER: myuser
POSTGRES_DB: mydb
ports:
– “5432:5432”
volumes:
– postgres_data:/var/lib/postgresql/data
# pgAdminコンテナ
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin
ports:
– “5050:80”
depends_on:
– postgres
# ボリュームの定義
volumes:
postgres_data:
🎯 新しい設定項目
volumes:(サービス内):データを永続化するボリュームマウント
depends_on::依存関係(postgresの後にpgadminを起動)
volumes:(ファイル末尾):名前付きボリュームの宣言
2-4. docker runとの対応関係
docker run と docker-compose.yml の対応
docker run オプション
docker-compose.yml の設定
--name postgres
container_name: postgres
-e POSTGRES_PASSWORD=secret
environment: POSTGRES_PASSWORD: secret
-p 5432:5432
ports: - "5432:5432"
-v data:/var/lib/...
volumes: - data:/var/lib/...
--network mynetwork
自動作成(設定不要)
🚀 3. docker-compose upとdown
3-1. 起動コマンド(up)
# すべてのサービスを起動
docker-compose up
# バックグラウンドで起動(デタッチドモード)← 実務ではこれが基本
docker-compose up -d
# 特定のサービスだけ起動
docker-compose up postgres
# イメージを再ビルドしてから起動
docker-compose up –build
$ docker-compose up -d
Creating network “myapp_default” with the default driver
Creating volume “myapp_postgres_data” with default driver
Creating myapp_postgres_1 … done
Creating myapp_pgadmin_1 … done
3-2. 停止・削除コマンド(down)
# すべてのサービスを停止して削除
docker-compose down
# ボリュームも削除(データが消える!注意!)
docker-compose down -v
# イメージも削除
docker-compose down –rmi all
$ docker-compose down
Stopping myapp_pgadmin_1 … done
Stopping myapp_postgres_1 … done
Removing myapp_pgadmin_1 … done
Removing myapp_postgres_1 … done
Removing network myapp_default
3-3. その他の便利なコマンド
# 実行中のサービス確認
docker-compose ps
# ログ確認
docker-compose logs
# 特定サービスのログ確認
docker-compose logs postgres
# ログをリアルタイムで表示(Ctrl+Cで終了)
docker-compose logs -f
# サービスの停止(削除はしない)
docker-compose stop
# サービスの再起動
docker-compose restart
# サービスの開始(stop後)
docker-compose start
# コンテナ内でコマンド実行
docker-compose exec postgres psql -U myuser -d mydb
3-4. コマンド一覧表
Docker Compose 主要コマンド一覧
コマンド
動作
up -d
コンテナを作成して起動(バックグラウンド)
down
コンテナを停止して削除
down -v
コンテナとボリュームを削除
ps
実行中のサービス一覧
logs -f
ログをリアルタイム表示
exec サービス コマンド
コンテナ内でコマンド実行
stop
コンテナを停止(削除しない)
start
停止中のコンテナを起動
🔧 4. サービスの概念
4-1. サービスとは?
Docker Composeでは、各コンテナを「サービス」として定義 します。
【サービスの概念】
docker-compose.yml
─────────────────────────────────────────────
services:
postgres: ← これがサービス名
image: … (コンテナ名のベースになる)
…
webapp: ← これもサービス名
image: …
…
─────────────────────────────────────────────
【起動後のコンテナ名】
ディレクトリ名_サービス名_番号
例:myproject_postgres_1
myproject_webapp_1
📝 サービスの特徴
名前: services:の下に書いた名前がサービス名
独立性: 各サービスは独立したコンテナ
通信: サービス名でお互いにアクセスできる
スケール: 同じサービスを複数起動できる
4-2. サービス名での通信(重要!)
同じdocker-compose.yml内のサービスは、サービス名でアクセス できます。
# docker-compose.yml
version: ‘3.8’
services:
# データベース
postgres:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
# Webアプリ
webapp:
image: myapp:latest
environment:
# 👇 サービス名「postgres」でアクセス(IPアドレス不要!)
DATABASE_URL: postgresql://user:secret@postgres:5432/mydb
depends_on:
– postgres
🎯 サービス名での通信
webappコンテナからpostgresという名前でデータベースにアクセスできます。
IPアドレスを調べる必要はありません!Docker Composeが自動でDNS解決してくれます。
【サービス間の通信イメージ】
┌─────────────────────────────────────────────────────────────┐
│ Docker Composeネットワーク │
│ (myproject_default) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ webapp │ ──────▶│ postgres │ │
│ │ │ postgres│ │ │
│ │ │ :5432 │ │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 💡 webappからpostgresへは「postgres:5432」でアクセス可能 │
│ IPアドレスを知る必要なし! │
└─────────────────────────────────────────────────────────────┘
🛠️ 5. 実践演習
5-1. 演習の目標
実際にDocker Composeを使って、PostgreSQL + pgAdminの環境を構築しましょう。
📁 完成時のプロジェクト構成
postgres-pgadmin/
└── docker-compose.yml
5-2. プロジェクトディレクトリを作成
# ディレクトリを作成して移動
mkdir -p ~/docker-practice/postgres-pgadmin
cd ~/docker-practice/postgres-pgadmin
# 現在の場所を確認
pwd
5-3. docker-compose.ymlを作成
# docker-compose.yml を作成
cat > docker-compose.yml << ‘EOF’
version: ‘3.8’
services:
# PostgreSQLサービス
postgres:
image: postgres:13
container_name: my_postgres
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
ports:
– “5432:5432”
volumes:
– postgres_data:/var/lib/postgresql/data
restart: unless-stopped
# pgAdminサービス
pgadmin:
image: dpage/pgadmin4
container_name: my_pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin
ports:
– “5050:80”
depends_on:
– postgres
restart: unless-stopped
# ボリュームの定義
volumes:
postgres_data:
EOF
# ファイルの内容を確認
cat docker-compose.yml
🎯 設定の説明
container_name::コンテナ名を固定(オプション)
restart: unless-stopped:異常終了時に自動再起動
depends_on::postgresの起動後にpgadminを起動
volumes::PostgreSQLのデータを永続化
5-4. 起動
# バックグラウンドで起動
docker-compose up -d
Creating network “postgres-pgadmin_default” with the default driver
Creating volume “postgres-pgadmin_postgres_data” with default driver
Creating my_postgres … done
Creating my_pgadmin … done
5-5. 確認
# 実行中のサービス確認
docker-compose ps
Name Command State Ports
———————————————————————————-
my_pgadmin /entrypoint.sh Up 0.0.0.0:5050->80/tcp
my_postgres docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp
5-6. pgAdminにアクセス
🌐 ブラウザでアクセス
ブラウザでhttp://localhost:5050を開く
ログイン:
Email: admin@example.com
Password: admin
「Add New Server」をクリック
Generalタブ:
Name: My Postgres
Connectionタブ:
Host: postgres(サービス名!)
Port: 5432
Username: myuser
Password: mypassword
「Save」をクリック
接続できたら成功です!🎉
5-7. ログ確認
# 全サービスのログ
docker-compose logs
# PostgreSQLのログだけ
docker-compose logs postgres
# リアルタイムでログ表示(Ctrl+Cで終了)
docker-compose logs -f
5-8. PostgreSQLに接続してSQLを実行
# コンテナ内でpsqlを実行
docker-compose exec postgres psql -U myuser -d mydb
# SQL実行例(psql内で)
# \l — データベース一覧
# \dt — テーブル一覧
# \q — 終了
5-9. 停止と削除
# 停止(コンテナは残る)
docker-compose stop
# 再開
docker-compose start
# 停止して削除
docker-compose down
# ボリュームも削除(データが消える!注意!)
docker-compose down -v
💪 6. 練習問題
練習問題 1
基礎
Docker Composeを使う利点を3つ挙げてください。
解答を見る
【解答例】
簡単な起動・停止: docker-compose up/downだけで全サービスを管理できる
設定の一元管理: docker-compose.yml 1ファイルにすべての設定をまとめられる
環境の再現性: YAMLファイルを共有すれば、誰でも同じ環境を構築できる
他にも、「自動でネットワーク作成」「依存関係の管理」「バージョン管理できる」なども正解です。
練習問題 2
基礎
次のdocker-compose.ymlの間違いを指摘してください。
version: ‘3.8’
services:
postgres:
image: postgres:13
environment:
POSTGRES_PASSWORD:secret
ports:
– “5432:5432”
解答を見る
【解答】
インデントが間違っています。YAMLはインデント(字下げ)でレベルを表現するため、正しくインデントする必要があります。
正しい書き方:
version: ‘3.8’
services:
postgres:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
ports:
– “5432:5432”
ポイント:
• インデントはスペース2つで統一
• コロン(:)の後にスペースが必要
• タブは使わない
練習問題 3
応用
PostgreSQLとRedisを含むdocker-compose.ymlを作成してください。
要件:
• PostgreSQL 13を使用
• Redis(alpine版)を使用
• PostgreSQLのデータは永続化
• ポート:PostgreSQL 5432、Redis 6379
解答を見る
【解答】
version: ‘3.8’
services:
postgres:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
POSTGRES_USER: myuser
POSTGRES_DB: mydb
ports:
– “5432:5432”
volumes:
– postgres_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:alpine
ports:
– “6379:6379”
restart: unless-stopped
volumes:
postgres_data:
練習問題 4
基礎
docker-compose upとdocker-compose up -dの違いは何ですか?
解答を見る
【解答】
docker-compose up: フォアグラウンドで起動。ログが画面に表示され続ける。Ctrl+Cで停止。
docker-compose up -d: バックグラウンド(デタッチドモード)で起動。ログは表示されず、コマンドがすぐ終了。ターミナルが自由に使える。
実務では-dオプションを使うことが多いです。
練習問題 5
応用
次の要件を満たすdocker-compose.ymlを作成してください。
Flaskアプリ(ポート5000)
PostgreSQL(永続化あり)
Flask→PostgreSQLへの接続設定
Flaskはデータベースが起動してから起動
解答を見る
【解答】
version: ‘3.8’
services:
postgres:
image: postgres:13
environment:
POSTGRES_USER: flaskuser
POSTGRES_PASSWORD: flaskpass
POSTGRES_DB: flaskdb
volumes:
– postgres_data:/var/lib/postgresql/data
restart: unless-stopped
webapp:
image: myflaskapp:latest
environment:
DATABASE_URL: postgresql://flaskuser:flaskpass@postgres:5432/flaskdb
ports:
– “5000:5000”
depends_on:
– postgres
restart: unless-stopped
volumes:
postgres_data:
ポイント:
depends_on:でFlaskがPostgreSQLの後に起動
DATABASE_URLで接続情報を環境変数として渡す
ホスト名にpostgres(サービス名)を使用
練習問題 6
応用
実行中のPostgreSQLコンテナ内でSQLを実行するコマンドを書いてください。
解答を見る
【解答】
# サービス名がpostgresの場合
docker-compose exec postgres psql -U myuser -d mydb
# または直接SQLを実行
docker-compose exec postgres psql -U myuser -d mydb -c “SELECT * FROM users;”
説明:
docker-compose exec:実行中のコンテナでコマンドを実行
postgres:サービス名
psql:PostgreSQLのCLIツール
-U myuser:ユーザー名
-d mydb:データベース名
練習問題 7
発展
次の構成のdocker-compose.ymlを作成してください。
Webアプリ(Flask)
PostgreSQL(データベース)
Redis(キャッシュ)
Nginx(リバースプロキシ)
適切な依存関係を設定
解答を見る
【解答】
version: ‘3.8’
services:
postgres:
image: postgres:13
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: apppass
POSTGRES_DB: appdb
volumes:
– postgres_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:alpine
restart: unless-stopped
webapp:
image: myflaskapp:latest
environment:
DATABASE_URL: postgresql://appuser:apppass@postgres:5432/appdb
REDIS_URL: redis://redis:6379
depends_on:
– postgres
– redis
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
– “80:80”
volumes:
– ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
– webapp
restart: unless-stopped
volumes:
postgres_data:
練習問題 8
基礎
Docker Composeで作成したコンテナとボリュームをすべて削除するコマンドを書いてください。
解答を見る
【解答】
# コンテナ、ネットワーク、ボリュームをすべて削除
docker-compose down -v
# さらにイメージも削除
docker-compose down -v –rmi all
注意:
-vオプションを使うと、データが完全に消えます 。本番環境では注意してください!
📝 STEP 15 のまとめ
✅ このステップで学んだこと
Docker Compose: 複数コンテナを簡単に管理するツール
docker-compose.yml: YAML形式で設定を記述
主要コマンド: up -d、down、ps、logs、exec
サービス: 各コンテナをサービスとして定義
サービス名での通信: IPアドレス不要で簡単接続
依存関係: depends_onで起動順序を制御
📊 Docker Compose コマンド早見表
やりたいこと
コマンド
全サービスを起動
docker-compose up -d
全サービスを停止・削除
docker-compose down
状態確認
docker-compose ps
ログ確認
docker-compose logs -f
コンテナ内でコマンド実行
docker-compose exec サービス名 コマンド
💡 重要ポイント
Docker Composeは開発環境で必須 のツール
docker-compose up -dで簡単に全起動
docker-compose downでクリーンに削除
サービス名で通信できるのでIPアドレス管理不要
YAMLファイルで環境を再現・共有 できる
🎯 次のステップの予告
次のSTEP 16では、「docker-compose.ymlの書き方」 を詳しく学びます。
services、networks、volumesの詳細設定
ビルド設定(build:)
環境変数の管理方法
ヘルスチェックの設定
より実践的な設定方法を深掘りしていきましょう!