docker 端口映射 udp_Docker网络(中)

上一篇我们主要讲了一些简单的docker网络,包括自定义网络,但都是限制于一台主机,这节我们主要来学习下容器访问不同主机上的容器和访问容器外的通信网络。

一、容器访问外部通信

c78a69ee7b31125cba75c5251ebc6dde.png

我们的主机和默认的网桥容器都是可以访问外部网络,通过抓包可以看出来是docker0也是通过本机的ens33网络把流量转发到外网的

77de60d32accda12b767707bb205a68c.png
2265ae190fa27624f754f7e480784366.png
976d649a515847ec52afd66e838f13eb.png

(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 )

ddbb57a9bc3513f747f101ac0e699687.png

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自己的地址
a22ba1cd84995005593f6404b7a86e3f.png

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网络第三方常见的解决方案,感谢您的阅读,欢迎关注和转发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值