docker-compose.yml
以下の公式ドキュメントの、「IPV4_ADDRESS, IPV6_ADDRESS」を参考に設定します。 固定IPアドレスを使えるのは、docker-compose バージョン2以上になります。
サービスのネットワーク全体の設定は、networksに設定します。 固定IPアドレスの指定は、各サービス(コンテナ)のnetworksに設定します。
version: '2' networks: [ネットワーク名]: driver: bridge ipam: driver: default config: - subnet: [ネットワークアドレス(CIDR表記)] gateway: [ゲートウェイIP] services: [サービス名] networks: [ネットワーク名]: ipv4_address: [IPアドレス] ... ...注 公式ドキュメントでは、servicesが先になっています。 しかし、networksを先に書いても大丈夫だったので、ここでは先に指定しています。
subnetは、192.168.1.0/24 のようなCIDR表記で、ネットワークアドレスを指定します。
例 ディレクトリ"sample"の中に、以下のようなdocker-compose.ymlを作成
version: '2' networks: app_net: driver: bridge ipam: driver: default config: - subnet: 192.168.200.0/24 gateway: 192.168.200.1 services: web1: image: my:test container_name: 'web1' networks: app_net: ipv4_address: 192.168.200.11 web2: image: my:test container_name: 'web2' networks: app_net: ipv4_address: 192.168.200.12
これは、イメージ "my:test" から2つのコンテナを作成し、固定IPを設定します。
ネットワーク情報
ディレクトリ sample の中に、以下のようなdocker-compose.ymlを作成し、docker-compose upを実行した場合のネットワークについて
version: '2' networks: app_net: driver: bridge ipam: driver: default config: - subnet: 192.168.200.0/24 gateway: 192.168.200.1 services: web1: image: my:test container_name: 'web1' networks: app_net: ipv4_address: 192.168.200.11 web2: image: my:test container_name: 'web2' networks: app_net: ipv4_address: 192.168.200.12
上記で、docker-compose up を実行すると sample_app_net がネットワークに追加されます。 ネットワークが追加されているかどうかは、以下のコマンドで確認します。
docker network ls
実行すると、以下のように表示されます。
# docker network ls NETWORK ID NAME DRIVER SCOPE dde93f0bda89 sample_app_net bridge localこの名前は、docker-compose.ymlファイルの ディレクトリ名 + networksで指定している名称になるようです。
sample_app_net = ディレクトリ名 "sample" + "_" + networksで指定した名称 "app_net"
IPアドレス確認
ネットワークに所属するコンテナのIPを確認する場合、以下のようなコマンドを実行します。
docker network inspect [ネットワーク名]
実行すると、以下のように表示されます。
# docker network inspect sample_app_net [ { "Name": "sample_app_net", "Id": "6cb9d18623f34742f1fa4a10dca53da282183d8c43f22546776a67e96a36bef2", "Created": "2020-04-26T05:20:21.234209367Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "192.168.200.0/24", "Gateway": "192.168.200.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "8d1490b9fae461404abafddb5cd365ddc70e633347013caae2815981719e3652": { "Name": "web2", "EndpointID": "b9ab932295e591db7dbc8c0734851c019c61ea089373648723365428d3891f5e", "MacAddress": "02:42:c0:a8:c8:0c", "IPv4Address": "192.168.200.12/24", "IPv6Address": "" }, "f87674133f9eaeb74c3966008b98fca8a01bd5ba35a327a10cf3b314368605d0": { "Name": "web1", "EndpointID": "4bdb603fc26940d37c078aa0affcc4bb58eff3069fe32b6c6735f582a7fcedc5", "MacAddress": "02:42:c0:a8:c8:0b", "IPv4Address": "192.168.200.11/24", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]docker-compose.ymlで指定したIPが設定されています。
ルーティング確認
docker-compose.ymlにgatewayの設定があると、ルーティングテーブルにスタティックルートが設定されます。 CentOS 7の場合、ip routeコマンドで、ルーティング情報を確認できますので、実行してみます。 すると、docker-compose.ymlで指定したgatewayのIP 192.168.200.1 が確認できます。
# ip route ... 192.168.200.0/24 dev br-6cb9d18623f3 proto kernel scope link src 192.168.200.1ルーティング情報があるので、dockerを動かしているホスト側からIPアドレスを指定すれば、コンテナにアクセスできます。
参考 上記の名称、"br-6cb9d18623f3" は、以下のようになっているようです。
br-[ネットワークIDの先頭12文字]「ネットワークID」は、dokcer network inspector で確認できます。
# docker network inspect sample_app_net
[
{
"Name": "sample_app_net",
"Id": "6cb9d18623f34742f1fa4a10dca53da282183d8c43f22546776a67e96a36bef2",
...