docker网络简介
当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识
Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。
因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求
安装Docker时,会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host
。这三个是docker的原生网络。
docker原生网络
默认桥接模式
概念理解
相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)
通过docker0网桥以及Iptables nat表配置与宿主机通信;
bridge模式是Docker默认的网络设置
此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上
详细解释:
bridge模式下容器的通信
那么,外面的机器是如何访问Docker容器的服务呢?
我们首先用下面命令创建一个含有web应用的容器,将容器的80端口映射到主机的80端口。
docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
然后查看Iptable规则的变化,发现多了这样一条规则:
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
此条规则就是对主机eth0收到的目的端口为80的tcp流量进行DNAT转换,将流量发往172.17.0.2:80,也就是我们上面创建的Docker容器。
所以,外界只需访问10.10.101.105:80就可以访问到容器中的服务。
除此之外,我们还可以自定义Docker使用的IP地址、DNS等信息,甚至使用自己定义的网桥,但是其工作方式还是一样的。
实验过程
1.当你安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络。
2.当不指定网络类型时,docker默认使用桥接模式的网络。
可以看到此时桥接网络已经创建
有几个容器,会出现几个网络接口
新运行一个容器busybox
host模式
概念理解
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程 Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离
一个Docker容器一般会分配一个独立的Network Namespace
但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace。
而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
实验操作
1.
2.3.
4.
5.可以看出容器的ip和宿主机的ip一样
6.
7.
none模式
该模式将容器放置在它自己的网络栈中,但是并不进行任何配置
实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
3.
自定义网络
自定义bridge模式
一个bridge网络是Docker中最常用的网络类型。
桥接网络类似于默认bridge网络,但添加一些新功能并删除一些旧的能力。自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址
1.使用默认的bridge网络时
2.
3.运行容器时指定自定义的桥接,发现可以ping通主机名称
4.
6.
7.
先删除容器
8.
9.
创建网络时。指定子网
10.
连接到不同网桥的容器间进行通信
1.
2.
3.
4.
5.
6.方法一:connect模式
7.
8.
9. 方法二:joined模式
10.joined模式下运行在同一个网络的容器,可以通过localhost来通信
11.
12.测试–link
13.
14.
15.
15.16.
此时vm1已经变为0.4