前回までは、Docker Composeを使ったサービス構築と、ボリュームによるデータ永続化の基本を紹介しました。
今回は、コンテナ間通信の中核を担う Dockerネットワーク に焦点を当てて、Docker Composeを使ったネットワーク定義の方法やその活用例を解説します。
Contents
- Dockerネットワークの基本とは?
- Docker Composeでネットワークを定義する
- defaultネットワークとcustomネットワークの違い
- 仮想ブリッジの仕組み
- コンテナ間通信の確認方法
Dockerネットワークの基本とは?
Dockerでは、コンテナ同士を通信させるための「ネットワーク」機能が標準で備わっています。特にDocker Composeでは、定義したサービスが自動的に同一ネットワークに属するため、サービス名で名前解決が可能です。
たとえば以下のように、nginxからphp
サービスへ通信したいときは、php:9000
のように書くだけでOKです。
Docker Composeでネットワークを定義する
Composeでは、カスタムネットワークを明示的に定義して分離した構成も可能です:
1 2 3 4 |
networks: backend: frontend: |
そして、サービスごとにネットワークを割り当てることで、柔軟な通信制御ができます:
docker-compose.ymlファイルの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
services: web: image: nginx container_name: my_web networks: - frontend php: image: php:8.1-fpm container_name: my_php networks: - frontend - backend db: image: mysql container_name: my_db networks: - backend networks: frontend: backend: |
このようにネットワークを分けることで、外部に公開するサービスと内部専用のサービスを切り分けることができます。
ネットワークを分ける主なメリットは以下の通りです:
- セキュリティの向上: 内部用サービス(DBなど)を外部ネットワークから隔離することで、不要なアクセスを防げます。
- 構成の明確化: フロントエンド・バックエンドなど機能ごとにネットワークを分けることで、構成が視覚的にも論理的にもわかりやすくなります。
- 障害の切り分け: 通信エラーや依存性トラブルが発生した場合に、どのレイヤーのネットワークに問題があるのかを見極めやすくなります。
- スケーラビリティ: マイクロサービス構成で各サービスが独立していても、ネットワークで柔軟にグルーピングできます。
以下のように視覚的に整理すると、ネットワーク構成の理解がより深まります。
と書きましたが、ローカルの環境だけでいえば、正直そこまで意識せずとも動けば良いとは思います。
ただし、ローカルで構築したものを、そのままサーバで動かすという場合には、あらかじめネットワークを意識しての構築は必須と言えます。
defaultネットワークとcustomネットワークの違い
Docker Composeを使うと、明示的に定義しなくても「default」という名前のネットワークが自動生成され、全サービスがその中に所属します。
一方、カスタムネットワークを使うことで、複数のComposeファイル間の接続や通信制限(ファイアウォール的な役割)を行うことができるため、開発・運用フェーズで役立ちます。
仮想ブリッジの仕組み
Dockerのネットワーク機能の中心には 仮想ブリッジ(bridge network) があります。
これは、ホストマシン上に作られる仮想的なスイッチのようなもので、すべてのコンテナはこの仮想ブリッジに接続され、コンテナ間の通信が可能になります。
通常、docker0
という名前の仮想ブリッジが自動的に作成されます。コンテナはこのブリッジに接続され、それぞれにプライベートIPアドレスが割り当てられ、名前解決も行われます。
Docker Composeで custom network を定義すると、docker0
とは別の名前で仮想ブリッジが作成されます。この構成により、より柔軟でセキュアなネットワーク設計が可能になります。
コンテナ間通信の確認方法
Docker Composeを使って複数のコンテナを立ち上げた場合、それらが同じネットワークに属していれば、サービス名を使って通信できるのが大きな特徴です。
ここでは、nginx → php → db のように、コンテナ同士の通信ができるかを確認してみましょう。
① まずはコンテナ内に入る
ターミナルで、対象のコンテナにログインするには以下のコマンドを使います:
1 |
$ docker exec -it コンテナ名 /bin/bash |
たとえば、nginxコンテナに入るなら:
1 |
$ docker exec -it nginx_container /bin/bash |
※ Alpine Linuxなど一部の軽量コンテナでは /bin/sh
を使う必要がある場合があります。
② コンテナ内から通信確認する
実際に通信できるかどうかは、コンテナ内にログインしてコマンドを使って確認するのが確実です。
そのために、docker-compose.yml
では container_name
を明示的に設定しておくと、ログインや通信先の指定がわかりやすくなります。
1 2 3 4 5 6 7 8 9 10 11 |
services: web: container_name: my_web ... php: container_name: my_php ... db: container_name: my_db ... |
上記のように設定した前提で、通信確認の手順を以下に示します。
🔸 nginx(my_web)からPHP(my_php)に ping
1 2 3 4 5 6 |
# nginxコンテナにログイン $ docker exec -it my_web /bin/bash # pingで確認(成功すれば通信可能) ping my_php |
🔸 PHP(my_php)からMySQL(my_db)に curl
1 2 3 4 5 6 |
# phpコンテナにログイン $ docker exec -it my_php /bin/bash # MySQLのポートにアクセス(応答があれば通信成功) curl my_db:3306 |
ここで使用している my_php
や my_db
は docker-compose.yml の container_name に指定した名前です。
コンテナ間で同じネットワーク上にある場合、このように名前で通信できます。
③ web → db は直接通信できない
この例では、web
(nginx)は frontend
ネットワーク、db
(MySQL)は backend
ネットワークに属しており、共通ネットワークに接続されていない構成になっています。
そのため、nginx から db へは通信が届きません。これはセキュリティ上の観点からも望ましい構成です。
以下は、my_web
コンテナにログインし、my_db
への通信を試みる例です。
1 2 3 4 5 6 7 8 9 |
# コンテナにログイン $ docker exec -it my_web /bin/bash # dbへのping(→ 通信できない) ping my_db # curlで3306番ポート確認(→ タイムアウトまたは接続不可) curl my_db:3306 |
このように、異なるネットワークに属している場合は、名前解決や通信が行えません。
これはネットワーク分離が正しく働いている証拠であり、外部公開すべきでないサービス(例:DB)を保護する有効な方法です。
④ 通信成功の確認とトラブル時の対処
- pingで応答が返ってくれば通信成功です(ただしpingが無効なイメージもあります)
- curlでポートが開いているか確認できます(MySQLなど)
もし通信できない場合は以下を確認してみてください:
networks:
設定で同じネットワークに属しているか- サービス名のスペルミスがないか
- 対象のサービスが起動しているか、ログにエラーが出ていないか
docker network lsで確認してみよう
Docker Composeでネットワークを定義し、コンテナを起動すると、次のようにdocker network ls
コマンドでネットワーク一覧を確認できます:
1 2 3 4 5 6 7 |
$ docker network ls NETWORK ID NAME DRIVER SCOPE b74c2e39e579 bridge bridge local c2e024bd991b myproject_default bridge local 1a2b3c4d5e6f myproject_backend bridge local 7e8f9g0h1i2j myproject_frontend bridge local |
myproject_
から始まる名前は、Composeファイル名(myproject.ymlなど)から自動生成されたネットワーク名です。
まとめ
Docker Composeでは、ネットワークの知識があるとさらに柔軟で安全な環境を構築できます。
- defaultネットワーク:基本的な使い方に便利
- customネットワーク:開発/本番環境での分離や接続制御に最適
- 仮想ブリッジ:コンテナ同士の通信を内部的に制御する基盤
次回は、実際のプロジェクトでネットワーク設計をどう使うかの応用例やTipsを紹介する予定です!
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
人気ブログランキング
にほんブログ村