四、 网络
网络模式
docker network ls #查看所有网络模式
- (1) bridge
默认网络,docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中,IP地址时172.17.0.1/16
ifconfig时有个docker0的网桥,是虚拟的,作用,二层交换机,
(2) host
容器不会获得一个独立的network namespace,而是与宿主机公用一个。使用宿主机的IP和端口,不做nat转换。 –net host(3) none
(4) container
与指定的容器使用同一个network namespace,网卡配置也都是相同的。(5)自定义
自定义网桥,默认与bridge网络一样。
有个管理网桥的工具 brctl ,
brctl show #查看此机器上的所有网桥,docker0这个网桥,将容器的网卡加入到网桥中,ifconfig中veth…
比如,容器要访问外网,数据包先发送到网关,网关就是宿主机上docker0的设备,数据包到达了宿主机的命名空间后,也就是veth0在宿主机的一端,linux内核收到这个数据包,做路由选择,看是发送给本机,还是外部—》linux内核的TCP协议栈,将数据包做一个snet,将源地址的IP修改为可以上外网的宿主机的网卡IP,并发送到目的地址,(目的地址收到的IP就是eth0公网IP)。
2. 容器网络访问原理
容器网络访问原理
容器访问外部
iptables -t nat -nL
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j MASQUERADE #动态获取宿主机的IP然后做源地址的修改,数据包出去后会先走这个,linux根据这个做相应处理
容器访问外部网络,就是添加了上面那个MASQUERASDE的规则,类似于snat 的规则。添加这个规则之后,就可以将这个linux接收的网段172.17.0.0 所有的数据包进行转换,并发送到外网。
snat 一般这么写:
iptables -t nat POSTROUTING -s 172.0.0.10/24 -j SNAT --to 192.168.1.120
测试:
docker run -itd -p 88:80 ubuntu #生成一个容器,映射个端口,看网络会多出个啥规则
iptables -t nat -nL
多了个DNAT,是目标地址的转换,在TCP协议栈,将目标地址修改为。。
iptables -t nat -A PROROUTING路有前 -d 外网网卡192.168.1.120 --dport 宿主机端口 88 -j DNAT --to 172.17.0.3:80
测试一下:
创建一个不是dnat的
docker run -itd --name dnat01 no-dnat richarvey/nginx-php-fpm
docker ps -l
创建一个是dnat的
docker run -itd -p 88:80 --name dnat richarvey/nginx-php-fpm
如果访问不到,重置下iptables规则
iptables -F ;iptables -t nat -F ,
重启下docker,
docker start nat,docker start nodnat
获取no-dnat的IP172.17.0.3,再添加个规则
iptables -t nat -A PREROUTING -d 192.168.1.120 -p tcp --dport 89 -j DNAT --to 172.17.0.3:80
添加完规则后,iptables -t nat -nL ,查看chain docker
浏览器访问:192.168.1.120:89
- 桥接宿主机网络 与 配置固定IP
- 容器SSH连接