こんにちはフロントエンドエンジニアのまさにょんです!
今回は、別々の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を作成していきます。
まずは、FrontEndApp のdocker-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関連の設定ポイントをまとめると、次のとおりです。
services
と同じ階層(レベル)にnetworks
という項目を追加します。- ここに、Docker Compose環境が接続するNetworkを追加定義します。
- external: true はdocker-composeで管理されていない外部のネットワークという意味です。
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-API のdocker-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": {}
}
]