Docker Composeでネットワークを扱う方法
Docker Composeでネットワークを扱うには、docker-compose.yaml
の最上位レイヤーでnetwork
セクションを追加して、ネットワークについて記述する必要があります。ここで指定するネットワークは、既存のものであっても、新たに定義するものであってもかまいません。
既存のネットワークを使う場合
既存のネットワークが、docker network create my-external-network
コマンドで作成されたとすると、docker-compose.yaml
は以下のようになります。
version: '3'
services:
web:
image: nginx
networks:
- my-external-network
networks:
my-external-network:
external: true
networks.my-external-network.external
をtrue
にすることで、既存のネットワークを指定できます。
新たに定義する場合
docker-compose.yaml
内で新しいネットワークを定義する場合、docker-compose.yaml
は以下のようになります。
version: '3'
services:
web:
image: nginx
networks:
- my-internal-network
networks:
my-internal-network:
driver: bridge
ボリュームの時と同様、driver
を指定する必要があります。driver
には以下のようなものが指定できます。
- bridge
- host
- overlay
- ipvlan
- macvlan
- none
他にも、サードパーティ製のネットワークプラグインをインストールして利用することもできます。
bridge
デフォルトのL3ネットワークドライバです。同じブリッジネットワークに接続しているコンテナとIPアドレスを使って通信できます(--link
オプションを使わない場合)。このドライバで通信できるのは、同じDockerデーモンホスト上で動作するコンテナです。異なるDockerデーモン(例えば違うホスト上のコンテナ)と通信する場合には、OSレベルでルーティングを管理するか、overlay
を使います。
ブリッジネットワークはデフォルトで用意されていますが、ユーザー定義も行えます。ユーザー定義とデフォルトにはいくつかの違いがあります。
- ユーザー定義の場合、コンテナ間のDNS名前解決を自動で提供
- ユーザー定義の場合、コンテナの接続・切断をコンテナを停止させずに行える
- デフォルトの場合、環境変数を共有する
また、ブリッジネットワークを使用する場合、外部にトラフィックを流すにはポートフォワーディングが必要になります。
host
ホスト側のネットワーク機能を直接使う場合に使用する。コンテナは自身に対してIPアドレスを割り当てないので、コンテナがポート80をバインドしてhost
ネットワークを使うと、ホストIPアドレス上のポート80で利用可能になります(ポートフォワーディングは不要)。
overlay
オーバーレイネットワークは複数のDockerデーモンと同時に接続します。主にDocker Swarmを使う際に用いますが、今回はコンテナオーケストレーションツールとしてKubernetesを説明するため、省略します。
ipvlan
IPvlanネットワークは、IPv4とIPv6の両IPアドレス割り当てを、ユーザーがまとめてコントロール可能にします。
macvlan
macvlanネットワークは、コンテナに対してMACアドレスを割り当て可能にし、ネットワーク上の物理デバイスとして見えるようにするL2ネットワークです。DockerデーモンはコンテナのMacアドレスに従って、トラフィックをコンテナに対して転送します。MACアドレスを用いた通信を行いたい場合に使用します。
none
全てのネットワーク機能を無効化します。このドライバを指定すると、コンテナ内では、ループバックデバイスのみが作成されます。
まとめ
今回は、docker compose
でネットワークを扱う方法を説明しました。driver
は様々な種類がありますが、とりあえずbridge
だけ使えるようにしておけばよいかと思います。次回は、docker compose
を使ったサービスのスケーリングについて説明します。