78
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Dockerのブリッジ・ネットワークでのコンテナ間名前解決がどうなっているのか見てみた

Last updated at Posted at 2016-12-12

※こちらの記事は個人ブログに移行しました

動作確認環境の定義

まずは同じブリッジ・ネットワークにコンテナを立ち上げるためのdocker-compose.ymlを定義します。
特になにかのサービスを動かす必要はないので雑な感じになってます。

$ cat docker-compose.yml
version: '2'
services:
  centos1:
    image: centos
    container_name: centos1
    command: tail -f /dev/null
    networks:
      - centos

  centos2:
    image: centos
    container_name: centos2
    command: tail -f /dev/null
    networks:
      - centos

networks:
  centos:
    driver: bridge

コンテナネットワーク作成/コンテナの起動

上記のdocker-compose.ymlを元にブリッジ・ネットワークの作成およびコンテナの起動を行います。

$ docker-compose up -d
Creating network "test_centos" with driver "bridge"
Creating centos2
Creating centos1

コンテナネットワークの確認

$ docker network ls
NETWORK ID          NAME                         DRIVER              SCOPE
42165a96d808        bridge                       bridge              local
3762bcd6bffb        host                         host                local
f21c4ff0a40e        none                         null                local
888673525ef8        test_centos                  bridge              local

test_centosというブリッジ・ネットワークができています。
docker-composeを使うと名前のプレフィックスにdocker-compose.ymlを置いてあるディレクトリ名がつくようです。

コンテナの確認

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                                NAMES
ee82b4459dd3        centos                        "tail -f /dev/null"      28 minutes ago      Up 28 minutes                                            centos1
33be8d105125        centos                        "tail -f /dev/null"      28 minutes ago      Up 28 minutes                                            centos2

docker-compose.yml内のcontainer_nameで指定したとおりのコンテナが実行中になっていると思います。

ブリッジ・ネットワークの詳細を確認してみる

$ docker network inspect test_centos
[
    {
        "Name": "test_centos",
        "Id": "888673525ef867e345d725fc931cd101d47a2175349bcd6af18615bc0c54b99d",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "33be8d105125bc2eddb314e947cc8a6f43941d98959766320dd6e8f39457c450": {
                "Name": "centos2",
                "EndpointID": "1be71737dcc84729d0200f895ee1ec350efa66cdf46f41577294e01eaa658775",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "ee82b4459dd3d7034ecd0ef3f0c1d41e3288ae7045b38ebaabb9f519f1de6eef": {
                "Name": "centos1",
                "EndpointID": "7f912cb4bb22c11739ab88ada9c71d2ecbd32c9e0e0b0aeafb08368ed04d38e0",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

centos1は172.19.0.3/16、centos2は172.19.0.2/16がアサインされました。

コンテナにログイン

コンテナ間の名前解決を見たいので片側のコンテナに入ります。

$ docker exec -it centos1 bash

疎通確認

ログインしていない方のコンテナと通信できるか確認してみます。

[root@ee82b4459dd3 /]# ping centos2 -c 4
PING centos2 (172.19.0.2) 56(84) bytes of data.
64 bytes from centos2.test_centos (172.19.0.2): icmp_seq=1 ttl=64 time=0.597 ms
64 bytes from centos2.test_centos (172.19.0.2): icmp_seq=2 ttl=64 time=0.141 ms
64 bytes from centos2.test_centos (172.19.0.2): icmp_seq=3 ttl=64 time=0.150 ms
64 bytes from centos2.test_centos (172.19.0.2): icmp_seq=4 ttl=64 time=0.099 ms

--- centos2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3017ms
rtt min/avg/max/mdev = 0.099/0.246/0.597/0.204 ms

pingが通ります。
宛先アドレスも先に確認したものと同じになっています。

名前解決の確認

hostsの確認

まずはhostsを確認してみます。

[root@ee82b4459dd3 /]# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.19.0.3	ee82b4459dd3

ここにはいないようです。

DNSに問い合わせてみる

DNSへの問い合わせにdigコマンドを使いたいのでbind-utilsをインストールします。

[root@ee82b4459dd3 /]# yum install -y bind-utils
省略...

名前解決してみます。

[root@ee82b4459dd3 /]# dig centos2

; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3 <<>> centos2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51306
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;centos2.			IN	A

;; ANSWER SECTION:
centos2.		600	IN	A	172.19.0.2

;; Query time: 5 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Mon Dec 12 11:14:23 UTC 2016
;; MSG SIZE  rcvd: 48

DNSサーバは;; SERVER: 127.0.0.11#53(127.0.0.11)となっています。

[root@ee82b4459dd3 /]# cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

確認して見るとresolv.confで定義されてます。


Dockerエンジンはコンテナ内部向けにDNSサーバを動かすこと、またそのIPアドレスは127.0.0.11であることが確認できました。
この内容はこちらに記載してあるとおりでした。


後片付け

$ docker-compose stop
Stopping centos1 ... done
Stopping centos2 ... done
$ docker-compose rm
Going to remove centos1, centos2
Are you sure? [yN] y
Removing centos1 ... done
Removing centos2 ... done
$ docker network rm test_centos
test_centos
78
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?