別々のdocker-compose.yml で作成された DockerコンテナをNetwork接続する方法

Docker_Compose_Network

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、別々のdocker-compose.yml で作成された DockerコンテナをNetwork接続する方法について解説します。

別々のdocker-compose.yml で作成された DockerコンテナをNetwork接続する方法

今回は、以前に作成した2つのDocker Compose環境で作成したDocker Container間で通信する方法を確立させたいと思います。

つまり、FrontEndApp の Container と BackEnd-API の Container、この2つの Docker Compose 間の Container で通信ができるようにしていきます。

[ FrontEndApp ]

[ BackEnd-API ]

前提知識: Docker Compose内のContainerは、自動でNetwork接続ができる

Docker Composeで作成したContainer同士は、Defaultで同じ Docker Network に自動で接続されます。

これにより、Docker Composeファイル内で定義されたサービス間で簡単に通信することができます。

つまり、Docker Composeを使用する場合、Container同士のNetwork接続は自動的に行われるため、

通常は、ユーザーが追加の設定を行う必要はありません。

ただし、ポートマッピングなど外部から、Docker Compose環境内の Docker Containerに接続する設定が必要な場合は、Docker Composeファイルで明示的に設定する必要があります。

Dockerでは、独自のNetworkを作成することができる

Dockerでは、独自のNetworkを作成することができます。

もちろん、Docker Composeでも、先述のDefaultのネットワーク以外に、独自の Docker Network を作成することもできます。

ただ、ユーザー定義のNetworkを作成する場合、各サービス・Containerを手動で、Docker Network に接続する必要があります。

今回は、複数のDocker Compose間の Container で通信をしたいので、共通のネットワークを追加する必要があります。

Docker Compose 間で、通信するための共通のネットワークを作成する

Docker Compose 間で、通信するための共通の Network を作成しておきます。

docker network create コマンドで、独自のNetworkを作成することができます。

docker network create insta_word_cloud_app_network

Docker Network の作成を確認する

docker network ls コマンドで、Docker Network の一覧を確認することができます。

docker network ls     

## [ 実行結果 ] ##                            
NETWORK ID     NAME                           DRIVER    SCOPE
6905ce02f3e1   bridge                         bridge    local
7d0ac1503226   docker-practice-network        bridge    local
7d2a0edfd235   flask-api_default              bridge    local
a99e9af11f39   host                           host      local
026def818f56   insta_word_cloud_app_default   bridge    local
83e651bc9f6c   insta_word_cloud_app_network   bridge    local

Docker Compose に Network設定を追加する

それでは、2つのDocker Compose環境(docker-compose.yml)に独自の Network設定を追加していきます。

今回は、insta_word_cloud_app_networkという名前のユーザー定義の独自_Networkを作成していきます。

まずは、FrontEndAppdocker-compose.ymlから設定を追加していきます。

[ FrontEndApp の docker-compose.yml ]

# versionは、3系
version: '3'
# Serviceを設定する
services:
  # Service名は、自由に決めていい
  frontend:
    # DockerfileまでのPath
    build: .
    # 環境変数を定義する
    environment:
      # Node.jsのグローバル変数: 開発用途なのでdevelopmentを指定
      - NODE_ENV=development
    # ホストマシン:コンテナ => ファイルを共有するための設定
    volumes:
      - ./:/usr/src/app
    # Dockerコンテナ内で実行されるコマンドを指定する
    command: sh -c 'cd frontend && yarn start'
    # ホストマシンPort番号:コンテナのPost番号
    ports:
      - 8001:3000
    # CLI画面の操作をできるようにする
    tty: true
    # Containerが接続するNetworkを定義
    networks:
        # Default_Network
        - default
        # ユーザー定義の独自_Network
        - insta_word_cloud_app_network
# servicesと同じ階層(レベル)で、networks という項目を設定
# Docker Compose環境が接続するNetworkを追加する
networks:
  insta_word_cloud_app_network:
    # Networkの名前
    name: insta_word_cloud_app_network
    # external: true はdocker-composeで管理されていない外部のネットワークという意味
    external: true

追加した Network関連の設定ポイントをまとめると、次のとおりです。

  1. servicesと同じ階層(レベル)にnetworksという項目を追加します。
    • ここに、Docker Compose環境が接続するNetworkを追加定義します。
    • external: true はdocker-composeで管理されていない外部のネットワークという意味です。
  2. servicesで定義したfrontendの Container設定内にnetworksを追加します。
    • ここに、Containerが接続するNetworkを追加定義します。
    • ユーザー定義の独自_Networkであるinsta_word_cloud_app_networkを追加します。

docker-compose.ymlでは、一番上位の階層(レベル)にnetworksという項目を追加することができます。

ここに、Docker Compose環境が接続するNetworkを追加します。

この項目を追加しなければ、自動でdefaultのネットワークだけが接続されます。

ただ、ユーザー定義の独自Networkを設定したい場合は、このnetworksという項目を追加して接続するNetwork設定を追加していきます。

external: true はdocker-composeで管理されていない外部のネットワークという意味になります。

次は、BackEnd-APIdocker-compose.ymlに設定を追加していきます。

追加するNetworkの設定内容は、上記と同様です。

[ BackEnd-API の docker-compose.yml ]

version: "3"
services:
  # Service名は、flask
  backend-app:
    # DockerfileまでのPath
    build: .
    # ports => HostPort: CotainerPort の形で、Portを公開している。
    ports:
      - "5001:5000"
    # コンテナに名前をつける
    container_name: flask_api
    # Hostマシンの ./app を Container の /usr/src/app にマウントしています。
    volumes:
      - ./app:/usr/src/app
      - /app/__pycache__
    # 環境変数で、Flaskを開発用サーバーとして指定する => 開発用-Serverには、Hot-Reload機能がある!
    # Flask の開発用サーバーには、ファイルの変更を検知して自動的にアプリケーションを再起動する機能があります。
    environment:
      FLASK_APP: app.py
      FLASK_ENV: development
    # Flaskを実行するコマンド
    command: flask run --host=0.0.0.0
    # Containerが接続するNetworkを定義
    networks:
      - default
      # ユーザー定義の独自_Network
      - insta_word_cloud_app_network
# servicesと同じ階層(レベル)で、networks という項目を設定
# Docker Compose環境が接続するNetworkを追加する
networks:
  insta_word_cloud_app_network:
    name: insta_word_cloud_app_network
    # external: true はdocker-composeで管理されていない外部のネットワークという意味
    external: true

Docker Composeの実行

次のコマンドで、定義したサービスをバックグラウンドで起動します。

FrontEndApp の Container と BackEnd-API の Container、両方とも起動します。

docker-compose up -d

docker-compose up コマンドは、docker-compose.ymlファイルからサービスをビルドし、Containerを起動するためのコマンドです。

-d フラグは、コンテナをデタッチドモードで実行することを指定しています。

Networkの接続を確認する

docker network inspectコマンドで、Docker Networkの状況を確認します。

ちなみに、inspectは検査するという意味の英単語です。

独自に作成したDocker Network内に、2つのDocker Compose環境で作成した Container があることがわかりました。

これで、Network接続ができる状態になっていることがわかります。

docker network inspect insta_word_cloud_app_network

## [ 実行結果 ] ## 
[
    {
        "Name": "insta_word_cloud_app_network",
        "Id": "83e651bc9f6cdcbc7e0158dea081f62fd6fe95c07f6d051dd3860b41df3004fc",
        "Created": "2023-05-07T09:53:08.519710555Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.31.0.0/16",
                    "Gateway": "172.31.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "1353d6af732b88cb510c515ed8b9ed2f1eabbe494730ba1ee5fb7b255acdfce8": {
                "Name": "flask_api",
                "EndpointID": "417d0a98e24eb0d8888b2f050429519bf2b6514bab134637d2268badb3d59218",
                "MacAddress": "02:42:ac:1f:00:02",
                "IPv4Address": "172.31.0.2/16",
                "IPv6Address": ""
            },
            "18e6b6ddbd91813f524fc48506b7c32cd0482c4488970042f999ec246f9e70b0": {
                "Name": "insta_word_cloud_app-frontend-1",
                "EndpointID": "5dabe23ec71c126ac244f30ee994fa33796c64d0793b2103d4bbe066c0c95f0a",
                "MacAddress": "02:42:ac:1f:00:03",
                "IPv4Address": "172.31.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Dockerの学習・参考書

参考・引用

  1. 複数のdocker-compose間で通信する

最近の投稿