アフィブログっぽいタイトルにしてみたのはただの気まぐれです

1. docker-compose.ymlを1つにまとめる

言わずもがなですが、docker-compose.ymlを1つにまとめて運用した場合、ネットワークはデフォルトで ディレクトリ名がそのままネットワーク名になります

1
2
3
4
5
6
7
8
9
// hoge ディレクトリにymlがある場合
$ tree -L 1 hoge
hoge/
└── docker-compose.yml

// デフォルトでディレクトリ名のネットワークが作成される
$ docker network ls | grep hoge
NETWORK ID NAME DRIVER SCOPE
0bd8b24fae69 hoge_default bridge local

2. –project-nameを使用する

規模が大きくなってきた場合、docker-compose.ymlを1つにまとめるのはだんだんつらくなってきます、というか管理しきれなくなってきます

docker-composeには、--project-nameというフラグがあり、ここでプロジェクト名を指定する事で、 プロジェクト名がネットワーク名になります
helpには以下のように書かれています。そもそもデフォルトではここがディレクトリ名になっているので、省略時はディレクトリ名が使われているワケですね

1
2
-p, --project-name NAME     Specify an alternate project name
(default: directory name)

こんな風にymlがわかれているとします

1
2
3
4
5
6
$ tree -L 2 hoge
hoge
├── web1
│   └── docker-compose.yml
└── web2
└── docker-compose.yml

これらを別々にdocker-compose up -dした場合のネットワークは下記のようになります

1
2
3
4
$ docker network ls | grep web
NETWORK ID NAME DRIVER SCOPE
8fa4a37a3574 web1_default bridge local
7e493992f13b web2_default bridge local

サブネットマスクも異なる範囲が割り当てられ、名前解決も出来ません

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 異なるサブネットマスク
$ docker network inspect web1_default | grep Subnet
"Subnet": "172.22.0.0/16",
$ docker network inspect web2_default | grep Subnet
"Subnet": "172.23.0.0/16",

// web1 <-> web2 相互の名前解決も不可
$ docker exec web1 sh -c "nslookup web2"
nslookup: can't resolve '(null)': Name does not resolve
nslookup: can't resolve 'web2': Name does not resolve

$ docker exec web2 sh -c "nslookup web1"
nslookup: can't resolve '(null)': Name does not resolve
nslookup: can't resolve 'web1': Name does not resolve

これを、 --project-nameフラグで解決する場合、以下のようになります

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// moge というプロジェクト名でweb1をupします
$ cd web1
$ docker-compose --project-name moge up -d
Creating network "moge_default" with the default driver // ←moge_default ネットワークが作成されます
Creating web1 ... done

// moge というプロジェクト名でweb2をupします
$ cd ../web2
$ docker-compose --project-name moge up -d
Creating web2 ... done

// moge_defaultネットワークが作成されます
$ docker network ls | grep moge
29775b335005 moge_default bridge local

同じサブネットに属しているのも確認出来ます

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ docker network inspect moge_default | jq .[0].Containers
{
"08268692277d6534bbd28d96079d5a260c05a5612373a792c4972b00ed7a552d": {
"Name": "web2",
"EndpointID": "311a53fb6bec8ecda716900ada4e52c94be74a2b379410177b7a228a3314bfcd",
"MacAddress": "02:42:ac:18:00:03",
"IPv4Address": "172.24.0.3/16",
"IPv6Address": ""
},
"963d52fb6bc2c9f20a90966371bfa6d6a7ccd298ea7c15abf6e49935e20fa166": {
"Name": "web1",
"EndpointID": "e4e81a595db60c02672b35b27ee85fe4ff2108a987ffe5e0e4d634891cf288c9",
"MacAddress": "02:42:ac:18:00:02",
"IPv4Address": "172.24.0.2/16",
"IPv6Address": ""
}
}

3. networksを自分で定義して使う

network_type:"host"を使わない場合には、networksを自分で定義して使う方法もあります

1
2
3
4
5
6
7
8
// 「moge-net」という名前のネットワークを定義
networks:
moge-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.56.0.0/16

docker-compose.ymlにそのまま書いてしまっても問題ありませんが、docker-compose.ymlを複数に分けて管理している場合、このnetworksだけ切り出して別ファイルとしておく方法をよくやります
例えばここにある、docker-network.ymlのような感じです

切り出したdocker-network.ymlを、docker-composeにある、--fileオプションを使って読み込みます

1
2
-f, --file FILE             Specify an alternate compose file
(default: docker-compose.yml)

例えば、こんな風にymlを配置し

1
2
3
4
5
6
7
$ tree -L 2 hoge
hoge
├── web1
│   └── docker-compose.yml
├── web2
│ └── docker-compose.yml
└── docker-network.yml

以下のように、他のdocker-compose.ymlに加えて使用します

1
2
docker-compose -f docker-network.yml -f ./web1/docker-compose.yml ...
docker-compose -f docker-network.yml -f ./web2/docker-compose.yml ...

前後しますが、docker-compose.yml側には、このネットワークを使うよう指定しておく必要があります
--project-nameと違って、こちらはIPまで固定できます

1
2
3
networks:
moge-net:
ipv4_address: 172.18.0.6