docker(12)和docker(11)已经介绍过原生网络和自定义网络

前言

建议使用自定义的网桥来控制那些容器可以相互通信,还可以自动DNS解析容器名称到IP地址
Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Overlay或Macvlan网络

你还可以创建一个网络插件或远程网络进行完整的自定义和控制
你可以根据需要创建任意数量的网络,并且可以在任何给定时间将容器连接到这些网络中的零个或多个网络
此外,您可以连接并断开网络中的运行容器,而无需重新启动容器
当容器连接到多个网络时,其外部连接通过第一个非内部网络以词法顺序提供

一、容器如何访问外网是通过iptables的SNAT实现的?

docker 容器外操作容器 docker容器内部与外网通信_自定义

二、外网如何访问容器?

端口映射,-p指定对应端口

外网访问容器用到了docker-proxy和iptables DNAT

宿主机访问本机容器使用的是iptables DNAT

外部主机访问容器或容器之间的访问是docker-proxy实现

外部主机-->宿主机(eth0)-->docker-proxy(外部主机访问容器时通过docker-proxy处理数据包,不是防火墙)-->docker0(172.17.0.1)-->容器

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_02

三、实验过程:

实验环境:rhel7.3首先查看当前的iptable的nat表火墙策略

[root@server1 ~]# iptables -t nat -nL

docker 容器外操作容器 docker容器内部与外网通信_自定义_03

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_04


docker 容器外操作容器 docker容器内部与外网通信_自定义_05


docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_06

docker 容器外操作容器 docker容器内部与外网通信_docker_07


演示一下如何实现两个容器的ip一模一样,相当于原生网络的host模式

docker 容器外操作容器 docker容器内部与外网通信_docker_08


docker 容器外操作容器 docker容器内部与外网通信_nginx_09


演示完毕并且清空实验环境

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_10

创建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表的最后一行看到使用了端口转发

docker 容器外操作容器 docker容器内部与外网通信_自定义_11

docker 容器外操作容器 docker容器内部与外网通信_docker_12

docker 容器外操作容器 docker容器内部与外网通信_docker_13

docker 容器外操作容器 docker容器内部与外网通信_docker_14


先以默认的网络运行一个容器vm1然后使用link方法运行另外一个容器vm2

docker 容器外操作容器 docker容器内部与外网通信_docker_15

docker 容器外操作容器 docker容器内部与外网通信_docker_16


env:环境变量

docker 容器外操作容器 docker容器内部与外网通信_nginx_17

docker 容器外操作容器 docker容器内部与外网通信_docker_18

docker 容器外操作容器 docker容器内部与外网通信_nginx_19


#外部主机访问容器

外部主机-->宿主机(eth0)(172.25.10.1:80)-->DNAT-> 172.17.0.2:80(容器地址)

docker 容器外操作容器 docker容器内部与外网通信_自定义_20

docker 容器外操作容器 docker容器内部与外网通信_自定义_21

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_22

docker 容器外操作容器 docker容器内部与外网通信_docker_23

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_24


docker 容器外操作容器 docker容器内部与外网通信_docker_25


docker 容器外操作容器 docker容器内部与外网通信_自定义_26

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_27


docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_28

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_29

docker 容器外操作容器 docker容器内部与外网通信_docker_30


docker 容器外操作容器 docker容器内部与外网通信_自定义_31


docker 容器外操作容器 docker容器内部与外网通信_nginx_32


docker 容器外操作容器 docker容器内部与外网通信_自定义_33

docker 容器外操作容器 docker容器内部与外网通信_docker_34


docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_35

docker 容器外操作容器 docker容器内部与外网通信_nginx_36

docker 容器外操作容器 docker容器内部与外网通信_nginx_37

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_38


docker 容器外操作容器 docker容器内部与外网通信_自定义_39


docker 容器外操作容器 docker容器内部与外网通信_docker_40


docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_41

docker 容器外操作容器 docker容器内部与外网通信_nginx_42

docker 容器外操作容器 docker容器内部与外网通信_nginx_43


docker 容器外操作容器 docker容器内部与外网通信_自定义_44


docker 容器外操作容器 docker容器内部与外网通信_nginx_45

#外部主机访问容器 (宿主机) 外部主机–>宿主机(eth0)(172.25.10.1:80)–>DNAT-> 172.17.0.2:80(容器地址)

#外部主机访问容器 (物理机) 外部主机–>宿主机(eth0)–>docker-proxy(外部主机访问容器时通过docker-proxy处理数据包,不是防火墙)–>docker0(172.17.0.1)–>容器

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_46

docker 容器外操作容器 docker容器内部与外网通信_自定义_47

docker 容器外操作容器 docker容器内部与外网通信_nginx_48

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_49


docker 容器外操作容器 docker容器内部与外网通信_nginx_50


docker 容器外操作容器 docker容器内部与外网通信_自定义_51


docker 容器外操作容器 docker容器内部与外网通信_docker_52


docker 容器外操作容器 docker容器内部与外网通信_自定义_53


docker 容器外操作容器 docker容器内部与外网通信_自定义_54


docker 容器外操作容器 docker容器内部与外网通信_docker_55

实现了真机可以访问宿主机上的容器

docker 容器外操作容器 docker容器内部与外网通信_docker_56

清理实验环境

docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_57


docker 容器外操作容器 docker容器内部与外网通信_docker_58


docker 容器外操作容器 docker容器内部与外网通信_docker 容器外操作容器_59