首先启动一个 tomcat容器,将其8080端口映射到宿主机上的18080端口上
docker run -itd --name tomcat01 -p 18080:8080 tomcat:latest
查看iptabels
规则
iptables-save | grep 18080
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 18080 -j DNAT --to-destination 172.17.0.3:8080
iptables-save | grep 8080
*nat
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 8080 -j MASQUERADE
*filter
-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT
- 规则将访问
宿主机18080
端口的流量转发到了172.17.0.4
的8080
端口上(即真正提供服务的Docker
容器IP
和端口
) - 在
nat
、filter
的Docker链
中分别增加了一条规则 外界
访问Docker容器
是通过iptables
做DNAT
(目的地址转换)实现的
自定义限制外部ip规则
Docker
的forward
规则默认允许所有的外部IP访问容器- 可以通过在
filter
的DOCKER
链上添加规则
来对外部的IP
访问做出限制
iptables -I DOCKER -i docker0 ! -s 192.168.0.0/16 -j DROP
// 只允许源IP192.168.0.0/16的数据包访问容器
docker网络与ip-forward
在Docker容器和外界通信的过程中,还涉及了数据包在多个网卡间的转发
如从docker0网卡转发到宿主机ens160网卡
这需要内核将ip-forward功能打开
即将ip_forward系统参数设1:
echo 1 > /proc/sys/net/ipv4/ip_forward
Docker daemon启动的时候默认会将其设为1(--ip-forward=true)