Dockerにおけるネットワークの仕組み
まず前提知識として、DockerをPCにインストールした時点で、bridge, host, noneという3つのネットワークが生成されています。(以下は参考です。)
$ docker network ls
NETWORK ID NAME DRIVER SCOPE 4ad41e473cab bridge bridge local fbf90a13cde5 host host local 3c19b0f76337 none null local
ネットワークを指定しなかった場合
version: "3"
services:
nginx:
image: nginx:1.15.6
次にネットワークを何も指定ぜずにプロジェクトのコンテナを立ち上げた後のネットワークについて調べてみます。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE 4ad41e473cab bridge bridge local fbf90a13cde5 host host local 3c19b0f76337 none null local d45541bbba74 todoApp_default bridge local
一番下にtodoApp_defaultというネットワークが生成されています。これは、docker-compose.yamlでコンテナ群を生成すると、プロジェクト名_defaultという命名ルールで自動生成されるネットワークです。
何も指定しない場合は、このdefaultのネットワークが生成します。
だから、links:オプションは今では、非推奨となっています。
このオプションを設定しなくても、デフォルトでは下記のようにすることでコンテナ間の接続を指定できます。
# デフォルトで生成するネットワークを使用する場合
networks:
- default
defaultのネットワークを生成させたくない場合
networks:
default:
external:
name: bridge
上記のように書くことで、自動生成されるプロジェクト名_defaultを生成させず、Dockerをインストールした際に生成されているbridgeというネットワークを指定できます。
external:は、composeで管理していない(定義していない)ネットワークを使用したい場合に指定するオプションです。name:で既存のネットワーク名を指定することでネットワークの代用的な機能をします。
ここでは、Dockerをインストールした際に生成されているbridgeという名前のネットワークを指定しています。
新しくネットワークを作成して指定したい場合
networks:
default:
external:
name: bridge
# 追加
container-link:
driver: bridge
そして上記のように書くことでcontainer-linkというネットワークを新しく作成できます。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE 4ad41e473cab bridge bridge local fbf90a13cde5 host host local 3c19b0f76337 none null local d45541b3baee todoApp_container-link bridge local
しかしこの方法で生成するネットワーク名は、プロジェクト名_container-linkとなります。
container-linkは、セグメント的な名称だと捉えてください。この名称を下記のようにコンテナ毎に指定する際に使われると考えてください。
完全にネットワーク名を制御したい場合
では、ネットワーク名を完全に制御したい場合について説明します。
今回でいうと、
todoApp_container-linkの部分をtodoAppにしていきます。手順は以下の通りです。
手順1:コマンドでネットワークを作成
docker-composeでコンテナ群を生成する前にtodoAppというネットワークをコマンドで作成します。
$ docker network create todoApp
手順2:compose.yamlで外部ネットワークとして指定
docker-compose.yamlのnetworksのexternalで、todoAppというnameを指定します。
networks:
default:
external:
name: todoApp