Docker技术入门与实战 第二版-学习笔记-8-网络功能network-2-相应配置
1) 快速配置指南(详细使用下面会讲)
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效
下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动(docker run )时候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行docker run时可以覆盖设置的默认值。
最后这些选项只有在 docker run执行时使用,因为它是针对容器的特性内容:
2) 配置 DNS
怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件:
- /etc/resolv.conf : 记录了容器的配置信息
- /etc/hostname : 记录了容器的主机名
- /etc/hosts : 默认只记录了容器自身的一些地址和名称
如果用户想要手动指定容器的配置,可以利用下面的选项:
- -h HOSTNAME 或 --hostname = HOSTNAME :设定容器的主机名,它会被写到容器内的/etc/hostname 和 /etc/hosts中。但它在容器外部看不到,既不会在docker ps中显示,也不会在其他的容器的 /etc/hosts看到
- --links = CONTAINER_NAME:ALIAS 选项会在创建容器的时候,添加一个其他容器的主机名到/etc/hosts文件中,让新的容器的进程可以使用主机名ALIAS就可以连接它
- --dns = IP_ADDRESS : 添加DNS服务到容器的/etc/resolv.conf中,让容器用这个服务器来解析所有不在/etc/hosts上的主机名
- --dns-search = DOMAIN : 设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com。注意,如果没有上述最后的两个选项,Docker会默认主机上的/etc/resolv.conf来配置容器
在容器中使用 mount 命令可以看到挂载信息,在之前连接的是host网络的ubuntu6容器上运行:
userdeMBP:~ user$ docker exec -it ubuntu6 /bin/bash
root@linuxkit-025000000001:/# mount
...
/dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)
...
1.查看其/etc/resolv.conf内容:
root@linuxkit-025000000001:/# cat /etc/resolv.conf # This file is included on the metadata iso nameserver 192.168.65.1 // 相当于运行docker run时使用--dns=192.168.65.1 domain lan //表示局域网,相当于运行docker run时使用--dns-search=lan
⚠️如果是直接手动对/etc/resolv.conf进行更改,那么再次重启时,里面更改的内容就会恢复原状,希望不回复的方法就是在run时使用-dns和--dns-search参数来设置
此时任意打开一个连接的是自定义的bridge——myNetwork2的ubuntu7容器,查看它的/etc/resolv.conf配置文件,可以看见,和上面的内容是相同的
这是因为创建容器时,默认会与宿主机的/etc/resolv.conf内容保持一致
2.查看其/etc/hosts内容:
root@linuxkit-025000000001:/# 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
当我们使用--link=container:alias参数连接了其他容器的话,该文件中就会出现连接容器的ip地址,如下面是容器ubuntu7没有连接其他容器前文件的内容:
root@8eef1c93a7d4:/# vi /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.20.11.2 8eef1c93a7d4
⚠️设置了alias的好处是:重启容器IP变化时,别名alias正常使用
然后后面打开另一个容器ubuntu8,让其通过--link连接了容器db,然后就能够在/etc/hosts中看见db的信息:
userdeMBP:~ user$ docker run -it --name ubuntu8 --link db:db ubuntu:14.04 /bin/bash
root@1f6456e5fbfd:/# 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.17.0.4 db 2fca948912dc
172.17.0.5 1f6456e5fbfd
就能够使用容器db的名字ping通它了:
root@1f6456e5fbfd:/# ping -c 3 db
PING db (172.17.0.4) 56(84) bytes of data.
64 bytes from db (172.17.0.4): icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from db (172.17.0.4): icmp_seq=2 ttl=64 time=0.092 ms
64 bytes from db (172.17.0.4): icmp_seq=3 ttl=64 time=0.109 ms
--- db ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2111ms
rtt min/avg/max/mdev = 0.081/0.094/0.109/0.011 ms
3.查看其/etc/hostname内容:
root@linuxkit-025000000001:/# cat /etc/hostname
linuxkit-025000000001
可以在run容器时自己设定自己的主机名,使用--hostname参数:
userdeMacBook-Pro:~ user$ docker run -it --hostname=myUbuntu9 --name ubuntu9 ubuntu:14.04 /bin/bash root@myUbuntu9:/# cat /etc/hostname myUbuntu9
上面的例子就将主机名设置为了myUbuntu9
4.使用--net参数(其实就是之前使用的--network参数)设置使用的网络是bridge、nonedeng,或者是指明与某个容器使用相同的网络,这里着重讲其如何使用container模式(其他网络模式请看上一章):
从上图可见,基本上就相当于打开了别名为ubuntu10的ubuntu8容器,两者的IP地址是完全一样的,连主机名都是一样的。当然,ubuntu10容器也是开启了的:
userdeMBP:~ user$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b854b76e02e ubuntu:14.04 "/bin/bash" 2 minutes ago Up 2 minutes ubuntu10 f07c50c1c6ee ubuntu:14.04 "/bin/bash" 27 minutes ago Up 27 minutes ubuntu8