Lab 4: Dockerネットワーク

このラボでは、Dockerのネットワーク機能を使ってコンテナ間通信を設定する方法を学びます。

1. デフォルトのbridgeネットワーク

Dockerはデフォルトで bridge ネットワークを作成します。すべてのコンテナはデフォルトでこのネットワークに接続されます。

# 現在のネットワーク一覧を確認
docker network ls

# bridgeネットワークの詳細
docker network inspect bridge
⚠️ デフォルトbridgeの制限: デフォルトのbridgeネットワークでは、コンテナ名によるDNS解決ができません。コンテナ間通信にはIPアドレスを直接指定する必要があり、不便です。

2. カスタムネットワークの作成

# カスタムネットワークを作成
docker network create my-network

# ネットワーク一覧で確認
docker network ls

# ネットワークの詳細を確認
docker network inspect my-network
💡 カスタムネットワークのメリット:
・コンテナ名でDNS解決ができる(例: ping redis
・コンテナ同士を分離できる(セキュリティ向上)
・ネットワーク単位でコンテナを管理できる

3. --network でコンテナをネットワークに接続

# カスタムネットワークに接続してコンテナを起動
docker run -d --name container-a --network my-network nginx
docker run -d --name container-b --network my-network nginx

# container-a から container-b にコンテナ名でアクセスできる
docker exec container-a ping -c 3 container-b

4. コンテナ名でDNS解決

カスタムネットワーク内では、コンテナ名がそのままホスト名として使えます。

# container-b のIPアドレスを確認
docker exec container-b hostname -i

# container-a から container-b にコンテナ名でアクセス
docker exec container-a curl -s http://container-b:80

これにより、アプリケーションの設定ファイルにIPアドレスではなくコンテナ名を書けるようになります。

# 後片付け
docker stop container-a container-b
docker rm container-a container-b

5. 📝 練習問題: FlaskアプリとRedisを同一ネットワークで接続

課題: FlaskアプリからRedisにアクセスするマルチコンテナ構成を作りましょう。
  1. カスタムネットワーク app-network を作成
  2. Redisコンテナを起動(ネットワークに接続)
  3. Flaskアプリをビルドして起動(同じネットワークに接続)
  4. FlaskアプリからRedisにアクセスできることを確認

解答例

まず、Redis対応のFlaskアプリを準備します。

mkdir -p ~/flask-redis
cd ~/flask-redis

# app.py を作成
cat << 'EOF' > app.py
from flask import Flask
import redis

app = Flask(__name__)
# コンテナ名 "redis" でRedisに接続
r = redis.Redis(host='redis', port=6379, decode_responses=True)

@app.route('/')
def hello():
    count = r.incr('hits')
    return f'<h1>アクセスカウンター</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
# 1. ネットワーク作成
docker network create app-network

# 2. Redisコンテナを起動
docker run -d --name redis --network app-network redis:7

# 3. Flaskアプリをビルドして起動
docker build -t flask-redis .
docker run -d --name flask-app --network app-network -p 5000:5000 flask-redis

# 4. ブラウザで http://localhost:5000 にアクセス
# リロードするたびにカウンターが増えることを確認

# 後片付け
docker stop flask-app redis
docker rm flask-app redis
docker network rm app-network

← 前のラボ | 次のラボへ → Lab 5: Docker Compose