5.1 カスタムネットワークの主な種類
Dockerのカスタムネットワークは、コンテナ間のネットワーク相互作用を柔軟に設定および管理するための機能を提供するよ。これにより、コンテナを分離し、相互作用を整理して、複雑なネットワークトポロジーを作成できるんだ。この講義では、Dockerでカスタムネットワークを作成して設定する方法やその使用例を見ていくよ。
カスタムネットワークの主な種類
Dockerではいくつかの種類のカスタムネットワークをサポートしてて、それぞれが特定のシナリオに適しているよ:
-
Bridge (ブリッジネットワーク)
: 同じホスト上のコンテナ間の分離と通信を提供するんだ。この種類のネットワークは、ホスト外の相互作用を必要としないローカルアプリケーションでデフォルトで使用されるよ。 -
Overlay (オーバーレイネットワーク)
: Docker SwarmやKubernetesのクラスタで、異なるホスト上で動作するコンテナ間の通信を意図してる。これにより、分散アプリケーションの高いスケーラビリティとセキュリティが確保されるよ。 -
Macvlan
: コンテナがホストの物理ネットワークインターフェースを直接使用できるのを可能にするよ。これって、パフォーマンスに高い要件があるネットワークアプリケーションや、特定のMACアドレスにバインドする必要がある場合に便利なんだ。Macvlanネットワーク内のコンテナは、物理ネットワーク内の他のデバイスと別個のノードとして通信できます。 -
Host (ホストネットワーク)
: コンテナがホストのネットワークスタックを使用するんで、ネットワーク仮想化のオーバーヘッドをなくすけど、隔離が減るよ。このネットワークは、最大のネットワークパフォーマンスが必要なアプリケーションに適してるね。
5.2 ブリッジネットワークの作成と使用
ブリッジネットワーク(bridge)は最も一般的なタイプのカスタムネットワークで、1つのホスト内でコンテナを分離するために使用されるんだ。ブリッジネットワークに接続されたコンテナ同士は、IPアドレスやホスト名を通じて相互にやり取りできるよ。
カスタムのbridge ネットワーク
を作成する
カスタムのbridge ネットワーク
を作成するには、docker network create
コマンドを使ってね:
docker network create --driver bridge my_bridge_network
カスタムネットワークでコンテナを起動する
作成したネットワークに接続して、コンテナを起動してみよう:
docker run -d --name container1 --network my_bridge_network nginx
docker run -d --name container2 --network my_bridge_network busybox sleep 1000
コンテナ間の接続確認
コンテナ間の接続を確認するためにping
コマンドを使えるよ:
docker exec container2 ping -c 4 container1
コンテナが正しくmy_bridge_network
に接続されていれば、ping
コマンドは成功するはずだよ。
5.3 Docker Compose
でのカスタムネットワーク
Docker Compose
でのカスタムネットワークの使用例
Docker Compose を使えば、マルチコンテナアプリケーションのネットワーク作成と管理が簡単になるよ。カスタムネットワークは docker-compose.yml
ファイル内で定義できるんだ。
docker-compose.yml
ファイルの例:
version: '3.8'
services:
web:
image: nginx:latest
networks:
- my_bridge_network
app:
image: myapp:latest
networks:
- my_bridge_network
networks:
my_bridge_network:
driver: bridge
Docker Compose を起動してみよう:
docker compose up -d
この例では、両方のサービス (web
と app
) がカスタムネットワーク my_bridge_network
に接続されているよ。
5.4 macvlan
ネットワークの設定と使用
macvlan
ネットワークは、コンテナがホストの物理ネットワークインターフェイスを直接使用できるようにするから、ネットワーク性能への高い要求があるアプリに便利なんだよね。このネットワークでは、コンテナごとに指定されたサブネット内でユニークなIPアドレスが割り当てられるから、ホストと同じネットワーク内で見えるようになるんだ。
macvlan
ネットワークの作成
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my_macvlan_network
このコマンドの内容:
--subnet
: コンテナが存在するサブネットを定義する。--gateway
: コンテナのゲートウェイを指定する。-o parent
: ネットワークがバインドされるホストのネットワークインターフェイスを示す。
macvlan
ネットワークでコンテナを起動する
docker run -d --name container1 --network my_macvlan_network nginx
docker run -d --name container2 --network my_macvlan_network busybox sleep 1000
この例では、両方のコンテナがmy_macvlan_network
ネットワークに接続されてて、物理インターフェイスeth0
を通じて外部ネットワークにアクセスできるんだよ。
5.5 Docker Compose
での使用例
また、macvlan
ネットワークをDocker Compose
で使用することができます。例えば:
version: '3.8'
services:
web:
image: nginx:latest
networks:
- my_macvlan_network
networks:
my_macvlan_network:
driver: macvlan
driver_opts:
parent: eth0
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
Docker Compose
を起動します:
docker compose up -d
この例では、ネットワークmy_macvlan_network
はサービスweb
がサブネット192.168.1.0/24
にあるデバイス(ホストを含む)とやり取りすることを可能にします。
実践的なヒント:
- アクセス設定: ルーターまたはネットワーク管理者が
macvlan
の設定で指定されたサブネットの使用を許可していることを確認してください。 - 分離: セキュリティが重要である場合、ネットワークのセグメンテーションのためにVLANを使用して、コンテナが必要なリソースだけにアクセスできるようにしてください。
- テスト: 設定を終えたら、
ping
またはcurl
コマンドを使ってコンテナ間および外部ネットワークとの通信をテストしてください。
5.6 マイクロサービス向けネットワーク使用例
フロントエンド、バックエンド、データベースがそれぞれ異なるネットワークに分離されているけど、それでもネットワークを共有してやり取りができる例を見てみよう。
docker-compose.yml
ファイル
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
- db-tier
database:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
networks:
- db-tier
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
db-tier:
driver: bridge
Docker Compose
を起動する:
docker compose up -d
この例では:
- サービス
frontend
はネットワークfront-tier
とback-tier
に接続されていて、外部のクライアントとバックエンドの両方とやり取りできる。 - サービス
backend
はネットワークback-tier
とdb-tier
に接続されていて、フロントエンドとデータベースの両方とやり取りできる。 - サービス
database
はネットワークdb-tier
にのみ接続されていて、データベースが外部からアクセスされないようになっている。
実用的なアドバイス:
- 分離を活用する: ネットワークの分離により、サービスへのアクセスや重要なリソースの保護が可能になるよ。
- 接続を確認する: コマンド
ping
やcurl
を使って、サービス間の通信が正常か確認しよう。 - 最適化: プロジェクトがクラスターや複数のホスト上で動作する場合は、
overlay
ネットワークを使うのがおすすめ。
この例では、ネットワークを分離しつつ、アプリケーションの異なるレベル間でのやり取りを可能にする方法を示しているよ。
GO TO FULL VERSION