20.2 配置容器DNS和主机名

Docker支持自定义容器的主机名和DNS配置。

1.相关配置文件

实际上,容器中主机名和DNS配置信息都是通过三个系统配置文件来维护的:/etc/resolv.conf、/etc/hostname和/etc/hosts。

启动一个容器,在容器中使用mount命令可以看到这三个文件挂载信息:


  1. $ docker run -it ubuntu
  2. root@75dbd6685305:/# mount
  3. ...
  4. /dev/mapper/ubuntu--vg-root on /etc/resolv.conf type ext4 (rw,relatime,errors=
  5. remount-ro,data=ordered)
  6. /dev/mapper/ubuntu--vg-root on /etc/hostname type ext4 (rw,relatime,errors=
  7. remount-ro,data=ordered)
  8. /dev/mapper/ubuntu--vg-root on /etc/hosts type ext4 (rw,relatime,errors=remount-
  9. ro,data=ordered)
  10. ...

其中,/etc/resolv.conf文件在创建容器时候,默认会与宿主机/etc/resolv.conf文件内容保持一致:


  1. root@75dbd6685305:/# cat /etc/resolv.conf
  2. # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
  3. # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
  4. nameserver 8.8.8.8
  5. search my-docker-cloud.com

/etc/hosts文件中默认只记录了容器自身的一些地址和名称:


  1. root@75dbd6685305:/# cat /etc/hosts
  2. 172.17.0.2 75dbd6685305
  3. ::1 localhost ip6-localhost ip6-loopback
  4. fe00::0 ip6-localnet
  5. ff00::0 ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters
  8. 127.0.0.1 localhost
  9. /etc/hostname文件则记录了容器的主机名。
  10. root@75dbd6685305:/# cat /etc/hostname
  11. 75dbd6685305

2.容器内修改配置文件

Docker 1.2.0开始支持在运行中的容器里直接编辑/etc/hosts,/etc/hostname和/etc/resolve.conf文件。

但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被docker commit提交。

3.通过参数指定

如果用户想要自定义容器的配置,可以在创建或启动容器时利用下面的参数指定:

·指定主机名-h HOSTNAME或者—hostname=HOSTNAME。设定容器的主机名,它会被写到容器内的/etc/hostname和/etc/hosts。但这个主机名只有容器内能看到,在容器外部则看不到,既不会在docker ps中显示,也不会在其他的容器的/etc/hosts看到。

·记录其他容器主机名—link=CONTAINER_NAME:ALIAS。选项会在创建容器的时候,添加一个所连接容器的主机名到容器内/etc/hosts文件中。这样,新创建容器可以直接使用主机名来与所连接容器通信。

·指定DNS服务器—dns=IP_ADDRESS。添加DNS服务器到容器的/etc/resolv.conf中,容器会用指定的服务器来解析所有不在/etc/hosts中的主机名。

·指定DNS搜索域—dns-search=DOMAIN。设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com。