docker 端口映射 及外部沒法訪問問題

docker容器內提供服務並監聽8888端口,要使外部可以訪問,須要作端口映射。docker

docker run -it --rm -p 8888:8888 server:v1

此時出現問題,在虛機A上部署後,在A內可以訪問8888端口服務,可是在B卻不能訪問。併發

這應該是因爲請求被攔截。tcp

1、查看firewall-cmd --stateui

若是輸出的是「not running」則FirewallD沒有在運行,且全部的防禦策略都沒有啓動,那麼能夠排除防火牆阻斷鏈接的狀況了。spa

若是輸出的是「running」,表示當前FirewallD正在運行,須要再輸入下面的命令查看如今開放了哪些端口和服務:rest

firewall-cmd --list-ports
firewall-cmd --list-services

解決方案有兩種:code

1.關閉FirewallD服務:server

若是您不須要防火牆,那直接關掉FirewallD服務就行了blog

systemctl stop firewalld.service

2.添加策略對外打開指定的端口:ip

好比咱們如今要打開對外5000/tcp端口,可使用下面的命令:

firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload

若是隻是臨時打開端口,去掉第一行命令中的「--permanent」參數,那麼當再次重啓FirewallD服務時,本策略將失效。

2、ip轉發沒有打開

sysctl net.ipv4.ip_forward

顯示net.ipv4.ip_forward=0則表示未打開。

3、service iptables打開並攔截了

可關閉service iptables

service iptables stop

若docker run時出現錯誤:

iptables: No chain/target/match by that name.

則只需重啓docker服務便可

service docker restart

 或者:

#設置iptables防火牆爲開機啓動項 
systemctl enable iptables.service

#啓動防火牆使配置文件生效 
systemctl start iptables.service

#中止防火牆 
systemctl stop iptables.service

#重啓防火牆使配置文件生效  
systemctl restart iptables.service

 

最終版本:

啓動docker並進行端口映射後,docker會在iptables中添加DNAT規則,將收到的對應端口的包轉換ip並進行轉發,同時添加規則將全部來自docker網域的ip進行轉換。

可是在Centos7上出現docker能夠正常訪問外網,可是外網發出的請求在通過eth1接收轉發後送達不到docker0,或者送到卻出現(oui Unknown)的情況。暫時不清楚這究竟是爲何通過DNAT後沒法送達docker0.

最終解決辦法是在啓動docker後,重啓iptables

service iptables restart

清空docker添加的全部規則,然後添加規則

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

將全部來自docker的包172.17.0.0/16的ip替換爲本機ip併發送,以達到docker訪問外網的目的。

相關文章
相關標籤/搜索