在CentOS 7 上为docker配置端口转发以兼容firewall的解决方法
在CentOS7上当我们以类似下列命令将主机端口与容器端口映射时可能遇到无法访问容器服务的问题
dockerrun--nameweb_a-p192.168.1.250:803:80-dweb_a:beta1.0.0.
由于docker在执行此命令时,是向iptables注入了一条规则将主机803映射到容器80端口,但是CentOS7中以firewalld服务替代了iptables。因此,上述命令的端口映射不会生效。
解决方法:首先观察一下主机上的网卡信息,确认增加了一个docker0的虚拟网卡:
[root@localhost/home]#ifconfig docker0:flags=4163mtu1500 inet172.17.0.1netmask255.255.0.0broadcast172.17.255.255 inet6fe80::42:5cff:fe0e:82f9prefixlen64scopeid0x20 ether02:42:5c:0e:82:f9txqueuelen0(Ethernet) RXpackets1288bytes1561177(1.4MiB) RXerrors0dropped0overruns0frame0 TXpackets1594bytes108755(106.2KiB) TXerrors0dropped0overruns0carrier0collisions0 enp2s0:flags=4163 mtu1500 inet192.168.1.250netmask255.255.255.0broadcast192.168.1.255 inet6fe80::76f4:9aea:4973:ec6cprefixlen64scopeid0x20 inet6240e:379:542:2800:8844:77ba:78dd:7prefixlen128scopeid0x0 inet6240e:379:542:2811:3ead:218:ba68:38e6prefixlen64scopeid0x0 ether74:d4:35:09:93:19txqueuelen1000(Ethernet) RXpackets10166908bytes1221399579(1.1GiB) RXerrors0dropped3014overruns0frame0 TXpackets982334bytes427296782(407.5MiB) TXerrors0dropped0overruns0carrier0collisions0 deviceinterrupt18 lo:flags=73 mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10 looptxqueuelen1000(LocalLoopback) RXpackets1833650bytes450567722(429.6MiB) RXerrors0dropped0overruns0frame0 TXpackets1833650bytes450567722(429.6MiB) TXerrors0dropped0overruns0carrier0collisions0 vethecef228:flags=4163 mtu1500 inet6fe80::f425:f1ff:fe82:9c19prefixlen64scopeid0x20 etherf6:25:f1:82:9c:19txqueuelen0(Ethernet) RXpackets234bytes1520113(1.4MiB) RXerrors0dropped0overruns0frame0 TXpackets613bytes39809(38.8KiB) TXerrors0dropped0overruns0carrier0collisions0
使用如下命令确认容器实例得到的虚拟ip:
dockerinspectweb_a
假设容器中的ip为172.17.0.2,接下来我们要为此IP做个NAT转发规则,并让firewalld服务处理此规则:
#主机端口请求转发到容器(容器中的服务不要监听localhost而要监听容器分配的虚拟IP或者以0.0.0.0替代) firewall-cmd--permanent--zone=public--add-masquerade启用端口NAT转发 #将主机803端口请求转发到容器上的80端口 firewall-cmd--add-forward-port=port=803:proto=tcp:toaddr=172.17.0.2:toport=80--permanent #重载规则 firewall-cmd--reload #列出所有规则 firewall-cmd--list-all public(active) target:default icmp-block-inversion:no interfaces:enp2s0 sources: services:sshdhcpv6-client ports:3306/tcp80/tcp21/tcp5000/tcp6379/tcp900/tcp801/tcp802/tcp6000/tcp5002/tcp90/tcp9092/tcp81/tcp803/tcp protocols: masquerade:yes forward-ports:port=803:proto=tcp:toport=80:toaddr=172.17.0.2 source-ports: icmp-blocks: richrules:
#重新启动docker systemctlrestartdocker #重新启动容器 dockerstartweb_a
经上述操作,就能以主机IP:803访问容器上的80端口的服务,并不需要关闭firewalld(很多网上的结论是换成iptables服务,实测不需要)。
总结
到此这篇关于在CentOS7上为docker配置端口转发以兼容firewall的解决方法的文章就介绍到这了,更多相关docker配置端口转发以兼容firewall内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!