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