You are just a beta version.

Learn-Docker网络

菜鸟的素养,在于不断的学习,记个笔记,给老大哥证明我学了(尬笑)

Docker网络架构

主要组成:CNM、Libnetwork和网络驱动;

CNM

(Container Network Model)CNM里面主要是包含了容器网络的基本要素,有Sandbox,Endpoint以及Network。

Sabdbox:通俗理解,就是存放容器的虚拟网络,套接字,路由,DNS以及ip和防火墙信息的盒子,形成独立的网络容器网络环境。

Network:在Sandbox外,docker内部的虚拟子网,类似桥梁将containerA与containerB连接起来,由于Sandbox的存在,虚拟网络与宿主机是隔离开的关系。

Endpoint:接口,在Sandbox内,和其他容器相互通信需要,简单来讲就是当两个容器的Endpoint连接在同一个Network的时候,它们可以互相通信。Endpoint负责创建连接,但是只能接入一个网络。容器若是需要接入到多个网络,就需要多个Endpoint。

Libnetwork

Libnetwork是CNM的实现,Libnetwork为用Go编写的开源库,Docker采用了它,其核心网络架构用的是这个库,Libnetwork实现了CNM中的三个组件,在此之上,增加了本地服务实现,基于Ingress容器负载均衡以及网络控制管理的功能。

驱动

Libnetwork主要负责控制和管理,驱动负责数据的实现,网络的连通性和隔离性由驱动处理,驱动通过实现特定的网络类型来对Docker网络栈进行扩展,比如桥接和覆盖。Docker内置的驱动其实有很多,有原生驱动和本地驱动之分,Bridge Driver(桥接)和Overlay(覆盖)只是其中两个,还有Host DriverMacLan DriverNone Driver等,以及一些第三方驱动CalicoContivKuryrWeave等。每个驱动主要负责它上面的所有网络资源的创建和管理。另外,Docker安装会自动安装一块Docker网卡docker0,用于Docker各容器及宿主机的网络通信。

偷个图:

Bridge Driver:Docker容器的默认网络驱动,通过网桥实现网络通讯。
Overlay Driver:借助集群模块Docker Swarm 搭建的跨Docker Daemon网络,感觉优点主要是可以搭建跨物理网络主机的虚拟网络,能让容器运行在不同的物理机上。


Docker桥接网络

Docker的Bridge采用基于Linux内核实现的Linux Bridge技术,相对于其他的网络Bridge比较稳定且高性能。

先这样,下班了,下次接着写。
上班了,摸鱼开始。

首先,偷个图(sorry 下次还敢):

第一点,学过linux内的防火墙iptables链的就知道,我们的数据从主机Host:192.168.1.101出去的时候,会通过网卡eth0进入forward链出去,中间还有Host的协议栈控制,至于需不需要NAT转,取决于目的地址是否与本Host同在一个网络内(192.168.1.0/24),若在,则不需要转,若不在,则需要转出去;

第二点,明确我们的容器与主机是在一个网段内的,也即是容器与主机是处于内网之中的。我们给容器配置的网关:172.17.0.1,显然数据包会先到br0,通过veth接口(一端连接到容器或虚拟机,另一端连接到宿主机的网络)进入容器内。另外,容器一般都运行在单独的namesapce当中,所以就会有单独的协议栈。对于容器来说,与配置的网关为同一个内网网段,安全性相对主机来说高一点。

第三点,在创建容器的时候没有使用--network参数指定要加入的网络时,默认加入docker的单机桥接网络,而默认的单机桥接网络bridge是被映射到内核中的docker0网桥上。而单机桥接网络中的容器想要对外发布服务,需要依赖端口映射,也就是当启动容器的时候需要指定端口的映射关系。docker默认的bridge网络是不支持docker DNS服务进行域名解析的,自定义桥接网络可以。

第四点,同一个网络中的容器之间尽管可以ping通,但不一定就可以任意访问容器中的任何服务。docker给容器添加了一套安全机制,只有容器本身允许的端口,才可以被其他容器所访问到。

第五点,关于容器对外服务的端口映射,端口映射将容器的某个端口映射到docker主机端口上,发送到该主机端口上的流量会被转发到容器内。如容器内部开放80端口,映射到主机192.168.1.10:2333端口,访问192.168.1.10:2333端口的流量会全部转发到容器的80端口。所以,按道理来说,当我们有多个容器开80端口访问时,只要宿主机上面的端口不冲突,没有意外的话可以正常访问。

docker run -d -p 80:8080 <container1>
docker run -d -p 80:8081 <container2>

80:8081 ---> 容器运行端口:宿主机运行端口

仅是自己对docker网络的一个理解,有错的欢迎cue me

本页的评论功能已关闭