このラボでは、Dockerのネットワーク機能を使ってコンテナ間通信を設定する方法を学びます。
Dockerはデフォルトで bridge ネットワークを作成します。すべてのコンテナはデフォルトでこのネットワークに接続されます。
# 現在のネットワーク一覧を確認
docker network ls
# bridgeネットワークの詳細
docker network inspect bridge
# カスタムネットワークを作成
docker network create my-network
# ネットワーク一覧で確認
docker network ls
# ネットワークの詳細を確認
docker network inspect my-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
カスタムネットワーク内では、コンテナ名がそのままホスト名として使えます。
# 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
まず、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