作者简介:云计算领域优质创作者新星计划第三季python赛道TOP1 阿里云ACE认证高级工程师
✒️个人主页:小鹏linux
个人社区:小鹏linux(个人社区)欢迎您的加入!
为大家推荐一款刷题神奇 点击链接访问牛客网
各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!
牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析
目录
1. 网络启动与配置参数
2. 配置容器DNS和主机名
2.1 相关配置文件
2.2 容器内修改配置文件
2.3 通过参数指定
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 #定制docker0的掩码;
-H SOCKET...or--host=SOCKET... #Docker服务端接收命令的通道;
--icc=true|false #是否支持容器之间进行通信;
--ip-forward=true|false #启用net.ipv4.ip_forward,即打开转发功能;
--iptables=true|false #禁止Docker添加iptables规则;
--mtu=BYTES #容器网络中的MTU。
下面2个命令选项既可以在启动服务时指定,也可以Docker容器启动(docker run)时候指定。在Docker服务启动的时候指定则会成为默认值,后续执行docker run时可以覆盖设置的默认值。
|
--dns=IP_ADDRESS... #使用指定的DNS服务器;
--dns-search=DOMAIN... #指定DNS搜索域。
最后这些选项只能在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选项支持五种模式,如下所示:
|
--net=bridge #默认配置。为容器创建独立的网络命名空间,分配网卡、IP地址等网络配置,并通过veth接口对将容器挂载到一个虚拟网桥(默认为docker0)上;
--net=none #为容器创建独立的网络命名空间,但不进行网络配置,即容器内没有创建网卡、IP地址等;
--net=container:NAME_or_ID #意味着新创建的容器共享指定的已存在容器的网络命名空间,两个容器内的网络配置共享,但其他资源(进程空间、文件系统等)还是相互隔离的;
--net=host #意味着不为容器创建独立的网络命名空间,容器内看到的网络配置(网卡信息、路由表、Iptables规则等)均与主机上保持一致。注意其他资源还是与主机隔离的;
--net=user_defined_network #用户自行用network相关命令创建一个网络,同一个网络内的容器彼此可见,可以采用更多类型的网络插件。
Docker支持自定义容器的主机名和DNS配置。
|
实际上,容器中主机名和DNS配置信息都是通过三个系统配置文件来维护的:/etc/resolv.conf、/etc/hostname和/etc/hosts。
启动一个容器,在容器中使用mount命令可以看到这三个文件挂载信息:
|
$ docker run -it ubuntu
root@75dbd6685305:/# mount
...
/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:/# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 8.8.8.8
search my-docker-cloud.com
/etc/hosts文件中默认只记录了容器自身的一些地址和名称:
|
root@75dbd6685305:/# cat /etc/hosts
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:/# cat /etc/hostname
75dbd6685305
Docker 1.2.0开始支持在运行中的容器里直接编 辑/etc/hosts,/etc/hostname和/etc/resolve.conf文件。
但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来。也不会被docker commit提交。
|
如果用户想要自定义容器的配置,可以在创建或启动容器时利用下面的参数指定:
·指定主机名-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。
|
为大家推荐一款刷题神奇 点击链接访问牛客网
各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!
牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析