上一篇我们主要讲了一些简单的docker网络,包括自定义网络,但都是限制于一台主机,这节我们主要来学习下容器访问不同主机上的容器和访问容器外的通信网络。
一、容器访问外部通信
我们的主机和默认的网桥容器都是可以访问外部网络,通过抓包可以看出来是docker0也是通过本机的ens33网络把流量转发到外网的
(1)、容器busybox发出ping包:172.17.0.6 > www.baidu.com
(2)、docker0收到数据包,发现是请求外网的地址,交给NAT处理
(3)、NAT讲源地址转换为ens33的地址:192.168.157.147去访问www.baidu.com
(4)、ping包从网卡ens33发出去,到达www.baidu.com
(5)、回包以相同的原因发给容器busybox,实现了和外网通信
二、外部访问容器
外部访问容器的方式是通过端口映射,将容器的端口映射到宿主机上,实现监听和被访问,每一个映射端口,host都会启动一个docker-proxy进程来处理转发访问的流量
[root@my_server ~]# docker run -d -p 80 httpda4a1105bb26d047b5eb5638051cb06360ef4a46ad587738c90ee8c2c0ebb9259[root@my_server ~]# docker ps |grep a4aa4a1105bb26d httpd "httpd-foreground" 11 seconds ago Up 10 seconds 0.0.0.0:32768->80/tcp keen_wilbur[root@my_server ~]# docker port a4a1105bb26d80/tcp -> 0.0.0.0:32768 [root@my_server ~]# curl 127.0.0.1:32768
It works!
[root@my_server ~]# ps -ef|grep docker-proxyroot 24113 6615 0 14:35 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32768 -container-ip 172.17.0.5 -container-port 80root 24406 19472 0 14:38 pts/1 00:00:00 grep --color=auto docker-proxy
三、 docker原生网络方案---overlay
概念理解:docker提供overlay driver,用户创建基于VxLAN的overlay网络,可用将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的二次以太网服务,但拥有更强的扩展性和灵活性
下面我们就通过实验来理解overlay网络
3.1、部署consul: 一款服务发现和配置的工具,用来保存网络信息
docker run -d -p 8500:8500 -h consul --name sonsul progrium/consul -server -bootstrap
浏览器打开http://HostIP:8500 ( http://180.76.166.112:8500 )
3.2、修改其他机器的docker daemon配置文件
$ vim /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://180.76.166.112:8500 --cluster-advertise=eth0:2375$ systemctl daemon-reload$ systemctl restart docker
--cluster-store 指定consul的地址--cluster-advertise 告诉consul自己的地址
3.3、在host1上创建overlay网络
$ docker network create -d overlay ov_net1 -d=--driver$ docker network lsNETWORK ID NAME DRIVER SCOPE8a0c50e2cc2a bridge bridge locala0eae8fcf59f host host local5c1ae9b1bbdc none null local7db2c879fd97 ov_net1 overlay global
在另一台host2上查看网络
$ docker network lsNETWORK ID NAME DRIVER SCOPEe8aca831788d bridge bridge local863d202d5ec8 host host local09428010ca91 none null local7db2c879fd97 ov_net1 overlay global
要想使用Docker原生Overlay网络,需要满足下列任意条件
- Docker 运行在Swarm
- 使用键值存储的Docker主机集群 (需要内核版本>=3.12+),支持VXLAN数据包处理
3.4、测试overlay网络,在host1运行bbox1容器
$ docker run -itd --name bbox1 --network ov_net1 busybox$ docker exec bbox1 ip rdefault via 172.18.0.1 dev eth1 10.0.0.0/24 dev eth0 scope link src 10.0.0.2 172.18.0.0/16 dev eth1 scope link src 172.18.0.2
在host2运行bbox2容器
$ docker run -itd --name bbox2 --network ov_net1 busybox$ docker exec bbox2 ping -c 4 bbox1PING bbox1 (10.0.0.2): 56 data bytes64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.973 ms64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.769 ms64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.685 ms64 bytes from 10.0.0.2: seq=3 ttl=64 time=0.702 ms--- bbox1 ping statistics ---4 packets transmitted, 4 packets received, 0% pac
四、 docker原生网络方案---macvlan
原理:本身是linux kernel模块,允许同一个物理网卡配置多个MAC地址。即多个interface,每个接口配置自己IP,本质是一种网卡虚拟化技术
优点:性能好
4.1、开启网卡的混杂模式(两台都开启)
ip link show eth0eth0: mtu 1400 qdisc pfifo_fast state UP mode DEFAULT qlen 1000link/ether fa:16:3e:8c:e3:94 brd ff:ff:ff:ff:ff:ff[root@instance-376y292g-2 ~]# ip link set eth0 promisc on[root@instance-376y292g-2 ~]# ip link show eth02: eth0: mtu 1400 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether fa:16:3e:8c:e3:94 brd ff:ff:ff:ff:ff:ff
PROMISC:混杂模式,指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。
4.2、创建macvlan网络(在两台机器上都要执行)
$ docker network create -d macvlan --subnet=192.168.32.0/24 --gateway=192.168.32.1 -o parent=eth0 mac_net1
这里网关应该是真实存在的,因为docker不会为macvlan创建网关
-o parent 指定使用网络interface
4.3、进行测试,在host1上运行bbox1容器,在host2上运行bbox2容器
$ docker run -itd --name bbox1 --ip=192.168.32.10 --network=mac_net1 busybox$ docker run -itd --name bbox2 --ip=192.168.32.11 --network=mac_net1 busybox$ docker exec -it bbox2 ping -c 4 192.168.32.10
本篇的介绍了docker如何和外部通信和外部如何访问容器,还有docker原生网络解决方案overlay和macvlan,下一节我们开始学习docker网络第三方常见的解决方案,感谢您的阅读,欢迎关注和转发