Docker Networking 章节1 Docker网络基础

目录

Docker Networking  章节1 网络基础

Docker和网络

Linux网桥

Open vSwitch

NAT模式

IPtables

AppArmor/SELinux

 --net 模式 

--net=none 模式 

--net=container:$container2 模式

--net=host 模式

Docker容器的端口映射

Docker OVS

Unix 域套接字

连接Docker容器

Docker 网络的新特性是什么?

Sandbox

Endpoint

Network

Docker的CNM模式

总结


 

Docker Networking  章节1 网络基础

Docker是一个轻量级的容器技术最近引起了人门很大的兴趣。它灵活的采用了各种Linux内核特性和服务,比如:命名空间(namespaces),控制组(cgroups),安全策略管理(SELinux)以系统安全应用程序文件(AppArmor profiles),以及为了制作模块化镜像的联合文系统(AUFS和BTRFS)。这些镜像提供了一个高级别的应用程序虚拟化环境并且提供创建一次,到处运行的工作流程。一个应用程序能由运行在Docker容器中单个进程组成或者由运行在各自容器中的多个进程组成同时能随着负载的增加而增加副本个数。因此,我们需要强大的网络组件用来支持各种各样复杂的用户需求。

在这个章节,我们将学习有关网络的基本组件并且如何构建并且运行简单容器的例子。

这个章节所涉及到的主题:

  • Docker和网络
  • docker0桥接网络
  • Docker的OVS网络
  • Unix 域名网络
  • 连接Docker容器
  • Docker网络的新功能

进一步的说,Thoughtworks的微服务架构大规模应用,或者LOSA(大量微型的应用程序),进一步挖掘Docker技术潜力。带来的结果是,大量的公司比如:Google,VMware,以及Microsoft 已经开始采用Docker在自己的基础设施中,myriad的发布延续了这种势头,Docker初创企业 Tutum, Flocker, Giantswarm等。

因为Docker容器能随时随地复制它们的动作,无论是你的开发机器是裸金属服务器还是虚拟机或者是数据中心,应用程序设计人员可以将注意力集中在开发上,而将操作工作留给DevOps。这让团队的工作流程模块化,高效率,快速迭代。Docker不能和虚拟机(VM)混为一谈,即使它们都是虚拟化技术。Docker和宿主机共享同一个底层操作系统并且提供一个足够的隔离等级以及提供运行在容器中应用程序的安全性,紧接着容器提供完全的操作系统的抽象,一个强大的隔离环境以及安全保障。相对于虚拟机Docker的资源占用是微不足道的因此具有很高的性价比。然而,Docker不能取代虚拟机而是虚拟化技术的一个补充。以下图表展示了虚拟机和容器架构:

                         

Docker和网络

由于存在Linux内核NET命名空间隔离技术,每个容器都有自己的网络栈,每个容器的NET命名空间都是实例化的并且不能从宿主机看到也不能在其它容器中看到。

Docker网络是由以下的网络组件和服务提供支持。

Linux网桥

这些内置在内核中的L2/MAC交换机( learning switches )用来转发。

Open vSwitch

这是一个先进的支持编程的网桥并且支持隧道技术。

NAT模式

网络地址转换器是转换IP地址以及端口(SNAT,DNAT等等)的直接实体。

IPtables

这是内核中用于管理包的转发,防火墙以及NAT功能的规则引擎。

AppArmor/SELinux

每个应用程序的防火墙策略都可以被如此定义。

Docker可以和各种各样的网络组件一起协同工作,提供访问以及基于容器提供服务新的方法。因此,我们看到很多库遵循不同的网络方法。其中一些突出的方法是Docker Compose,Weave,Kubernetes,PipeWork,libnetwork等等。下面的图描述了Docker网络的根本的思想:

                         

这个 docker0网桥是默认网络的中心。当Docker服务是启动时,宿主机上就会创建一个Linux网桥。在容器上的接口直接和网桥通信,通过网桥协议到达互联网。宿主机内的多个容器是能直接通过Linux网桥通信。

docker0网络能通过  --net 标记位配置,一般情况下,有4种模式:

  • --net 默认模式
  • --net=none
  • --net=container:$container2
  • --net=host

 --net 模式 

这个模式下,这个默认桥是用来容器间通信的桥梁。

--net=none 模式 

使用这个模式,这个容器是一个真正的隔离,无法连通其他的网络。

--net=container:$container2 模式

使用这个标志,这个被创建的容器和容器2共享网络命名空间。

--net=host 模式

采用这个模式,被创建的容器和主机共享网络命名空间。

Docker容器的端口映射

这个章节,我们关注容器端口是如何映射到宿主机上的。这个映射要么通过Docker引擎自己指定端口或者被用户指定。

如果我们创建名为容器1和容器2的2个容器,它们都分配了一个IP地址从一个私有的IP地址段中同时也连接到了docker0网桥,就像在下图展示的那样:

                          

之前的那两个容器能够ping通彼此就像能连接互联网那样。

对于外部的访问,它们的端口能映射到主机上。

就像上一章节提到的那样,容器使用网络命名空间。当第一个容器被创建时候,基于这个容器的新的网络命名空间也是对创建。在容器和网桥之间会创建一个以太网连接。通过这个以太网接口进行切换,网络通路从容器的eth0网络到达网桥,接下来的代码将用作展示的网桥列表:

# show linux bridges
# sudo brctl show

这个输出将和下面展示的类似,包含容器名字和veth映射在容器上的接口。

bridge name   bridge id             STP enabled    interfaces
docker0       8000.56847afe9799     no             veth44cb727
                                                   veth98c3700

容器是如何和互联网进行通信?宿主机上的 iptables nat 表是用来伪装全部的外部连接,就像展示的:

sudo iptables -t nat -L -n

......
Chain POSTROUTING (policy ACCEPT)target prot opt source destination MASQUERADE all --172.17.0.0/16 !172.17.0.0/16
.......

外部的网络如何访问容器?这个端口映射再次使用宿主机上的iptables nat 选项。

                                    

Docker OVS

Open vSwitch是一个强大的网络抽象。下面的图片将展示这个OV接口如何同虚拟机,虚拟机层以及物理交换机工作,每个虚拟机有个虚拟网卡和它通信,每个虚拟网卡通过虚拟接口连接虚拟交换机的:

                            

OVS 使用隧道机制比如:GRE,VXLAN,或者STF创建虚拟overlays网络而不是使用物理的网络拓扑和以太网组件。接下来的图展示了OVS如何能配置采用GRE隧道实现跨主机实现容器之间通信:

                       

Unix 域套接字

在一个宿主机内,UNIX IPC机制,特别是UNIX套接字或者管道,能被用来在容器之间通信:

$ docker run --name c1 -v /var/run/foo:/var/run/foo -d -I -t base/bin/bash
$ docker run --name c2 -v /var/run/foo:/var/run/foo -d -I -t base/bin/bash

在c1和c2中的应用程序能够通过以下的Unix套接字通信:

struct sockaddr_un address;
address.sun_family = AF_UNIX;
snprintf(address.sun_path, UNIX_PATH_MAX, "/var/run/foo/bar" );

                    

连接Docker容器

这个部分我们将介绍两个容器连接的概念,Docker在容器之间创建一个隧道,容器不需要暴露端口给外部的网络。从父容器到继承容器传递信息是使用环境变量作为一个机制。

除了环境变量以外,Docker也增加源容器的host条目到/etc/hosts文件中。

$ docker run -it --name c2 --rm --link c1:c1alias training/webapp /bin/bash
root@<container_id>:/opt/webapp# cat /etc/hosts
172.17.0.1 aed84ee21bde
...
172.17.0.2 c1alaias 6e5cdeb2d300 c1

这里有两个条目:

  • 第一个条目是容器2使用Docker容器ID作为主机名字。
  • 第二个条目是,172.17.0.2 c1alaias   6e5cdeb2d300 c1, 使用连接的别名到c1容器的IP地址上。

接下来的图表展示了容器1和容器2使用 --icc=true实现虚拟网络命名空间使用docker0通信。通过这个网桥,意味着两个容器能相互通信。

                                             

连接给Docker提供了服务发现。通过使用标志  -link name:alias,允许容器之间能够发现彼此以及安全通信。通过设置Docker守护进程的标志 -cc=false容器之间的通信将会阻止。设置了 -cc 的标志位是 false,容器1不能和容器2通信,除非显示的通过一个连接。对于容器的安全来说,这个一个很大的进步。当两个容器连接连接一起的时候,Docker给它们创建一个父子关系,就像展示在下面的图表那样 :

                            

从容器外部来看,他似乎就像这样:

# start the database
$ sudo docker run -dp 3306:3306  --name todomvcdb \
-v /data/mysql:/var/lib/mysql cpswan/todomvc.mysql
#start the app server
$ sudo docker run -dp 4567:4567 --name todomvcapp \
--link todomvcdb:db cpswan/todomvc.sinatra

在容器内部,它看起来就想:

$ dburl = " mysql://root:pa55word@" + \ ENV["DB_PORT_3306_TCP_ADDR"] + "/todomvc"
$ DataMapper.setup(:default, dburl)

Docker 网络的新特性是什么?

Docker网络是在一个非常初级的阶段,并且有很多有趣的贡献来自开发者社区(developer community), 比如: Pipework,Weave, Clocker,以及Kubernetes。每一个方案都反应了Docker网络的不同方面,我们将学习这些方案在后面的章节。Docker公司也发布了一个称作libnetwork的网络的标准化项目。

libnetwork实现了容器网络模型(CNM),这个模型规范化了给容器提供网络的步骤也提供了能被用来支持多个网络驱动的抽象。这个CNM建立在三个主要组件之上---sandbox, endpoint, 以及 network。

Sandbox

一个沙盒包含容器网络栈的配置。这包括容器接口管理,路由表以及DNS设置。一个沙盒环境的实现可以使Linux的网络命名空间,一个 FreeBSD(一个免费的linux发行版) jail 环境或者其他相似的概念。沙箱可能包含来自多个网络的多个端点。

Endpoint

一个 endpoint连接沙盒(sandbox)到一个网络。一个endpoint的实现应该包含一对虚拟网卡,一个Open vSwitch 内部端口,或者一些相似的东西。一个endpoint能属于仅仅一个网络但是可能属于一个沙盒。

Network

一个网络是一组彼此间能直接通信的endpoint。网络的实现是一个Linux网桥,一个VLAN等等。网络包含一些endpoint,如下图所示:

Docker的CNM模式

这个CNM在网络和容器之间建立如下的约定:

  • 同一个网络中的容器能够彼此之间自由的通信。
  • 多网络是分割容器之间流量的方式应该被所有的驱动支持。
  • 每个容器多个端点是一种把容器连接不同网络的方式。
  • 端点被添加到网络沙盒中,以便为其提供网络连接。

在第六章,我们将讨论关于CNM如何实现的细节,下一代Docker的网络栈是:libnetwork。

总结

这个章节,我们学到了Docker网络的基础组件,这些组件从耦合简单Docker抽象到强大的网络组件例如Linux网桥和Open vSwitch。我们学到了使用各种网络模式创建Docker容器。在默认模式下,端口映射有助于通过使用iptables NET规则,允许流量通过宿主机到达容器。章节的后部分,介绍了容器之间连接。我们也讨论了下一代被称作libnetwork的Docker网络。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值