一 docker网络模式

Docker使用Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离,Docker容器一般会分配一个独立的Network Namespace。

1.1 四种模式

  • host模式
指定方式:--net=host
  • container模式
指定方式:--net=container:NAME_or_ID
  • none模式
指定方式:--net=none
  • bridge模式
指定方式:--net=bridge
 root@docker:~# docker network ls		#默认已经创建好三种模式,且无法删除
NETWORK ID NAME DRIVER SCOPE
4237839afd99 bridge bridge local
c7a14aafc3b5 host host local
3cc2eba3eb5f none null local
 

1.2 host模式

容器网络指定为host模式,则容器将不会获得独立的Network Namespace,该模式下宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,不会配置独有的IP等,而是使用宿主机的IP和端口。
其具有以下特点:
  • host模式下的容器没有隔离的 network namespace;
  • 容器的 IP 地址同 Docker host 的 IP 地址;
  • 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突;
  • host 模式能够和其它模式共存。
 root@docker:~# docker run -d --name docker_host1 --network host training/webapp python app.py
root@docker:~# docker exec -it docker_host1 /bin/bash
root@docker:/opt/webapp# ifconfig -a
 
宿主机172.24.8.90/24上使用host模式启动一个容器,则查看的网卡信息为宿主机信息,容器中的应用对外直接采用宿主机IP地址提供服务,无任何NAT转换。
注意:除网络外,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的,同时采用host模式,端口无法做映射,无需指定,否则会出现warning告警。

1.3 container模式

Container 网络模式是 Docker 中一种较为特别的网络的模式,处于container模式下的 Docker 容器会共享其他容器的网络环境,因此,两个或以上的容器之间不存在网络隔离,而配置container模式的容器又与宿主机以及除此之外其他的容器存在网络隔离。 
 root@docker:~# docker run -dit --name docker_host2 centos7-xhy /bin/bash
root@docker:~# docker run -dit --name docker_host3 --network container:docker_host2 centos7-xhy /bin/bash
root@docker:~# docker exec -it docker_host2 /bin/bash
[root@c9b51e88f75a /]# ifconfig -a
 
 root@docker:~# docker exec -it docker_host3 /bin/bash
[root@c9b51e88f75a /]# ifconfig -a
 
注意:因为此时两个容器要共享一个 network namespace,因此需要注意端口冲突情况,否则第二个容器将无法被启动,以上docker_host3因为端口原因,无法正常启动。

1.4 none模式

none模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置和构造任何网络环境。
Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。
 root@docker:~# docker run -dit --name docker_host4 --network none centos7-xhy /bin/bash
root@docker:~# 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规则,实现端口转发功能。可使用以下命令查看。
 root@docker:~# iptables -t nat -vnL
 
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到此虚拟网桥上,因此所有连接到此网桥的容器默认能互相通信。
虚拟网桥会使该宿主机上所有容器就通过交换机连在了一个二层网络中,宿主机会选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从此子网中选择一个未占用的IP使用。

2.2 bridge模式特点

  • 使用一个 linux bridge,默认为 docker0;
  • 使用 veth 对,一端在容器的网络 namespace 中,另一端在 docker0 上;
  • 该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内;
  • Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的网络可以主动将网络报文发送至容器内部;
  • 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port;
  • NAT 模式基于三层网络上的实现方式,故肯定会影响网络的传输效率;
  • 容器拥有独立、隔离的网络栈,以便于使得容器和宿主机以外的网络通过NAT建立通信;
 root@docker:~# docker run -dit --name docker_host5 -p 5005:80 training/webapp python app.py
root@docker:~# docker exec -it docker_host5 /bin/bash
root@951e6cd51cd0:/opt/webapp# ifconfig -a
 
 root@docker:~# iptables -t nat -vnL			#查看端口映射
 root@docker:~# iptables-save
……
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE
……
-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:
 root@docker:~# docker run -dit --name docker_host6 centos7-xhy /bin/bash
root@docker:~# docker exec -it docker_host6 /bin/bash
[root@12ac200c6a4c /]# mount
...
/dev/sda4 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/sda4 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/sda4 on /etc/hosts type ext4 (rw,relatime,data=ordered)
...
提示:此方式能解决主机名的问题,同时也能让DNS及时更新(改变resolv.conf)。由于这些文件的维护方法随着Docker版本演进而不断变化,因此尽量不修改这些文件。

3.2 修改dns和主机名

docker容器的dns和主机名配置可通过Docker提供的参数进行相关设置,配置方式如下:
  • -h HOSTNAME 或 --hostname=HOSTNAME:设置容器的主机名,此名称会写入/etc/hostname和/etc/hosts文件中,也会在容器的bash提示符看到。但是在外部,容器的主机名是无法查看的,不会出现在其他容器的hosts文件中,即使使用docker ps命令也无法查看。此参数是docker run命令的参数,而非docker daemon的启动参数。
  • --dns=IP_ADDRESS...:为容器配置DNS,写入/etc/resolv.conf中。该参数可以在docker daemon 启动的时候设置,也可以在docker run时设置,默认为8.8.8.8或8.8.4.4。
注意:对以上3个文件的修改不会被docker commit保存,即不会保存在镜像中,重启容器也会导致修改失效。

四 多节点docker网络

docker跨主机通信按原理可通过以下三种方式实现:
  • 直接路由方式;
  • 桥接方式(如pipework);
  • Overlay隧道方式(如flannel、ovs+gre)等。
Docker 多节点Overlay网络模式可以分为两类:
  • 一类是基于 VxLAN ,对跨节点网络的原生支持;
  • 另一种是通过插件(plugin)方式引入的第三方实现方案,比如 Flannel,Calico 等等。

4.1 直接路由方式

在docker所在的不同宿主机上采用静态路由方式实现。

4.2 桥接-pipework方式

当两台网络已联通的宿主机01和02都存在多个容器组成的集群时,需要相互访问容器应用时,可通过静态指定容器IP为宿主机IP同一个网络的形式,即可实现。
 root@docker01:~# apt-get install bridge-utils	#两台docker宿主机都建议安装此工具
root@docker02:~# apt-get install bridge-utils #两台docker宿主机都建议安装此工具
root@docker01:~# docker run -dit --name container01 --net=none centos:7 /bin/bash
root@docker01:~# docker run -dit --name container02 --net=none centos:7 /bin/bash
root@docker02:~# docker run -dit --name container03 --net=none centos:7 /bin/bash
root@docker02:~# docker run -dit --name container04 --net=none centos:7 /bin/bash root@docker01:~# git clone https://github.com/jpetazzo/pipework
root@docker02:~# git clone https://github.com/jpetazzo/pipework
root@docker01:~# cp pipework/pipework /usr/local/bin/
root@docker02:~# cp pipework/pipework /usr/local/bin/
root@docker01:~# chmod u+x /usr/local/bin/pipework
root@docker01:~# brctl show #查看当前默认的桥接网卡
 
 root@docker01:~# pipework br0 container01 172.24.8.201/24@172.24.8.2
root@docker01:~# pipework br0 container02 172.24.8.202/24@172.24.8.2
root@docker02:~# pipework br0 container03 172.24.8.203/24@172.24.8.2
root@docker02:~# pipework br0 container04 172.24.8.204/24@172.24.8.2
 
若提示Warning: arping not found,可采用以下方式安装:apt-get -y install arping
 root@docker01:~# brctl show
 root@docker02:~# brctl show
提示:
pipework通过network namespace,veth pair以及linux bridge完成容器网络的设置,执行过程大概如下:
  • 查看主机是否包含br0(可以自定义)网桥,如果不存在就创建;
  • 向容器实例添加一块网卡(可以设置网卡名),并配置相应的固定IP;
  • 若容器实例已经有默认的路由,则删除掉,将@后面的IP设置为默认路由的网关;
  • 将容器实例连接到创建的br0网桥上。
注意:pipework通过link名字来判断是bridge还是ovs switch,br开头为网桥, ovs开头为openvswitch,所以pipework创建的网卡必须以br开头。
也可通过以下命令手动提前创建网桥:
 root@docker01:~# docker network create --driver bridge --subnet 172.24.8.0/24 --gateway 172.24.8.2 br1
root@docker:~# docker network inspect br1
 
 root@docker01:~# ip addr add 172.24.8.90/24 dev br0;\
ip addr del 172.24.8.90/24 dev eth0;\
brctl addif br0 eth0;\
ip route del default;\
ip route add default via 172.24.8.2 dev br0
root@docker02:~# ip addr add 172.24.8.91/24 dev br0 ;\
ip addr del 172.24.8.91/24 dev eth0;\
brctl addif br0 eth0;\
ip route del default;\
ip route add default via 172.24.8.2 dev br0
 
提示:将两台宿主机eth0桥接到br0上,并把eth0的IP配置在br0上。
 root@docker01:~# 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网络管理的更多相关文章

  1. Docker网络管理机制实例解析+创建自己Docker网络

    实例解析Docker网络管理机制(bridge network,overlay network),介绍Docker默认的网络方式,并创建自己的网络桥接方式,将开发的容器添加至自己新建的网络,提高Doc ...

  2. docker 实践十:docker 网络管理

    本篇是关于 docker 网络管理的内容,同时也包含了 docker 网络的高级应用. 注:环境为 CentOS7,docker 19.03. docker 网络基础 docker 网络模型 在 do ...

  3. Docker 网络管理及容器跨主机通信

    1.网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个. ...

  4. Docker网络管理

    一.Docker的四种网络模式(host.container.none.bridge) 1. host模式,使用docker run时使用--net=host指定,docker使用的网络实际上和宿主机 ...

  5. Docker网络管理-外部访问容器

    注意:这里使用的方法是端口映射,需要说明的是端口映射是在容器启动的时候才能完成端口映射的. 1,搭建1个web服务器,让外部机器访问. docker run -itd centos /bin/bash ...

  6. Docker系统六:Docker网络管理

    Docker网络 I. Docer的通信方式 默认情况下,Docker使用网桥(brige)+ NAT的通信模型. Docker启动时会自动创建网桥Docker0,并配置ip 172.17.0.1/1 ...

  7. Docker入门 - 006 Docker 多种数据库的安装

    Docker 安装 MySQL 查找Docker Hub上的mysql镜像 root@VM_16_14_centos ~# docker search mysql INDEX NAME DESCRIP ...

  8. Docker 网络管理

    网络模式 容器网络访问原理 桥接宿主机网络和配置固定IP地址 Docker 支持五种网络模式: 1.网络模式: --net  1.1 bridge  默认网络,Docker启动后默认创建一个docke ...

  9. ubuntu-docker入门到放弃(五)docker网络管理

    查看docker宿主机的网卡信息我们会发现,有一个docker0的网卡,这个网卡就是用于跟docker容器进行通讯的,这个网段跟我们docker容器的网段是一样的: #ifconfig docker容 ...

随机推荐

  1. php 设置中文 cookie, js获取

    参考链接:http://www.nowamagic.net/librarys/veda/detail/1271 http://www.ruanyifeng.com/blog/2008/06/base6 ...

  2. Django配置富文本编辑器kindeditor

    一.简介 django是一个容易快速上手的web框架,用它来创建内容驱动型的网站(比如独立博客)十分方便.遗憾的是,django并没有提供官方的富文本编辑器,而后者恰好是内容型网站后台管理中不可或缺的 ...

  3. python日志和异常

    “日志”转载:http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html "异常"转载:http://www.cnb ...

  4. MR数据生成工具指向目录

    mrDataTidy_SaveTwoDays.jar 原始路径 :D:\太原MR数据\一天数据整理 目标路径 : D:\MR现场数据整理\保存两天_整理后数据 例如 当前时间:2017-5-17 10 ...

  5. UART中的硬件流控RTS与CTS DTR DSR DTE设备和DCE设备【转】

    中低端路由器上使用disp interface 查看相应串口状态信息,其中DCD.DTR.DSR.RTS及CTS等五个状态指示分别代表什么意思? DCD ( Data Carrier Detect 数 ...

  6. __ATTRIBUTE__ 知多少?

    GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute ).变量属性(Variable Attribute )和 ...

  7. windows系统中搭建Jenkins服务器

    1       须知 100.126.36.232等Jenkins服务器是通过设置代理访问外网,管理Jenkins和插件升级站点的,本地安装受黄区网络限制需要特殊配置,且有些插件无法下载. 前提条件: ...

  8. route 的标志位

    linux下利用route命令查看当前路由信息时,会打印如下信息: root@root:/# route Kernel IP routing tableDestination     Gateway  ...

  9. androidpn 推送系统

    (文中部分内容来自网络,如无意中侵犯了版权,请告之!) XMPP协议: XMPP : The Extensible Messaging andPresence Protocol. 中文全称:可扩展通讯 ...

  10. SQL数据库基础知识