[故障排除]CentOS Docker網橋模式沒法訪問宿主機Redis服務

背景:

  以前作了一個項目,須要在容器內訪問宿主機提供的Redis 服務(這是一個比較常見的應用場景哈), 常規方案:html

①   主機網絡(docker run --network=host): 徹底應用主機網絡堆棧,在容器內localhost就是指向宿主機node

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

docker會默認創建docker0 網橋;ubuntu

網橋有一個網關ip, 有一個子網段; 網橋內容器從子網段中肯定容器ip( ip  addr eth0), 網橋內容器可經過 service name相互訪問;安全

網橋內容器經過 docker0 Getway得以訪問外網。 服務器

頭腦風暴

不作騷操做,沿用常見的②網橋模式, 網橋網絡模型以下所示:網絡

Docker 引擎在網橋上有個網關IP,容器在鏈接的網橋上有個容器IP。app

操做

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

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網橋?ide

本文開頭已講: 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網關會收不到結果。

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

運維方案:

 ①  使用 sudo service iptables stop 關閉iptables

 ②  將容器使用的源IP(網橋網段)加入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通網橋網關,進而沒法訪問宿主機,可參考本文排障。

原文出處:https://www.cnblogs.com/JulianHuang/p/11636825.html

相關文章
相關標籤/搜索