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",
...