docker(12)和docker(11)已经介绍过原生网络和自定义网络
前言
建议使用自定义的网桥来控制那些容器可以相互通信,还可以自动DNS解析容器名称到IP地址
Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Overlay或Macvlan网络
你还可以创建一个网络插件或远程网络进行完整的自定义和控制
你可以根据需要创建任意数量的网络,并且可以在任何给定时间将容器连接到这些网络中的零个或多个网络
此外,您可以连接并断开网络中的运行容器,而无需重新启动容器
当容器连接到多个网络时,其外部连接通过第一个非内部网络以词法顺序提供
一、容器如何访问外网是通过iptables的SNAT实现的?
二、外网如何访问容器?
端口映射,-p指定对应端口
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
外部主机-->宿主机(eth0)-->docker-proxy(外部主机访问容器时通过docker-proxy处理数据包,不是防火墙)-->docker0(172.17.0.1)-->容器
三、实验过程:
实验环境:rhel7.3
首先查看当前的iptable的nat表火墙策略
[root@server1 ~]# iptables -t nat -nL
演示一下如何实现两个容器的ip一模一样,相当于原生网络的host模式
演示完毕并且清空实验环境
创建nginx的容器,配置端口映射。
[root@server1 ~]# docker run -d --name nginx -p 80:80 nginx
[root@server1 ~]# docker port nginx
80/tcp -> 0.0.0.0:80
[root@server1 ~]# netstat -ntpl | grep 80
tcp6 0 0 :::80 :::* LISTEN 3901/docker-proxy
[root@server1 ~]# iptables -t nat -nL
我们可以在nat表的最后一行看到使用了端口转发
先以默认的网络运行一个容器vm1
然后使用link方法运行另外一个容器vm2
env:环境变量
#外部主机访问容器
外部主机-->宿主机(eth0)(172.25.10.1:80)-->DNAT-> 172.17.0.2:80(容器地址)
#外部主机访问容器 (宿主机)
外部主机–>宿主机(eth0)(172.25.10.1:80)–>DNAT-> 172.17.0.2:80(容器地址)
#外部主机访问容器 (物理机)
外部主机–>宿主机(eth0)–>docker-proxy(外部主机访问容器时通过docker-proxy处理数据包,不是防火墙)–>docker0(172.17.0.1)–>容器
实现了真机可以访问宿主机上的容器
清理实验环境