compose projectは分かれているけど、同じネットワークを共有するように docker-compose.yml にIaCしたい場合の手順

ファイル構成

1
2
3
4
5
6
7
8
 $ tree
.
├── local-docker-network
│ └── docker-compose.yml
├── project-1
│ └── docker-compose.yml
└── project-2
└── docker-compose.yml

project-1project-2 で、互いにコンテナのIPを引けるようにしたい

local-docker-network/docker-compose.yml

fake containerは、 docker compose up を実行するために書いてある0バイトのコンテナで、特に何か用途があるわけではありません
本来、 docker network create 等で作成する方が適しているかもしれませんが、IaCしたかったのでこうしています
(他に、これよりなにかいい方法があるかも)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'

networks:
local-docker-net:
driver: bridge
name: local-docker-net ## 共有するネットワーク

## fake container
services:
fake:
build:
context: .
dockerfile_inline: | ## over docker compose v2.17.3
FROM scratch
command: fake
networks:
local-docker-net:

project-1/docker-compose.yml

疎通確認に使用する一時的なコンテナ その1

external: true の行が勘所で、externalは、既存のネットワークに参加させる、という設定です

aliases には好きな物を複数設定可能です

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'

networks:
local-docker-net:
driver: bridge
name: local-docker-net
external: true

services:
web_1:
image: nginx:latest
networks:
local-docker-net:
aliases:
- web_1

project-2/docker-compose.yml

疎通確認に使用する一時的なコンテナ その2。サービス名とエイリアス以外は web_1 と同じです

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'

networks:
local-docker-net:
driver: bridge
name: local-docker-net
external: true

services:
web_2:
image: nginx:latest
networks:
local-docker-net:
aliases:
- web_2

ネットワーク作成 local-docker-net

Network local-docker-net Created となる事を確認。fake containerのエラーは無視でOKです

1
2
3
4
5
6
$ docker compose --project-directory ./local-docker-network/ up
[+] Running 2/2
✔ Network local-docker-net Created 0.0s
✔ Container local-docker-network-fake-1 Created 0.1s
Attaching to fake-1
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "fake": executable file not found in $PATH: unknown

作成されたネットワークの確認

1
2
$ docker network ls | grep local-docker-net
f10011d3d58b local-docker-net bridge local

疎通確認用の一時コンテナ作成 project-{1,2}

1
2
3
4
5
# project-1
$ docker compose --project-directory ./project-1/ up -d

# project-2
$ docker compose --project-directory ./project-2/ up -d
1
2
3
4
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5840b69e6824 nginx:latest "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 80/tcp project-2-web_2-1
221f0071bdfe nginx:latest "/docker-entrypoint.…" 25 seconds ago Up 13 seconds 80/tcp project-1-web_1-1

疎通確認を実施

project-{1,2} それぞれのIPを確認

1
2
3
$ docker network inspect local-docker-net | jq -r '.[0].Containers[] | [.Name, "-->", .IPv4Address] | @csv'
"project-1-web_1-1","-->","172.20.0.2/16"
"project-2-web_2-1","-->","172.20.0.3/16"

project-1 から project-2 のIP 172.20.0.3 が引けるか確認

1
2
3
4
$ docker exec -it project-1-web_1-1 /bin/bash
root@221f0071bdfe:/# apt update;apt install -y dnsutils
root@221f0071bdfe:/# dig web_2 +short
172.20.0.3 ## ---> web_2のIPが引けているのを確認

project-2 から project-1 のIP 172.20.0.2 が引けるか確認

1
2
3
4
$ docker exec -it project-2-web_2-1 /bin/bash
root@5840b69e6824:/# apt update;apt install -y dnsutils
root@5840b69e6824:/# dig web_1 +short
172.20.0.2 ## ---> web_1のIPが引けているのを確認