1. 程式人生 > 實用技巧 >[Docker]Docker與Linux ip_forward資料包轉發

[Docker]Docker與Linux ip_forward資料包轉發

背景

今天在一臺新虛擬機器上需要臨時啟動一個consul服務,安裝Docker後使用docker啟動,但是在執行啟動命令後發現docker有一個警告:

WARNING: IPv4 forwarding is disabled. Networking will not work.

當時沒仔細看,使用docker ps檢視容器狀態後啟動正常,但是使用宿主機ip+port在瀏覽器訪問consul-ui時發現網路無法連線,但是在宿主機本身訪問服務是正常的,忽然想起來之前啟動時的WARN警告,所以重新啟動了一個新容器將問題復現。

原因

因為之前未出現過這樣的問題,經過google後發現:可能是與Linux的ip_forward設定有關係:

出於安全考慮,Linux系統預設是禁止資料包轉發的。所謂轉發即當主機擁有多於一塊的網絡卡時,
其中一塊收到資料包,根據資料包的目的ip地址將資料包發往本機另一塊網絡卡,
該網絡卡根據路由表繼續傳送資料包。這通常是路由器所要實現的功能。

要讓Linux系統具有路由轉發功能,需要配置一個Linux的核心引數net.ipv4.ip_forward。這個引數指定了Linux系統當前對路由轉發功能的支援情況;
其值為0時表示禁止進行IP轉發;如果是1,則說明IP轉發功能已經開啟。

使用過docker的小夥伴都知道,單機docker的網路架構實質上是在宿主機上安裝了一個docker0的網橋,從外部訪問容器內部時只需要訪問宿主機的地址和對應的容器對映的地址,訪問的資料包到宿主機上後經過ip包解析後通過目的port和iptables的規則會將資料包由eth0網絡卡轉發至docker0網橋上進行下一步路由。

所以如果容器的宿主機上的ip_forward未開啟,那麼該宿主機上的容器則不能被其他宿主機訪問

解決方案

檢查宿主機的ip_forward:

[root@dev ~]# cat  /proc/sys/net/ipv4/ip_forward
0

由查詢結果得知,我的這臺新虛擬機器確實沒有將ip_forward開啟,所以具體的解決方案就是修改ip_forward的值為1

臨時解決

直接修改/proc/sys/net/ipv4/ip_forward檔案的內容:

[root@dev ~]# echo 1 >  /proc/sys/net/ipv4/ip_forward
[root@dev ~]# cat  /proc/sys/net/ipv4/ip_forward
1

永久解決

修改/etc/sysctl.conf檔案

[root@dev ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@dev ~]# sysctl -p
[root@dev ~]#systemctl restart network
[root@dev ~]#systemctl restart docker.service

然後啟動新的容器,就可以通過宿主機ip:port來訪問容器服務了!!!