このラボでは、Docker Composeを使って複数コンテナを一括管理する方法を学びます。Lab 4で手動で行ったネットワークの作成やコンテナの起動を、YAMLファイル1つで定義できます。
Docker Composeの設定ファイルはYAML形式で記述します。主な項目は以下の通りです:
| 項目 | 説明 |
|---|---|
| services | コンテナ(サービス)の定義 |
| build | Dockerfileからビルドする場合のパス |
| image | 既存イメージを使用する場合 |
| ports | ポートマッピング |
| volumes | ボリュームマウント |
| networks | 接続するネットワーク |
| depends_on | サービスの起動順序 |
| environment | 環境変数 |
| restart | 再起動ポリシー |
Lab 2で作成したFlaskアプリをDocker Composeで起動してみましょう。
mkdir -p ~/compose-demo
cd ~/compose-demo
まず app.py と requirements.txt、Dockerfile を作成します(Lab 2と同じ内容)。
cat << 'EOF' > app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '<h1>Hello, Docker Lab!</h1><p>おめでとうございます!Flaskアプリがコンテナで動いています。</p>'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
cat << 'EOF' > requirements.txt
flask
EOF
cat << 'EOF' > Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF
cat << 'EOF' > docker-compose.yml
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ./app.py:/app/app.py
restart: unless-stopped
EOF
# サービスをビルドして起動(バックグラウンド)
docker compose up -d
# 実行中のサービスを確認
docker compose ps
# ログを表示
docker compose logs
# リアルタイムでログを追跡
docker compose logs -f
# サービスを停止して削除
docker compose down
Composeを使うと、同じサービスを複数インスタンス起動できます。
# docker-compose.yml のportsを範囲指定に変更
cat << 'EOF' > docker-compose.yml
services:
web:
build: .
ports:
- "5000-5002:5000"
volumes:
- ./app.py:/app/app.py
restart: unless-stopped
EOF
# 3インスタンス起動
docker compose up -d --scale web=3
# 確認
docker compose ps
# 停止
docker compose down
mkdir -p ~/compose-redis
cd ~/compose-redis
# Redis対応の app.py
cat << 'EOF' > app.py
from flask import Flask
import redis
app = Flask(__name__)
r = redis.Redis(host='redis', port=6379, decode_responses=True)
@app.route('/')
def hello():
count = r.incr('hits')
return f'<h1>Docker Compose デモ</h1><p>このページは {count} 回アクセスされました。</p>'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
# requirements.txt
cat << 'EOF' > requirements.txt
flask
redis
EOF
# Dockerfile
cat << 'EOF' > Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF
# docker-compose.yml
cat << 'EOF' > docker-compose.yml
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ./app.py:/app/app.py
depends_on:
- redis
restart: unless-stopped
redis:
image: redis:7
restart: unless-stopped
EOF
# 起動
docker compose up -d
# 状態確認
docker compose ps
# ログ確認
docker compose logs
# ブラウザで http://localhost:5000 にアクセス
# リロードするたびにカウンターが増える
# 停止・削除
docker compose down