文章目录
一、Docker原生网络
docker安装后会自动创建3种网络:bridge、host、none
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的NAT规则后可以访问外网。
host网络模式需要在容器创建时指定 --network=host
docker run -d --name demo --network host nginx
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
none模式是指禁用网络功能,只有lo接口,在容器创建时使用
–network=none指定。
docker run -d --network none nginx
访问本机被拒绝
二、Docker自定义网络
自定义网络模式,docker提供了三种自定义网络驱动:
bridge
overlay
macvlan
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
overlay和macvlan是用于创建跨主机网络。
建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。
创建自定义网桥:
docker network create -d bridge mynet1
docker network inspect mynet1
也可以自定义网段
docker network create -d bridge --subnet 10.0.0.1/24 --gateway 10.0.0.1 mynet1
清空docker ps
使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的。
ip a
那么如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为vm1添加一块my_net2 的网卡。
三、Docker容器通信
容器之间除了使用ip通信外,还可以使用容器名称通信。
- docker 1.10开始,内嵌了一个DNS server。
- dns解析功能必须在自定义网络中使用。
- 启动容器时使用 --name 参数指定容器名称。
Joined容器一种较为特别的网络模式。
在容器创建时使用–network=container:web1指定。(web1指定的是运行的容器名)
–link 可以用来链接2个容器。
--link的格式:
--link <name or id>:alias
name和id是源容器的name和id,alias是源容器在link下的别名。
外网如何访问容器:
通过端口映射外网可以访问到容器
-p 选项指定映射端口
iptables -t nat -nL
外网访问server11主机,访问成功。
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
此时POSTROUTING中还有172.17.0.0/16的路由
真机联网,进入任一容器ping外网,发现可以通信
删除172.17.0.0/16的路由
iptables -t nat -D POSTROUTING 1 #删除路由POSTROUTING的第一条
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -j MASQUERADE #添加路由到POSTROUTING中
iptables -t nat -nL #查看
再次再容器中ping外网,发现网络不通
将删除的路由添加回来并检查
再次进入容器ping外网,发现可以通信
四、跨主机容器网络
跨主机网络解决方案
docker原生的overlay和macvlan
第三方的flannel、weave、calico
众多网络方案是如何与docker集成在一起的
libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象
准备第二台主机,安装docker-ce并配置好docker专属的软件仓库
实验准备:
server101:
cd /etc/yum.repos.d
scp docker.repo server102:/etc/yum.repos.d
cd /etc/sysctl.d
scp docker.conf server102:/etc/sysctl.d
server102:
yum install -y docker-ce等众多软件\
systemctl start docker
docker info
sysctl --systemd
systemctl enable --now docker
为server101和server102添加一块网卡,同时需要修改网卡配置文件,之后检查
virt-manager
关闭server101,添加网卡后重启
cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 icfg-eth1
ip addr show eth1
macvlan网络方案实现
- Linux kernel提供的一种网卡虚拟化技术。
- 无需Linux bridge,直接使用物理接口,性能极好。
在两台docker主机上各添加一块网卡,打开网卡混杂模式:
在两台docker主机上各创建macvlan网络:
macvlan网络结构分析
没有新建linux bridge
容器的接口直接与主机网卡连接,无需NAT或端口映射。
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4096个逻辑网络,彼此隔离.
实验: