問題描述
我在A服務器上啟動了個apache的docker,使用命令如下
docker run -id -p 8080:80 --name test_apache -v /var/www/houtai:/var/www/houtai apache:latest
docker啟動之后,使用netstat -ntalp | grep 8080
發現端口監聽成功,然后就到客戶機去發起請求發現請求不成功,提示連接失敗,然后使用telnet
發現8080端口不通,這個時候去檢查firewalld
和selinux
發現都是處於關閉狀態,在A服務器上telnet
8080端口發現正常通信,使用iptables -t nat -L
檢查iptables
轉發正常,但是就是不通,
問題解決辦法
根據上面問題排查分析后 肯定是轉發那一塊出問題了,於是想到Linux轉發要開啟內核轉發功能net.ipv4.ip_forward
,於是檢查內核轉發是否打開
[root@localhost ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0
發現狀態為0代表內核轉發沒有打開,估計問題就是這個鬼造成的,於是打開內核轉發參數
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@localhost ~]# sysctl -p #刷新下內核參數
然后客戶端再次請求發現正常。
反思
1,docker 的proxy在1.7 版本之后全部都依賴於iptables
了
2,所以docker轉發的時候實際上是在iptables上創建了一個轉發規則,然后根據這個轉發規則來進行轉發
3,iptables需要轉發就必須要開啟網卡轉發功能,也就是net.ipv4.ip_forward
要出於開啟狀態
檢查流程:
1, 檢查docker 容器是否啟動正常
2,使用docker port Name 查看容器端口是否映射成功
3,使用iptables -t nat -nL 查看iptables轉發鏈是否配置成功
4,檢查網卡轉發是否開啟