はじめに
Docker を利用する際、複数のコンテナ間で通信を行うには適切なネットワーク設定が必要です。
ネットワークの設定が不十分だと、コンテナ同士が接続できずエラーが発生することがあります。
本記事では、Docker Compose を使ってコンテナのネットワークを統一する方法を解説します。適切な設定を行うことで、よりスムーズなコンテナ間通信を実現できます。
書こうと思った理由
Docker を使う中で、コンテナ間の通信がうまくいかない経験をしたことがあります。
特に docker-compose.yml
でネットワークを適切に設定しないと、コンテナが相互に接続できない問題が発生しがちです。
この問題を解決するために、ネットワークの統一方法を整理し、分かりやすく解説したいと思いました。同じ問題で悩む方の助けになれば幸いです。
Docker のネットワークを統一する方法
Docker を使用する際、複数のコンテナ間で通信を行う必要があります。しかし、適切にネットワークを設定しないと、コンテナ同士が接続できず、エラーが発生することがあります。
ネットワークの問題点
以下の docker-compose.yml
を例に、ネットワークの問題を確認します。
version: '3.9'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/usr/src/app
ports:
- '1323:1323'
tty: true
depends_on:
- dev-mysql
dev-mysql:
image: mysql:8.0
ports:
- '3308:3306'
container_name: dev-mysql
platform: linux/x86_64
env_file:
- .env
networks:
- app-network
healthcheck:
test: mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD
interval: 10s
timeout: 10s
retries: 3
start_period: 30s
volumes:
- mysql-data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
depends_on:
- dev-mysql
environment:
PMA_HOST: dev-mysql
PMA_PORT: 3306
env_file:
- .env
ports:
- '4000:80'
networks:
- app-network
volumes:
- ./phpmyadmin/sessions:/sessions
volumes:
mysql-data:
driver: local
networks:
app-network:
driver: bridge
この設定には問題があります。それは、app
サービスに networks: app-network
の指定がないため、dev-mysql
に接続できない可能性があることです。
ネットワークを統一する修正方法
以下のように app
に networks: app-network
を追加することで、コンテナ間の通信を統一できます。
version: '3.9'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/usr/src/app
ports:
- '1323:1323'
tty: true
depends_on:
- dev-mysql
networks:
- app-network # ネットワークを追加
dev-mysql:
image: mysql:8.0
ports:
- '3308:3306'
container_name: dev-mysql
platform: linux/x86_64
env_file:
- .env
networks:
- app-network
healthcheck:
test: mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD
interval: 10s
timeout: 10s
retries: 3
start_period: 30s
volumes:
- mysql-data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
depends_on:
- dev-mysql
environment:
PMA_HOST: dev-mysql
PMA_PORT: 3306
env_file:
- .env
ports:
- '4000:80'
networks:
- app-network
volumes:
- ./phpmyadmin/sessions:/sessions
volumes:
mysql-data:
driver: local
networks:
app-network:
driver: bridge
ネットワークの確認方法
ネットワークが正しく作成されたかを確認するには、以下のコマンドを使用します。
docker network ls
networks
で設定した内容が一覧に表示されていることを確認してください。
実際のコマンド画面
また、ネットワークの詳細を確認するには、以下のコマンドを使用します。
docker network inspect <特定のネットワークの ID>
実際のコマンド画面
コンテナが <特定のネットワークの ID>
に接続されていることを確認しましょう。
ここまでの簡単なまとめ
- ネットワークを統一するために、全コンテナに
networks: app-network
を指定 docker network inspect app-network
で接続状況を確認ping dev-mysql
やnc -zv dev-mysql 3306
で接続テスト
おまけ:接続テストコマンド紹介
app
から dev-mysql
に接続できるかを確認するために、以下のコマンドを実行します。
docker exec -it <appコンテナID> sh
その後、コンテナ内で以下を実行します。
ping dev-mysql
もしくは、ポートが開いているかを確認するために以下を実行します。
nc -zv dev-mysql 3306
成功すれば、ネットワークが正しく設定されています。
まとめ
Docker でコンテナ間通信を行うには、統一されたネットワークを設定することが重要です。
docker-compose.yml
で各コンテナに networks: app-network
を指定することで、確実に接続できるようになります。
また、docker network inspect
を使って設定を確認し、ping
や nc
で接続テストを行いましょう。適切なネットワーク管理で、安定したコンテナ環境を構築できます!