常用¶
网络基础¶
Docker 四种网络模式:
1. 默认网络模式 - bridge, --net=bridge(默认)
2. 无网络模式 - none, --net=host
3. 宿主网络模式 - host, --net=none
4. 自定义网络, docker 1.9版本以后新增的特性
5. 其他容器模式(即container模式,join模式),--net=container:NAME_or_ID
一. 默认网络模式 - bridge¶
首先来侃一侃docker0. 之所以说它是默认的网络,是由于当我们运行container的时候没有“显示”的指定网络时,我们的运行起来的container都会加入到这个“默认” docker0 网络。他的模式是bridge。
如下图所示为Docker中 bridge 驱动模式的示意图,其中蓝色的模块表示主机上的网卡
当Docker启动时会自动在主机上创建一个虚拟网桥 docker0 ,
使用默认网络模式创建docker容器时会自动创建一对儿 veth pair 接口,
一端连接在docker容器中(如图容器中的 eth0 ),
一端连接在虚拟网桥 docker0 上(如图 veth )
这种 veth pair 是一种虚拟网络设备,主要用于不同namespace中(意味着网络隔离)的网络通信,它总是成对存在的
在这里可以把它想象成一对儿靠虚拟网线连接起来的两个虚拟网卡
一端连接着docker容器,一端连接着虚拟网桥 docker0 。
通过这种方式,不同docker容器之间可以通过ip地址互相通信
也可以通过虚拟网桥访问主机上的网络 eth0
(添加iptables规则,将docker容器对目标地址发出的访问通过地址伪装 的方式修改为主机对目标地址进行访问)
如果想要外界网络访问docker容器时,需要在docker容器启动时加上参数'-p [主机端口]:[容器端口]'进行端口映射
原理也是通过修改iptables规则将访问[主机端口]的数据转发到docker容器的[容器端口]中
但是这种做法也存在着占用主机有限的端口资源的缺点。
安装Docker时,它会自动创建三个网络:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
557d70cd18ab bridge bridge local
27015fb1d01c host host local
d7bdd36df894 none null local
除非您使用该docker run –network=<NETWORK>选项另行指定,否则Docker守护程序默认情况下将容器连接到此网络。您可以使用主机上的ifconfig命令将此桥接器视为主机网络堆栈的一部分:
$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:47:bc:3a:eb
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:47ff:febc:3aeb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:17 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1100 (1.1 KB) TX bytes:648 (648.0 B)
默认的名为bridge的网络是有很多限制的,为此,我们可以自行创建bridge类型的网络。默认的bridge网络与自建bridge网络有以下区别:
端口不会自行发布,必须使用-p参数才能为外界访问
而使用自建的bridge网络时,container的端口可直接被相同网络下的其他container访问
container之间的如果需要通过名字访问,需要`--link`参数,
而如果使用自建的bridge网络,container之间可以通过名字互访
注: 不建议采用这种方法
二. 无网络模式 - none¶
顾名思义,所有加入到这个网络模式中的container,都”不能”进行网络通信。
三. 宿主网络模式 - host¶
直接使用宿主机的网络,端口也使用宿主机的
这种网络模式将container与宿主机的网络相连通,虽然很直接,但是却破获了container的隔离性
该模型仅适用于Docker17.6及以上版本
四. 自定义网络¶
docker 允许我们创建3种类型的自定义网络,bridge,overlay,MACVLAN:
bridge:Bridge模式是Docker默认的网络模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,用来连接宿主机和容器
此主机上的Docker容器都会连接到这个虚拟网桥上
overlay:当有多个docker主机时,跨主机的container通信
可以连接多个docker守护进程或者满足集群服务之间的通信;适用于不同宿主机上的docker容器之间的通信
macvlan:每个container都有一个虚拟的MAC地址
可以为docker容器分配MAC地址,使其像真实的物理机一样运行
plugins :使用第三方网络驱动插件;