006.Docker网络管理
Posted itzgr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了006.Docker网络管理相关的知识,希望对你有一定的参考价值。
一 docker网络模式
Docker使用Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离,Docker容器一般会分配一个独立的Network Namespace。
1.1 四种模式
指定方式:--net=host
指定方式:--net=container:NAME_or_ID
指定方式:--net=none
指定方式:--net=bridge
1 [email protected]:~# docker network ls #默认已经创建好三种模式,且无法删除 2 NETWORK ID NAME DRIVER SCOPE 3 4237839afd99 bridge bridge local 4 c7a14aafc3b5 host host local 5 3cc2eba3eb5f none null local
1.2 host模式
容器网络指定为host模式,则容器将不会获得独立的Network Namespace,该模式下宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,不会配置独有的IP等,而是使用宿主机的IP和端口。
其具有以下特点:
1 [email protected]:~# docker run -d --name docker_host1 --network host training/webapp python app.py 2 [email protected]:~# docker exec -it docker_host1 /bin/bash 3 [email protected]:/opt/webapp# ifconfig -a
宿主机172.24.8.90/24上使用host模式启动一个容器,则查看的网卡信息为宿主机信息,容器中的应用对外直接采用宿主机IP地址提供服务,无任何NAT转换。
注意:除网络外,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的,同时采用host模式,端口无法做映射,无需指定,否则会出现warning告警。
1.3 container模式
Container 网络模式是 Docker 中一种较为特别的网络的模式,处于container模式下的 Docker 容器会共享其他容器的网络环境,因此,两个或以上的容器之间不存在网络隔离,而配置container模式的容器又与宿主机以及除此之外其他的容器存在网络隔离。
1 [email protected]:~# docker run -dit --name docker_host2 centos7-xhy /bin/bash 2 [email protected]:~# docker run -dit --name docker_host3 --network container:docker_host2 centos7-xhy /bin/bash 3 [email protected]:~# docker exec -it docker_host2 /bin/bash 4 [[email protected] /]# ifconfig -a
1 [email protected]:~# docker exec -it docker_host3 /bin/bash 2 [[email protected] /]# ifconfig -a
注意:因为此时两个容器要共享一个 network namespace,因此需要注意端口冲突情况,否则第二个容器将无法被启动,以上docker_host3因为端口原因,无法正常启动。
1.4 none模式
none模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置和构造任何网络环境。
Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。
1 [email protected]:~# docker run -dit --name docker_host4 --network none centos7-xhy /bin/bash 2 [email protected]:~# docker exec -it docker_host4 /bin/bash
1.5 bridge模式
见二。
二 bridge模式
2.1 bridge模式简介
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将该宿主机上的Docker容器连接到一个虚拟网桥上。
使用docker run -p时,docker会在iptables写入DNAT规则,实现端口转发功能。可使用以下命令查看。
1 [email protected]:~# iptables -t nat -vnL
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到此虚拟网桥上,因此所有连接到此网桥的容器默认能互相通信。
虚拟网桥会使该宿主机上所有容器就通过交换机连在了一个二层网络中,宿主机会选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从此子网中选择一个未占用的IP使用。
2.2 bridge模式特点
1 [email protected]:~# docker run -dit --name docker_host5 -p 5005:80 training/webapp python app.py 2 [email protected]:~# docker exec -it docker_host5 /bin/bash 3 [email protected]:/opt/webapp# ifconfig -a
1 [email protected]:~# iptables -t nat -vnL #查看端口映射
1 [email protected]:~# iptables-save 2 …… 3 -A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE 4 …… 5 -A DOCKER ! -i docker0 -p tcp -m tcp --dport 5005 -j DNAT --to-destination 172.17.0.3:80
解释:
-s :源地址172.17.0.0/16
-o:指定数据报文流出接口为docker0
-j :动作为MASQUERADE(地址伪装)
iptables规则中nat、filter的Docker链中分别增加了一条规则,这两条规则将访问宿主机5005端口的流量转发到了172.17.0.3的80端口上,即真正提供服务的Docker容器IP和端口,因此外界访问Docker容器是通过iptables做DNAT(目的地址转换)实现。
三 docker容器的DNS和主机名
3.1 DNS和主机名配置文件
同一个Docker镜像可以启动很多Docker容器,但各自容器的主机名并不一样,即主机名并非是被写入镜像中。
通过在容器中运行mount命令可以查看/etc/目录下有3个文件,即容器启动后被虚拟文件覆盖的,分别是/etc/hostname、/etc/hosts、/etc/resolv.conf:
1 [email protected]:~# docker run -dit --name docker_host6 centos7-xhy /bin/bash 2 [email protected]:~# docker exec -it docker_host6 /bin/bash 3 [[email protected] /]# mount 4 ... 5 /dev/sda4 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered) 6 /dev/sda4 on /etc/hostname type ext4 (rw,relatime,data=ordered) 7 /dev/sda4 on /etc/hosts type ext4 (rw,relatime,data=ordered) 8 ...
提示:此方式能解决主机名的问题,同时也能让DNS及时更新(改变resolv.conf)。由于这些文件的维护方法随着Docker版本演进而不断变化,因此尽量不修改这些文件。
3.2 修改dns和主机名
docker容器的dns和主机名配置可通过Docker提供的参数进行相关设置,配置方式如下:
注意:对以上3个文件的修改不会被docker commit保存,即不会保存在镜像中,重启容器也会导致修改失效。
四 多节点docker网络
docker跨主机通信按原理可通过以下三种方式实现:
Docker 多节点Overlay网络模式可以分为两类:
4.1 直接路由方式
在docker所在的不同宿主机上采用静态路由方式实现。
4.2 桥接-pipework方式
当两台网络已联通的宿主机01和02都存在多个容器组成的集群时,需要相互访问容器应用时,可通过静态指定容器IP为宿主机IP同一个网络的形式,即可实现。
1 [email protected]:~# apt-get install bridge-utils #两台docker宿主机都建议安装此工具 2 [email protected]:~# apt-get install bridge-utils #两台docker宿主机都建议安装此工具 3 [email protected]:~# docker run -dit --name container01 --net=none centos:7 /bin/bash 4 [email protected]:~# docker run -dit --name container02 --net=none centos:7 /bin/bash 5 [email protected]:~# docker run -dit --name container03 --net=none centos:7 /bin/bash 6 [email protected]:~# docker run -dit --name container04 --net=none centos:7 /bin/bash 7 8 [email protected]:~# git clone https://github.com/jpetazzo/pipework 9 [email protected]:~# git clone https://github.com/jpetazzo/pipework 10 [email protected]:~# cp pipework/pipework /usr/local/bin/ 11 [email protected]:~# cp pipework/pipework /usr/local/bin/ 12 [email protected]:~# chmod u+x /usr/local/bin/pipework 13 [email protected]:~# brctl show #查看当前默认的桥接网卡
1 [email protected]:~# pipework br0 container01 172.24.8.201/[email protected] 2 [email protected]:~# pipework br0 container02 172.24.8.202/[email protected] 3 [email protected]:~# pipework br0 container03 172.24.8.203/[email protected] 4 [email protected]:~# pipework br0 container04 172.24.8.204/[email protected]
若提示Warning: arping not found,可采用以下方式安装:apt-get -y install arping
1 [email protected]:~# brctl show
1 [email protected]:~# brctl show
提示:
pipework通过network namespace,veth pair以及linux bridge完成容器网络的设置,执行过程大概如下:
注意:pipework通过link名字来判断是bridge还是ovs switch,br开头为网桥, ovs开头为openvswitch,所以pipework创建的网卡必须以br开头。
也可通过以下命令手动提前创建网桥:
1 [email protected]:~# docker network create --driver bridge --subnet 172.24.8.0/24 --gateway 172.24.8.2 br1 2 [email protected]:~# docker network inspect br1
1 [email protected]:~# ip addr add 172.24.8.90/24 dev br0; 2 ip addr del 172.24.8.90/24 dev eth0; 3 brctl addif br0 eth0; 4 ip route del default; 5 ip route add default via 172.24.8.2 dev br0 6 [email protected]:~# ip addr add 172.24.8.91/24 dev br0 ; 7 ip addr del 172.24.8.91/24 dev eth0; 8 brctl addif br0 eth0; 9 ip route del default; 10 ip route add default via 172.24.8.2 dev br0
提示:将两台宿主机eth0桥接到br0上,并把eth0的IP配置在br0上。
1 [email protected]:~# ping 172.24.8.201
注意:pipework设置固定IP的情况下,容器重启后IP会自动消失,需要重新设置。
4.3 基于etcd Docker原生overlay网络
见《007.docker etcd分布式网络部署》
4.4 基于Flannel的overlay网络
Overlay网络指一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的情况下,实现应用在网络上的承载,并能与其他网络业务分离,并且以基于IP的网络技术为主。
案例见《008.docker flannel+etcd分布式网络部署》
以上是关于006.Docker网络管理的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装