Docker容器訪問宿主機(jī)

使用docker部署是非常方便的,特別是一些大型系統(tǒng)的部署,下面來起看看

場景說明

系統(tǒng)部署時(shí)墅拭,數(shù)據(jù)庫沒有使用docker部署方式淤齐,這樣就需要docker容器能夠訪問宿主機(jī)的進(jìn)程股囊,目前問題是無法訪問宿主機(jī)。

原因分析

在 centos7 上部署 docker 容器更啄,其網(wǎng)絡(luò)模式采用的是 bridge 模式稚疹。
啟動 docker 時(shí),docker 進(jìn)程會創(chuàng)建一個(gè)名為 docker0 的虛擬網(wǎng)橋祭务,用于宿主機(jī)與容器之間的通信内狗。當(dāng)啟動一個(gè) docker 容器時(shí),docker 容器將會附加到虛擬網(wǎng)橋上义锥,容器內(nèi)的報(bào)文通過 docker0 向外轉(zhuǎn)發(fā)柳沙。

如果 docker 容器訪問宿主機(jī),那么 docker0 網(wǎng)橋?qū)?bào)文直接轉(zhuǎn)發(fā)到本機(jī)拌倍,報(bào)文的源地址是 docker0 網(wǎng)段的地址赂鲤。而如果 docker 容器訪問宿主機(jī)以外的機(jī)器,docker 的 SNAT 網(wǎng)橋會將報(bào)文的源地址轉(zhuǎn)換為宿主機(jī)的地址柱恤,通過宿主機(jī)的網(wǎng)卡向外發(fā)送数初。

因此,當(dāng) docker 容器訪問宿主機(jī)時(shí)梗顺,如果宿主機(jī)服務(wù)端口會被防火墻攔截泡孩,那么就無法連通宿主機(jī),出現(xiàn) No route to host 的錯(cuò)誤寺谤。

而訪問宿主機(jī)所在局域網(wǎng)內(nèi)的其他機(jī)器仑鸥,由于報(bào)文的源地址是宿主機(jī) ip,因此矗漾,不會被目的機(jī)器防火墻攔截锈候,所以可以訪問。

解決問題

首先設(shè)置了 mysql 的配置文件敞贡,保證 mysql 可以被任何 ip 訪問:

[mysqld]
bind-address = 0.0.0.0

修改完配置文件重啟生效泵琳。
但為了安全考慮,防火墻的 3306 端口仍然是不開放外網(wǎng)訪問的。

容器訪問宿主機(jī)的地址使用 eth0 的地址获列,即宿主機(jī)內(nèi)網(wǎng) ip 地址谷市。
運(yùn)行 ipconfig 命令,查看網(wǎng)絡(luò)的虛擬網(wǎng)橋相關(guān)信息击孩。

注意:宿主機(jī)會把容器 ip 地址段當(dāng)成外網(wǎng) ip迫悠。(當(dāng)前說明是 centos7 環(huán)境)

編輯防火墻文件 /etc/firewalld/zones/public.xml,添加下面 docker0 地址段到配置:

<rule family="ipv4">
  <source address="172.18.0.0/16"/>
  <accept/>
</rule>

重啟防火墻巩梢,docker 容器即可正常訪問宿主機(jī)端口创泄。
service firewalld restart
如果有用到 docker-compose 命令,則會自動創(chuàng)建一個(gè)名為 br-"docker network id" 的虛擬網(wǎng)橋括蝠。
此時(shí)同樣需要將虛擬網(wǎng)橋地址段配置到防火墻白名單鞠抑,才能正常訪問,添加配置:

<rule family="ipv4">
  <source address="172.20.0.0/16"/>
  <accept/>
</rule>

使用ifconfig查看宿主機(jī)的網(wǎng)絡(luò)

image.png

使用命令docker network ls可以查看到容器所使用的網(wǎng)絡(luò)忌警,如下
network.png

訪問宿主機(jī)

看上面的網(wǎng)絡(luò)配置docker0對應(yīng)的地址是172.17.0.1
方案一:直接使用172.17.0.1作用數(shù)據(jù)庫連接地址
方案二:docker 18.03 加入了一個(gè) feature搁拙,在容器中可以通過 host.docker.internal來訪問主機(jī) 。

Use your internal IP address or connect to the special DNS name host.docker.internal which will resolve to the internal IP address used by the host.

在 windows 下我們可以使用方案二法绵,并在 host 文件中配置
127.0.0.1 host.docker.internal

端口測試

在容器中測試宿主機(jī)端口是否可以連接箕速,可以使用 wget 內(nèi)網(wǎng)ip:端口 命令。

$ wget 172.17.25.162:3306  
wget: can not connect to remote host (172.17.25.162): Host is unreachable  #不可以連接

$ wget 172.17.25.162:3306
wget: bad header line: 5.7.29-log  #可以連接

部署方式

docker部署有很多種方式朋譬,如docker run直接運(yùn)行盐茎,也可用docker-compose編排,還可以打成image上傳云服務(wù)等此熬,這里討論的不是單個(gè)服務(wù)庭呜,而是多個(gè)服務(wù)。

最簡單的網(wǎng)絡(luò)部署方式是使用host模式犀忱,這相當(dāng)于把docker容器當(dāng)暴露在宿主機(jī)了募谎。

若使用docker-compose單個(gè)服務(wù)運(yùn)行,就會上面的網(wǎng)絡(luò)配置圖中顯示多個(gè)br-xxx容器網(wǎng)絡(luò)阴汇,每個(gè)單獨(dú)的容器擁有自己的一個(gè)網(wǎng)絡(luò)数冬,這樣服務(wù)間的訪問需要明確指定宿主機(jī)IP;另一種方式是讓所有的容器使用同一個(gè)網(wǎng)絡(luò)搀庶,這樣所有容器都是一個(gè)內(nèi)網(wǎng)拐纱,它們可以使用容器名訪問。

首先哥倔,需要創(chuàng)建一個(gè)網(wǎng)絡(luò)秸架,如下:

#  創(chuàng)建網(wǎng)絡(luò)
docker network create <Network Name>局域網(wǎng)名字

# 查看已存在的網(wǎng)絡(luò)
docker network list

在需要加入同一局域網(wǎng)的容器 .yml或yaml文件中添加下面的代碼:

networks:
  default:
    external:
      name:  局域網(wǎng)名字

以下是部署一個(gè)實(shí)際的應(yīng)用例子,例子中對內(nèi)網(wǎng)mq,redis容器訪問使用的是容器名container_name咆蒿,對宿主機(jī)mysql的訪問使用的是docker0對應(yīng)的IP东抹。

version: '3'
services:
  producer:
    hostname: yw-producer
    container_name: yw-producer
    image: yw-producer:1.0
    ports:
      - 8766:8766
      - 8799:8799
    restart: always
    environment:
      - PORT=8766
      - HTTP_PORT=8799
      - REDIS_PORT=6379
      - REDIS_HOST=myredis
      - MQ_URL=tcp://myactivemq:61616
      - MAIN_DATASOURCE=jdbc:mysql://172.17.0.1:3306/xxx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
    volumes:
      - ./logs:/app/logs
networks:
  default:
    external:
      name: yw-network

firewall配置

當(dāng)執(zhí)行docker時(shí)報(bào)以下錯(cuò)誤:

[root@docker ~]# docker run -itd --name wordpress -p 88:80 wordpress:v1
b77482f8075042e9cc6723d6922a1211c37d99339678a00cc040396b23d40ef0
docker: Error response from daemon: driver failed programming external connectivity on endpoint wordpress (77cb6b1ea5387ac97b1b90178b2ccda831aa9713e0e9a83be057083fed66fc69):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 88 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

說明可能是因?yàn)殚_啟或關(guān)閉防火墻導(dǎo)致docker出問題蚂子。
解決:systemctl restart docker

開啟防火墻是很有必要的,以下是一些常用操作:

firewall-cmd --state  查看狀態(tài)
## 開啟端口
## zone -- 作用域
## add-port=80/tcp -- 添加端口缭黔,格式為:端口/通訊協(xié)議
## permanent -- 永久生效食茎,沒有此參數(shù)重啟后失效
firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新加載:firewall-cmd --reload
firewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=40000-42000/tcp --permanent
查看:firewall-cmd --zone=public --list-ports
啟動: systemctl start firewalld
查看狀態(tài): systemctl status firewalld 
禁用,禁止開機(jī)啟動: systemctl disable firewalld
停止運(yùn)行: systemctl stop firewalld
重啟:systemctl restart firewalld
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馏谨,一起剝皮案震驚了整個(gè)濱河市别渔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惧互,老刑警劉巖哎媚,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壹哺,居然都是意外死亡抄伍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門管宵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攀甚,你說我怎么就攤上這事箩朴。” “怎么了秋度?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵炸庞,是天一觀的道長。 經(jīng)常有香客問我荚斯,道長埠居,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任事期,我火速辦了婚禮滥壕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兽泣。我一直安慰自己绎橘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布唠倦。 她就那樣靜靜地躺著称鳞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稠鼻。 梳的紋絲不亂的頭發(fā)上冈止,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音候齿,去河邊找鬼熙暴。 笑死闺属,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怨咪。 我是一名探鬼主播屋剑,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诗眨!你這毒婦竟也來了唉匾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匠楚,失蹤者是張志新(化名)和其女友劉穎巍膘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芋簿,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峡懈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了与斤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肪康。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撩穿,靈堂內(nèi)的尸體忽然破棺而出磷支,到底是詐尸還是另有隱情,我是刑警寧澤食寡,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布雾狈,位于F島的核電站,受9級特大地震影響抵皱,放射性物質(zhì)發(fā)生泄漏善榛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一呻畸、第九天 我趴在偏房一處隱蔽的房頂上張望移盆。 院中可真熱鬧,春花似錦擂错、人聲如沸味滞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剑鞍。三九已至,卻和暖如春爽醋,著一層夾襖步出監(jiān)牢的瞬間蚁署,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工蚂四, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留光戈,地道東北人哪痰。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像久妆,于是被迫代替她去往敵國和親晌杰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355