四、 docker网络

四、 网络

网络模式
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

  1. 桥接宿主机网络 与 配置固定IP
  2. 容器SSH连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值