zaki work log

作業ログやら生活ログやらなんやら

[Docker / Docker Compose] コンテナのIPアドレスを固定する方法

以前「コンテナ若葉マーク」で「コンテナ環境では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_addressIPアドレス指定でコンテナをデプロイするにはこの通り。

  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)

参考

docs.docker.com

このページの以下をチェック。