アフィブログっぽいタイトルにしてみたのはただの気まぐれです
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