一.Docker网络
实验环境: docker安装后会自动创建3种网络:bridge、host、none iptables -nL ##
1.桥接网络
安装桥接网络 docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
运行一个容器查看桥接
删除掉容器后,桥接消失
2.host网络模式
需要指定network host curl 172.25.28.1
查看端口,可以发现docker运行的镜像nginx占用的是80端口 再运行一个容器demo2,ps 查看正在运行的容器只有demo,原因是:–network host会占用虚拟机的80端口,但是demo的80端口挤掉了demo2
查看日志:docker logs demo2,可以发现原因
3.none模式
none模式是指禁用网络功能,只有lo接口,在容器创建时使用 –network=none指定
二.自定义网络
自定义网络模式,docker提供了三种自定义网络驱动 : bridge overlay macvlan
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。
docker的ip不固定,哪个容器先起来,哪个先用前面的ip 默认情况不是用容器名称,ping ip
ping ip 可以
ping 名称不通
1.创建自定义网络
自定义mynet1网桥
运行容器,使其都连接在mynet1的自定义网桥上
测试: ping demo可以直接成功,说明可以提供解析
2.自定义网络
在创建时指定参数:--subnet 、--gateway
之前已经创建了mynet1网桥,subnet 为172.20.0.0/24,gateway为172.20.0.1,此处新建mynet2网桥时,subnet 和 gateway不能与mynet1重复!!
3.手动指定ip
4.双网卡实现不同网段间的容器通信
桥接到不同网桥上的容器,彼此是不通信的。 docker在设计上就是要隔离不同network的。 那么如何使两个不同网桥的容器通信呢: 使用 docker network connect命令为vm1添加一块my_net2 的网卡。 运行第一个容器搭mynet1网络,运行第二个容器搭mynet2网络 发现这两个容器ping不通!!
第二个容器的id为2c****,使mynet1 连接第二个容器,attach 第二个容器的id,再次ping 第一个容器,发现可以ping通 可以看到mynet1,mynet2的ip都出现在了里面!说明通信成功!
三.Docker容器通信
1.使用容器名称通信
容器之间除了使用ip通信外,还可以使用容器名称通信。 dns解析功能必须在自定义网络中使用。 启动容器时使用 --name 参数指定容器名称。 在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名) docker demo 必须是运行的!!!
Joined容器一种较为特别的网络模式。
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
2.–link可以用来链接2个容器
–link 可以用来链接2个容器。 –link的格式: –link **:alias
需要删除之前的demo
ping名字demo成功! Demo和web的ip:172.17.0.2, web 是容器内新开启的,和demo共用同一个ip Busybox的ip:172.17.0.3
域名是动态变化的: 可以发现:demo由原来的172.17.0.3 变为 172.17.0.4
3.容器如何访问外网
容器如何访问外网是通过iptables的SNAT实现的
直接可以访问外网(真实主机开启了地址伪装功能)
4.外网访问容器
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT;外部主机访问容器或容器之间的访问是docker-proxy实现 端口映射:-p 选项指定映射端口
查看目的地转换规则,第六条链
查看端口
删除第6条连: iptables -t nat -D DOCKER 6 , 查看没有
查看端口有docker-proxy,此时只有 docker-proxy
重新加入后查看
四.跨主机Docker容器通信
跨主机容器网络
- 跨主机网络解决方案:
docker原生的overlay和macvlan 第三方的flannel、weave、calico - 众多网络方案是如何与docker集成在一起的
libnetwork docker容器网络库 CNM (Container Network Model)这个模型对容器网络进行了抽象 - CNM分三类组件
Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace) Endpoint:作用是将sandbox接入network (veth pair) Network:包含一组endpoint,同一network的endpoint可以通信。
1.跨主机同网段容器通信
server1 打开混杂模式 server2 打开混杂模式 在两台docker主机上各创建macvlan1网络:
不同主机的容器可以ping 通 容器的接口直接与主机网卡连接,无需NAT或端口映射。
2.跨主机的不同网段的容器通信
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络 vlan可以将物理二层网络 划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。
server1和server2新加一块网卡eth1
编写eth1的网卡文件(server1和server2) 重新激活网卡:ifup eth1 ip link set up eth1启用网卡 eth1网卡的混杂模式打开(server1和server2) 删除之前的macvlan1和macvlan2 server1和server2创建macvlan2,注意网段需要改变一下和前面eth0不一样172.21.0.*
创建容器并运行,注意网段需要改变一下和前面eth0不一样172.21.0.* 在server2也需要创建容器并运行:
demo的信息中会自动生成和 macvlan1同网段172.20.*.*的ip:172.20.0.2 不同网段 172.21.0.10不能通信,但是生成的Ip172.20.0.2可以访问
3.docker network子命令
connect 连接容器到指定网络
create 创建网络
disconnect 断开容器与指定网络的连接
inspect 显示指定网络的详细信息
ls 显示所有网络
rm 删除网络
|