携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
✒️个人主页:小鹏linux
💊个人社区:小鹏linux(个人社区)欢迎您的加入!
1. 网络启动与配置参数
|
|---|
| Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,它会在挂载其上的接口之间进行转发,如下图所示: |

|
|---|
| 同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给docker0接口。比如典型的172.17.42.1,掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。 |
|
|---|
| 当创建一个Docker容器的时候,同时会创建了一对veth pair接口。(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0;另一端在本地并被挂载到docker0网桥,名称以veth开头(例如vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。如此一来,Docker就创建了在主机和所有容器之间一个虚拟共享网络。 |
|
|---|
| 下面是跟Docker网络相关的命令参数。其中有些命令选项只有在Docker服务启动的时候才能配置,而且不能马上生效: |
-b BRIDGE or--bridge=BRIDGE
--bip=CIDR
-H SOCKET...or--host=SOCKET...
--icc=true|false
--ip-forward=true|false
--iptables=true|false
--mtu=BYTES
![点击并拖拽以移动]()
|
|---|
| 下面2个命令选项既可以在启动服务时指定,也可以Docker容器启动(docker run)时候指定。在Docker服务启动的时候指定则会成为默认值,后续执行docker run时可以覆盖设置的默认值。 |
--dns=IP_ADDRESS...
--dns-search=DOMAIN...
![点击并拖拽以移动]()
|
|---|
| 最后这些选项只能在docker run执行时使用,因为它是针对容器的特性内容: |
-h HOSTNAME or--hostname=HOSTNAME
--link=CONTAINER_NAME:ALIAS
--net=bridge|none|container: NAME_or_ID|host|user_defined_network
-p SPEC or--publish=SPEC
-P or--publish-all=true|false
![点击并拖拽以移动]()
--net=bridge
--net=none
--net=container:NAME_or_ID
--net=host
--net=user_defined_network
![点击并拖拽以移动]()
2. 配置容器DNS和主机名
2.1 相关配置文件
|
|---|
| 实际上,容器中主机名和DNS配置信息都是通过三个系统配置文件来维护的:/etc/resolv.conf、/etc/hostname和/etc/hosts。启动一个容器,在容器中使用mount命令可以看到这三个文件挂载信息: |
$ docker run -it ubuntu
root@75dbd6685305:/
...
/dev/mapper/ubuntu--vg-root on /etc/resolv.conf type ext4 (rw,relatime,errors= remount-ro,data=ordered)
/dev/mapper/ubuntu--vg-root on /etc/hostname type ext4 (rw,relatime,errors= remount-ro,data=ordered)
/dev/mapper/ubuntu--vg-root on /etc/hosts type ext4 (rw,relatime,errors=remount- ro,data=ordered)
...
![点击并拖拽以移动]()
|
|---|
| 其中,/etc/resolv.conf文件在创建容器时候,默认会与宿主机/etc/resolv.conf文件内容保持一致: |
root@75dbd6685305:/
search my-docker-cloud.com
![点击并拖拽以移动]()
|
|---|
| /etc/hosts文件中默认只记录了容器自身的一些地址和名称: |
root@75dbd6685305:/
172.17.0.2 75dbd6685305
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
/etc/hostname文件则记录了容器的主机名
root@75dbd6685305:/
75dbd6685305
![点击并拖拽以移动]()
2.2 容器内修改配置文件
|
|---|
| Docker 1.2.0开始支持在运行中的容器里直接编 辑/etc/hosts,/etc/hostname和/etc/resolve.conf文件。但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被docker commit提交。 |
2.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。 |
👑👑👑结束语👑👑👑
