需求:后臺(tái)服務(wù)因?yàn)闃I(yè)務(wù)或需求的原因处渣,多少會(huì)用到數(shù)據(jù)層如: mysql 或緩存層如: redis。而為了安全起見,又不想將底層數(shù)據(jù)服務(wù)暴露在主機(jī)上或公網(wǎng)上,docker 的 --link 恰好提供了這樣的服務(wù)
1漫蛔、docker 容器的網(wǎng)絡(luò)模式
- 容器默認(rèn)有三種網(wǎng)絡(luò)模式
- host: 容器在 run 的時(shí)候,指定 --net=host, 則該容器使用的網(wǎng)絡(luò)配置和宿主機(jī)是一樣的旧蛾,包括相同的 ip 以及共享端口莽龟,如果主機(jī)有公網(wǎng)可以訪問,則該容器同樣可以在公網(wǎng)訪問锨天。
- bridge: 容器在 run 的時(shí)候毯盈,默認(rèn)的網(wǎng)絡(luò)配置,如果不指定 --net 參數(shù)病袄,則相當(dāng)于 --net=bridge搂赋,該容器使用 docker 默認(rèn)的網(wǎng)絡(luò)配置幽钢,相比宿主機(jī)會(huì)有獨(dú)立的 ip 和 port 使用样眠,但是此時(shí),該容器只會(huì)在內(nèi)網(wǎng)通過 ip 和 port 訪問雅镊,在公網(wǎng)是無法訪問左刽。
- none: 容器沒有配置網(wǎng)絡(luò),容器外無法訪問酌媒,需要進(jìn)行網(wǎng)絡(luò)配置欠痴。
- container:app: 容器使用 app 容器的網(wǎng)絡(luò)配置迄靠,和 app 使用相同的 ip 以及共享端口。
2喇辽、docker 的 link
- docker run 的時(shí)候支持 --link db:aliasdb掌挚,通過 --link 連接名為 db 的容器,并將其別名設(shè)置為 aliasdb菩咨,此時(shí)即可以在新容器中使用 aliasdb 作為 db 容器的 ip吠式,對(duì) db 容器進(jìn)行訪問。
3抽米、常用通訊方式
- 需求:
- 程序 appC特占,需要連接數(shù)據(jù)庫 mysqlC 和 redisC 容器
- 方式1、通過 --link
- ① 啟動(dòng) mysql
docker run -d --name=mysqlC mysql:latest
注釋:后臺(tái)創(chuàng)建一個(gè) name 是 mysqlC 的容器云茸,這里的 --net 使用的是默認(rèn)模式是目,即 bridge”贽啵可以通過 docker inspect mysqlC 查看該容器的 ip懊纳,在宿主機(jī)上可以通過 ip 訪問該服務(wù)。 - ② 啟動(dòng) redis
docker run -d --name=redisC redis:latest
注釋:同 mysqlC - ③ 啟動(dòng) app
docker run -d --name=appC -p 8080:8080 --link=mysqlC:mysql --link=redisC:redis app:latest
注釋:后臺(tái)創(chuàng)建一個(gè) name 是 appC 的容器亡容,這里也是使用 bridge 網(wǎng)絡(luò)配置嗤疯。bridge 的詳情可以通過 docker network inspect bridge 查看。特別注意的是闺兢,此處使用 -p 將 appC 程序的啟動(dòng)端口 8080 映射到了宿主機(jī)的 8080茂缚,也即是宿主機(jī)監(jiān)聽 8080 端口,并將收到的連接或請(qǐng)求報(bào)文進(jìn)行轉(zhuǎn)發(fā)列敲,這樣的話通過宿主機(jī)的 8080 端口也可以訪問到 appC 的 8080 端口阱佛,同時(shí)如果宿主機(jī)有公網(wǎng)可以訪問,那么 appC 容器的 8080 端口也可以被公網(wǎng)通過宿主機(jī)的 8080 端口進(jìn)行間接訪問戴而。
使用 --link=mysqlC:mysql 時(shí)凑术,docker 會(huì)把容器 appC 對(duì) mysql 域名的訪問指向到 mysqlC 容器的 ip,最終相當(dāng)于更改了 appC 容器的 /etc/hosts 配置文件,實(shí)現(xiàn)了容器內(nèi)通訊所意。 - ④ app 中配置
app 中設(shè)置連接 mysql 的 host=mysql淮逊,redis 的 host=redis 端口為相應(yīng)的配置端口即可進(jìn)行訪問
- ① 啟動(dòng) mysql
- 方式2、通過 --net=container:app
- ① 啟動(dòng) app
docker run -d --name=appC -p 8080:8080 app:latest
- ② 啟動(dòng) redis
docker run -d --name=redisC --net=container:appC redis:latest
- ③ 啟動(dòng) mysql
docker run -d --name=mysqlC --net=container:appC mysql:latest
- ④ app 中配置
app 中設(shè)置連接 mysql 和 redis 的 host=127.0.0.1扶踊,端口為響應(yīng)配置的端口即可訪問
- ① 啟動(dòng) app
- 方式3泄鹏、通過 --publish
- 此處不再詳述,方案是將 mysqlC 和 redisC 容器都通過 -p 將服務(wù)的端口映射到宿主機(jī)上的端口秧耗。此處容器間的通訊安全性比較差备籽,而且公網(wǎng)也可以訪問,不推薦。
- 方式4车猬、通過 --net=host
- 此方法相當(dāng)于所有的服務(wù)均使用宿主局的 ip 和 共享端口霉猛,安全性較差。不推薦珠闰。
- 建議使用第一種惜浅,因?yàn)橛行?yīng)用在項(xiàng)目啟動(dòng)時(shí)就會(huì)讀取 mysql 中數(shù)據(jù)做緩存,所以 mysql 可能需要優(yōu)先配置