1. 程式人生 > 資料庫 >一次centos Docker網橋模式無法訪問宿主機Redis服務的故障排除經歷

一次centos Docker網橋模式無法訪問宿主機Redis服務的故障排除經歷

背景:

之前做了一個專案,需要在容器內訪問宿主機提供的Redis 服務(這是一個比較常見的應用場景哈), 常規方案:

① 主機網路(docker run --network=host): 完全應用主機網路堆疊,在容器內localhost就是指向宿主機

② 網橋網路(docker run --network=bridge): 這也是docker容器預設的網路通訊模式,容器內localhost 指向的是容器自身,不能使用 localhost 訪問宿主機上localhost:6379承載的Redis服務 。

docker會預設建立docker0 網橋;

網橋有一個閘道器ip, 有一個子網段; 網橋內容器從子網段中確定容器ip( ip addr eth0), 網橋內容器可通過 service name相互訪問;

網橋內容器通過 docker0 Getway得以訪問外網。

不做騷操作,沿用常見的②網橋模式:

第一步:自定義網橋並應用該自定義網橋

docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_bridge
docker run --network=app_bridge --name ......

# 以下擷取自docker-compose.yml檔案
......
networks:
 default:
 name: app_bridge
 external: true

為啥不利用預設docker0網橋?

本文開頭已講: docker0 是預設網橋,新建的容器預設都會加入這個網橋,所以我們需要建立一個專屬於本程式的網橋app_bridge

第二步:容器內建立 對應於宿主機的別名

為實現在容器內網橋模式訪問宿主機localhost:6379 的服務, 必須搭配docker 提供的 --add-host 選項(對應到docker-compose.yml這個配置是extra_host)。

docker run 的--add-host 選項能在 容器 /etc/hosts 檔案增加行記錄,便於我們使用該名稱訪問其他網路。

docker run -it --add-host dockerhost:172.16.1.1 ubuntu cat /etc/hosts
172.17.0.22 09d03f76bf2c
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
172.16.1.1 dockerhost

之後在程式的配置檔案即可應用 dockerhost:6379 訪問宿主機Redis服務。

------------------------------------------ 稍熟悉docker網路模型的朋友應該 都能理解並完成上述操作-----------------------------------------------------

一個狀況:

我在公司CentOS7機器上使用上述操作, 容器內一直無法連通宿主機(容器間還是能正常訪問)。

簡化問題測試:新建容器,在容器內嘗試ping docker0 閘道器, 嗶了狗了,4臺公司機器都ping不通docker0閘道器,外網還是正常訪問。

那這個問題就成了: 使用預設的docker0網橋,容器內無法ping通docker0閘道器,進而無法訪問宿主機。

呀呀呀呀, 八成是公司機器的配置問題 ~。。~

追問公司運維同學,發現:

Chain INPUT (policy DROP)

以上INPUT鏈的預設策略是丟棄:從容器內訪問宿主機的INPUT鏈規則並不匹配其中列出的任意一條,將被丟棄,所以我們從容器ping docker0閘道器會卡住收不到結果。

除非滿足列出的INPUT鏈規則,否則預設的策略就是丟棄。

後面還有轉發和OUTPUT鏈預設是 接受

這個策略的初衷是 伺服器安全(尼瑪, 導致容器訪問宿主機的基礎能力都沒有了!!!)。

運維方案:

① 使用 sudo service iptables stop 關閉iptables

② 把要使用的網橋網段加入 INPUT鏈

sudo iptables -I INPUT -s 172.17.0.0/16 -j ACCEPT

【接受docker0子網段172.17.0.0/16 INPUT】 加入規則, 傳送門

OK, That‘s All, 以後若有朋友在公司網路遇到 預設網橋容器內無法ping通網橋閘道器,進而無法訪問宿主機,可參考本文排障。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。