docker网络管理(四种网络模式)

Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.42.1/16, 容器启动后都会
被桥接到 docker0 上,并自动分配到一个 IP 地址。

修改 docker 的默认网络配置:
# systemctl stop docker
# ip link set dev docker0 down
# ip addr del 172.17.42.1/24 dev docker0
# ip addr add 192.168.0.1/24 dev dcoker0
# ip link set dev docker0 up
# cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
# vim /etc/systemd/system/docker.service
[Service]
Type=notify

ExecStart=/usr/bin/docker daemon -H fd:// --bip="192.168.0.1/24"
...
# systemctl daemon-reload
# systemctl start docker

docker网络管理(四种网络模式)_第1张图片

容器的四种网络模式:
bridge 桥接模式、host 模式、container 模式和 none 模式
启动容器时可以使用 --net 参数指定,默认是桥接模式。
以下是 docker 网络初始化的过程:

docker网络管理(四种网络模式)_第2张图片

docker网络管理(四种网络模式)_第3张图片

docker网络管理(四种网络模式)_第4张图片

一、Bridge 桥接模式的实现步骤主要如下:

(1) Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为
veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将
报文传输给另一方。
(2) Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
(3) Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。
如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到
Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网
络环境的隔离性。
bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,
该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致
的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了
这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器
内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层
网络上的实现手段,故肯定会影响网络的传输效率。

docker run -it --name vm3 ubuntu

 

网桥添加,会在网桥上有桥接
docker网络管理(四种网络模式)_第5张图片

二、Host 网络模式:

host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用
宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公
有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,
有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性
的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用 host 模式的 Docker Container 虽
然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱
化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资
源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网
络模式容器的端口映射。

docker run -it --name vm3 --net host ubuntu

 

与物理机相同
docker网络管理(四种网络模式)_第6张图片

三、Container 网络模式:

(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2) 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用
other container 的 namespace。
Docker Container 的 other container 网络模式,可以用来更好的服务于容器间的通信。
在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输
效率较高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他
容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要注意的是,
它并没有改善容器与宿主机以外世界通信的情况。

docker run -it --name vm4 --net container:vm1 ubuntu

 

和vm1相同
docker网络管理(四种网络模式)_第7张图片

四、None 网络模式:

网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了
none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
可以说 none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“
少即是多”
,在
没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制
开发。这也恰巧体现了 Docker 设计理念的开放。
在 none 网络模式下分配固定 ip:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟
化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。
使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则
等都是独立的,就好像进入了另外一个网络一样。

 docker run -it --name vm5 --net none ubuntu

 

这种方式创建没有网络,可以自己指定设置网络。
这里写图片描述

docker inspect vm5 |grep Pid  # 过滤vm5的进程id
cd /proc/14854
cd ns
ln -s /proc/14854/ns/net /var/run/netns/14854
ip link set veth1 netns 14854
ip netns exec 14854 ip link set veth1 name eth0
ip netns exec 14854 ip link set up dev eth0
ip netns exec 14854 ip addr add 172.17.0.100/24 dev eth0
ip netns exec 14854 ip route add default via 172.17.0.1

 

docker网络管理(四种网络模式)_第8张图片
docker网络管理(四种网络模式)_第9张图片
docker网络管理(四种网络模式)_第10张图片
检查网络:
docker网络管理(四种网络模式)_第11张图片

你可能感兴趣的:(运维,linux)