Docker

docker-compose.yamlにおけるネットワークの設定方法

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

COMMENT

メールアドレスが公開されることはありません。