背景
今天在一台新虛擬機上需要臨時啟動一個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來訪問容器服務了!!!