以前「コンテナ若葉マーク」で「コンテナ環境ではIPアドレスじゃなくてコンテナ名を使って通信しろ!(IPアドレスは意識するな!)」みたいなことを話したりしたことあったんですが、何らかの理由でコンテナ名(ホスト名)でなくIPアドレスを使って(イコールIPアドレスを固定して)コンテナを使いたい場合について。
コンテナ単体で固定IPアドレスを使いたいユースケースはさすがに無いと思うので、複数のコンテナをデプロイしてお互いのコンテナ間通信の際にIPアドレスを固定したい、という場合について、Docker単体(docker
実行)の場合と、Docker Compose使用時それぞれについて説明します。
まずDocker Networkを作成してから、そのネットワーク上にコンテナをデプロイ、という構成は同じです。
Docker単体
ここではコンテナを10.254.253.0/24
のアドレスのネットワーク上にデプロイしてみます。
Network作成
Dockerでコンテナ間通信をしたい場合は、まずDocker Networkを作成します。
その際、IPアドレス固定にしたい場合はDocker Networkのサブネットアドレスを指定することでアドレス固定することができます。
$ docker network create --subnet 10.254.253.0/24 fixed_container_network e79041fae649459e9172e078ef81bb33b1adf33c5ee0fe2270de5dcb47cfd57e
↑で作成したDocker Networkは↓で確認できます。
$ docker network ls | grep fixed_container_network e79041fae649 fixed_container_network bridge local
ホストOSのip a
でネットワークインタフェースを確認すると以下の通り。
$ ip a : : 643: br-e79041fae649: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:58:bf:b6:14 brd ff:ff:ff:ff:ff:ff inet 10.254.253.1/24 brd 10.254.253.255 scope global br-e79041fae649 valid_lft forever preferred_lft forever
fixed_container_network
という名前のDocker Networkが作成されました。
ネットワークのみ指定のコンテナ
IPアドレスは固定せずにネットワークのみ指定する場合は以下の通り。
$ docker run --network fixed_container_network -d --rm --name debian-container debian:latest tail -f /dev/null 416bea2cddb4d9245e5d9d25fae60861b005de4fcf73faa344ab8c57d428987d
コンテナのIPアドレスを指定しない場合、割り当てられるIPアドレスは以下の通り。
$ docker inspect debian-container --format "{{ .NetworkSettings.Networks.fixed_container_network.IPAddress }}" 10.254.253.2
指定したDocker Networkのサブネットのアドレスのうち、空いているものが割り当てられます。
IPアドレス指定
アドレスを固定するには--ip
オプションを使用します。
$ docker run --network fixed_container_network -d --rm --name debian-container-fixed-addr --ip 10.254.253.199 debian:latest tail -f /dev/null 3ad749fbc5783ad9182439eba66fcef08c9422428b31170d30a40013011ce44b
デプロイされたコンテナのIPアドレスは以下の通り。
$ docker inspect debian-container-fixed-addr --format "{{ .NetworkSettings.Networks.fixed_container_network.IPAddress }}" 10.254.253.199
Docker Compose
Docker Composeを使ってもネットワークのサブネットアドレス固定と、コンテナのIPアドレス固定の指定ができます。
Docker Compose使用時はネットワークの定義は特に追加設定が不要な場合は定義そのものを省略できる(省略時はオートで作成される)けど、前述と同じようにサブネットアドレスを指定する場合は明示的に定義します。
ここではコンテナを10.254.249.0/24
のアドレスでデプロイしてみます。
Network定義
固定サブネットアドレスでネットワークを定義するには以下の通り。
networks: fixed_compose_network: ipam: driver: default config: - subnet: 10.254.249.0/24
fixed_compose_network
はネットワーク名なので任意。
そのパラメタのipam
以降の定義で、サブネットアドレスを指定します。
ネットワークのみ指定のコンテナ
services: sample_container1: image: debian:latest command: tail -f /dev/null networks: fixed_compose_network:
前述の10.254.249.0/24
を設定したネットワークを指定したコンテナをデプロイするにはこの通り。
コンテナに対するIPアドレスは指定していないけど、docker-compose up -d
すると、以下の通り。
(fixed_address_sample
は実行ディレクトリ名が使われている)
$ docker inspect fixed_address_sample_sample_container1_1 --format "{{ .NetworkSettings.Networks.fixed_address_sample_fixed_compose_network.IPAddress }}" 10.254.249.2
IPアドレス指定
前述の10.254.249.0/24
を設定したネットワークを指定しつつ、さらにipv4_address
でIPアドレス指定でコンテナをデプロイするにはこの通り。
sample_container2: image: ubuntu:latest command: tail -f /dev/null networks: fixed_compose_network: ipv4_address: 10.254.249.89
この内容を追加してdocker-compose up -d
すると(既存Compose Fileに追加したあとは停止→起動せずにup
のみでOK)、
$ docker inspect fixed_address_sample_sample_container2_1 --format "{{ .NetworkSettings.Networks.fixed_address_sample_fixed_compose_network.IPAddress }}" 10.254.249.89
この通り、指定したIPアドレスが割り当てられています。
see: networks / Compose file version 3 reference | Docker Documentation
Compose File全体は以下の通りです。
version: '3' services: sample_container1: image: debian:latest command: tail -f /dev/null networks: fixed_compose_network: sample_container2: image: ubuntu:latest command: tail -f /dev/null networks: fixed_compose_network: ipv4_address: 10.254.249.89 networks: fixed_compose_network: ipam: driver: default config: - subnet: 10.254.249.0/24
まとめ
アプリケーションがホスト名でなくIPアドレスを指定する必要があるなどネットワーク回りで固有の事情がある場合、IPアドレス固定を行うためのコンテナ実行についてまとめました。
環境
$ docker --version Docker version 20.10.3, build 48d30b5 $ docker-compose version docker-compose version 1.27.4, build unknown docker-py version: 4.4.1 CPython version: 3.6.8 OpenSSL version: OpenSSL 1.0.2k-fips 26 Jan 2017 $ cat /etc/centos-release CentOS Linux release 7.9.2009 (Core)
参考
このページの以下をチェック。