docker与iptables关系(转)
来源:互联网 发布:百度 程序员 签字费 编辑:程序博客网 时间:2024/06/07 13:28
1、首先了解一下docker的网络机制
docker有4中网络模式:
a.host
b.container
c.none
d.bridge
docker使用linux中的namespace隔离资源,一个docker容器会分配一个独立的network namespace。但是如果容器采用host时,那么这个容器会和宿主机公用一个network namespqce,容器将不会虚拟出自己的网卡,配置自己的ip,而是使用宿主机的ip和端口
contianer模式是指和已经存在的一个容器共享一个network namespaces,那两个容器除了网络方面,其它的资源还是隔离的,两个容器的进程可以通过lo网卡设备通信
none模式时docker拥有自己的network namespaces,但是docker进行任何网络配置,需要我们自己为docker容器添加网络、配置ip
bridge模式是docker默认的网络设置,此模式会为每个容器分配network namespace、设置ip等,并将一个主机的docker容器连接到一个虚拟网络上
下面说明一下最常用的bridge模式
1.1 bridge模式下的拓扑结构
当docker deamon 启动的时候会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似。
docker会从分配与宿主机不同的ip地址给docker网桥和container。
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.240.0 broadcast 0.0.0.0
ether 02:42:a7:07:f4:fc txqueuelen 0 (Ethernet)
RX packets 13612806 bytes 1998086329 (1.8 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17525195 bytes 2961142842 (2.7 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以把docker0看作网桥的管理接口
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 192.168.0.3 tcp dpt:15672
ACCEPT tcp -- 0.0.0.0/0 192.168.0.3 tcp dpt:5672
ACCEPT tcp -- 0.0.0.0/0 192.168.0.2 tcp dpt:6379
ACCEPT tcp -- 0.0.0.0/0 192.168.0.4 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 192.168.0.5 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 192.168.0.6 tcp dpt:33246
以上是iptables出来的的不同container的IP和port
1.2 新建的docker container 完成以上网络配置的过程大致如此:
首先在主机上创建虚拟网卡veth pair设备,成对出现,组成一个数据通道。一端在container里,并命名为eth0,另一端放在主机中以veth。。命令,用$brctl show如下:
bridge name bridge id STP enabled interfaces
docker0 8000.0242a707f4fc no veth0dca6c1
veth430a377
vethb6dcd90
vethe08439b
vethe56b601
vethfc60fba
然后会分配一个IP给container,并设置docker0的ip地址为容器的默认网关
1.3 bridge模式下的容器通信
在bridge模式下连在同一网桥下的容器可以相互通信。
容器发包出去的过程:ip包会从container发往自己默认的网关docker0,到包到达docker0时就时到达了主机,这时候会查询主机的路由表,发现包应该从主机的网卡eth0出去,如下的iptables的规则就起作用,对包做snat转换,将原地址转成eth0的地址,这样对于外部来说docker容器就是不可见的:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
容器接受包的过程,需要用到主机的端口映射:
看ipbtales:
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-ISOLATION all -- anywhere anywhere
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere
对主机相应端口的流量进行dnat转换,将流量发往container
docker有4中网络模式:
a.host
b.container
c.none
d.bridge
docker使用linux中的namespace隔离资源,一个docker容器会分配一个独立的network namespace。但是如果容器采用host时,那么这个容器会和宿主机公用一个network namespqce,容器将不会虚拟出自己的网卡,配置自己的ip,而是使用宿主机的ip和端口
contianer模式是指和已经存在的一个容器共享一个network namespaces,那两个容器除了网络方面,其它的资源还是隔离的,两个容器的进程可以通过lo网卡设备通信
none模式时docker拥有自己的network namespaces,但是docker进行任何网络配置,需要我们自己为docker容器添加网络、配置ip
bridge模式是docker默认的网络设置,此模式会为每个容器分配network namespace、设置ip等,并将一个主机的docker容器连接到一个虚拟网络上
下面说明一下最常用的bridge模式
1.1 bridge模式下的拓扑结构
当docker deamon 启动的时候会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似。
docker会从分配与宿主机不同的ip地址给docker网桥和container。
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.240.0 broadcast 0.0.0.0
ether 02:42:a7:07:f4:fc txqueuelen 0 (Ethernet)
RX packets 13612806 bytes 1998086329 (1.8 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17525195 bytes 2961142842 (2.7 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以把docker0看作网桥的管理接口
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 192.168.0.3 tcp dpt:15672
ACCEPT tcp -- 0.0.0.0/0 192.168.0.3 tcp dpt:5672
ACCEPT tcp -- 0.0.0.0/0 192.168.0.2 tcp dpt:6379
ACCEPT tcp -- 0.0.0.0/0 192.168.0.4 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 192.168.0.5 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 192.168.0.6 tcp dpt:33246
以上是iptables出来的的不同container的IP和port
1.2 新建的docker container 完成以上网络配置的过程大致如此:
首先在主机上创建虚拟网卡veth pair设备,成对出现,组成一个数据通道。一端在container里,并命名为eth0,另一端放在主机中以veth。。命令,用$brctl show如下:
bridge name bridge id STP enabled interfaces
docker0 8000.0242a707f4fc no veth0dca6c1
veth430a377
vethb6dcd90
vethe08439b
vethe56b601
vethfc60fba
然后会分配一个IP给container,并设置docker0的ip地址为容器的默认网关
1.3 bridge模式下的容器通信
在bridge模式下连在同一网桥下的容器可以相互通信。
容器发包出去的过程:ip包会从container发往自己默认的网关docker0,到包到达docker0时就时到达了主机,这时候会查询主机的路由表,发现包应该从主机的网卡eth0出去,如下的iptables的规则就起作用,对包做snat转换,将原地址转成eth0的地址,这样对于外部来说docker容器就是不可见的:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
容器接受包的过程,需要用到主机的端口映射:
看ipbtales:
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-ISOLATION all -- anywhere anywhere
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere
对主机相应端口的流量进行dnat转换,将流量发往container
0 0
- docker与iptables关系(转)
- docker 与 iptables的关系
- Netfilter与iptables的关系
- docker与openstack的关系
- Moby与docker的关系
- iptables 表与链的关系图
- IPTables工具及其与netfilter关系介绍
- IPTables工具及其与netfilter关系介绍
- iptables与netfilter的关系简单讲解
- IPTables工具及其与netfilter关系介绍
- IPTables工具及其与netfilter关系介绍
- docker iptables配置
- Oracle 与 iptables 和 SELinux 禁用关系 说明
- Oracle 与 iptables 和 SELinux 禁用关系 说明(好文转抄)
- iptables四个表与五个链间的处理关系
- iptables四个表与五个链间的处理关系
- iptables四个表与五个链间的处理关系
- 安全组规则与iptables规则的关系
- 输入年天数求解年月日
- Redis部署与安装
- 可以滚动的Label标签
- SQL truncate 、delete与drop区别
- Python flask-restful的安装使用
- docker与iptables关系(转)
- 欢迎使用CSDN-markdown编辑器
- B树、B-树、B+树的知识点(联系磁盘)
- jsp中include指令和include动作区别
- C++作业3-1 3 4
- 线程池ExecutorService的submit和execute
- php将十六进制颜色值转换为十进制
- 二叉树之一BST树,AVL树详解及B树和红黑树原理分析
- 分段分颜色环形进度条