Docker的那些事儿—容器与外部网络的连通(27)


上一篇:Docker的那些事儿—容器间的通信方式(26)


前面探讨了容器与容器,容器与主机间的连通,这节我们探讨下容器与外部网络之间的连通。

1、容器访问外部网络

Docker的那些事儿—容器与外部网络的连通(27)_第1张图片

进入容器内部,尝试ping www.baidu.com

Docker的那些事儿—容器与外部网络的连通(27)_第2张图片

我们查询宿主机上的路由:

默认的路由是通过enp0s3向外发送数据包的,而我们前面又知道容器与宿主机相通是通过docker0连通的。因此,我们有理由猜测docker0与enp0s3之间一定存在某种关系。我们针对这两个网桥抓取数据包看一下:

Docker的那些事儿—容器与外部网络的连通(27)_第3张图片
Docker的那些事儿—容器与外部网络的连通(27)_第4张图片
Docker的那些事儿—容器与外部网络的连通(27)_第5张图片

我们模拟发了三个数据包,当数据包从172.17.0.2 > 119.75.213.61的时候,转换成了192.168.1.111 > 119.75.213.61。这就是我们上图中画的iptables NAT转换的结果,这也就使得数据包能够到达外网。而实际上宿主机上的iptables上的该条规则:对于docker0收到来自172.17.0.2/16网段发送的数据包,就将其交到MASQUERADE处理;而MASQUERADE就是将数据包的源地址替换为宿主机地址进而发送出去,也就是我们上面说的做了一次NAT转换。

Docker的那些事儿—容器与外部网络的连通(27)_第6张图片

2、外部网络访问容器

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数指定端口映射。

(1)-P它会随机映射一个端口至容器内部开放的网络端口。

(2)-p可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。端口映射支持的格式有:

ip:hostport:containerport   #指定ip、指定主机port、指定容器port

ip::containerport          #指定ip、未指定主机port、指定容器port

hostport:container        #未指定ip port、指定主机port、指定容器port

Docker的那些事儿—容器与外部网络的连通(27)_第7张图片

容器以-P的形式启动的,docker ps查询到端口映射情况如下:

浏览器输入:http://192.168.1.111:32769,可见可以访问容器应用

Docker的那些事儿—容器与外部网络的连通(27)_第8张图片

docker-proxy监听来自端口32769的数据包将其转到容器172.17.0.2:80进行响应。



下一篇:Docker的那些事儿—Docker数据管理(28)


Docker的那些事儿—容器与外部网络的连通(27)_第9张图片

你可能感兴趣的:(Docker的那些事儿—容器与外部网络的连通(27))