STEP 15:Docker Composeとは

🐋 STEP 15: Docker Composeとは

複数のコンテナを簡単に管理する魔法のツール

📋 このステップで学ぶこと

  • 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にアクセス

🌐 ブラウザでアクセス
  1. ブラウザでhttp://localhost:5050を開く
  2. ログイン:
    Email: admin@example.com
    Password: admin
  3. 「Add New Server」をクリック
  4. Generalタブ:
    Name: My Postgres
  5. Connectionタブ:
    Host: postgres(サービス名!)
    Port: 5432
    Username: myuser
    Password: mypassword
  6. 「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つ挙げてください。

【解答例】
  1. 簡単な起動・停止:docker-compose up/downだけで全サービスを管理できる
  2. 設定の一元管理:docker-compose.yml 1ファイルにすべての設定をまとめられる
  3. 環境の再現性: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 updocker-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:)
  • 環境変数の管理方法
  • ヘルスチェックの設定

より実践的な設定方法を深掘りしていきましょう!

📝

学習メモ

Docker・コンテナ技術入門 - Step 15

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE