Docker網(wǎng)絡(luò)
我們來(lái)探討一個(gè)docker的network的問(wèn)題。小伙伴們請(qǐng)看如下命令:
docker run -d -p8080:8080 鏡像ID
-p8080:8080這個(gè)命令的意思就是將容器的8080端口映射到宿主機(jī)的8080端口,這個(gè)是我們手動(dòng)指定的網(wǎng)絡(luò)端口映射
場(chǎng)景
假如目前我們有很多的容器實(shí)例,微服務(wù)群,各個(gè)服務(wù)之間都有相互調(diào)用、訪問(wèn),實(shí)現(xiàn)容器互聯(lián)。那么我們需要做什么?
新建docker網(wǎng)絡(luò)
我們需要?jiǎng)?chuàng)建一個(gè)網(wǎng)絡(luò)環(huán)境,讓需要相互訪問(wèn)的服務(wù)容器實(shí)例都加入到這個(gè)網(wǎng)絡(luò)環(huán)境中,這樣就可以實(shí)現(xiàn),相互訪問(wèn)調(diào)用。
執(zhí)行如下命令(創(chuàng)建一個(gè)docker網(wǎng)絡(luò)環(huán)境):
# 創(chuàng)建docker網(wǎng)絡(luò),網(wǎng)絡(luò)模式設(shè)置為bridge 網(wǎng)絡(luò)名稱為my-network
docker network create -d bridge my-network
docker網(wǎng)絡(luò)模式說(shuō)明:
none模式:docker容器擁有自己的network namespace,但是不創(chuàng)建任何網(wǎng)絡(luò)設(shè)備,僅有l(wèi)o網(wǎng)絡(luò),即為封閉式容器。使用--network none指定
bridge模式:docker安裝后會(huì)默認(rèn)啟用的網(wǎng)絡(luò),并創(chuàng)建docker0網(wǎng)橋作為網(wǎng)關(guān),使用此網(wǎng)絡(luò)創(chuàng)建的容器會(huì)生成一對(duì)以veth開頭的虛擬網(wǎng)卡,一半在容器中,一半在docker0橋上,此方式實(shí)現(xiàn)了容器與宿主機(jī)間的通信。docker0橋是NAT橋,因此容器獲得的是私有網(wǎng)絡(luò)地址,可將容器想象為主機(jī)NAT服務(wù)背后的主機(jī),如果開發(fā)容器或其上的服務(wù)為外部網(wǎng)絡(luò)訪問(wèn),需要在宿主機(jī)上為其定義DNAT規(guī)則.使用--network bridge指定
host模式:共享宿主機(jī)的網(wǎng)絡(luò)名稱空間,容器不會(huì)虛擬自己的網(wǎng)卡設(shè)備及ip地址,而直接使用宿主機(jī)的ip地址與外部進(jìn)行通信,且不需要任何NAT轉(zhuǎn)換。使用--network host指定
查看docker網(wǎng)絡(luò)
可以看到,除了docker安裝時(shí)創(chuàng)建的三個(gè)網(wǎng)絡(luò),還有一個(gè)新的網(wǎng)絡(luò),就是我們剛那個(gè)創(chuàng)建的那個(gè)網(wǎng)絡(luò)。
加入網(wǎng)絡(luò)
我們來(lái)啟動(dòng)倆個(gè)容器,并且,將倆個(gè)容器加入到my-network網(wǎng)絡(luò)環(huán)境中。
# 啟動(dòng)第一個(gè)容器
docker run -itd --name docker01 --network my-network springboot-docker/springboot-docker:1.0 /bin/bash
# 啟動(dòng)第二個(gè)容器docker run -itd --name docker02 --network my-network springboot-docker/springboot-docker:1.0 /bin/bash
下圖可知,執(zhí)行docker ps,可以看到現(xiàn)在倆個(gè)容器已經(jīng)運(yùn)行起來(lái)了
驗(yàn)證網(wǎng)絡(luò)
我們分別進(jìn)入到倆個(gè)容器中,ping對(duì)方,驗(yàn)證是否網(wǎng)絡(luò)暢通
# 進(jìn)入到容器 docker01
docker exec -it docker01 /bin/bash
這樣就進(jìn)入到了docker01容器中,執(zhí)行命令ping docker02,可以看到網(wǎng)絡(luò)是通的。
同理,進(jìn)入到第二個(gè)容器中,用同樣的命令測(cè)試。在這里有的小伙伴可能會(huì)遇到一個(gè)問(wèn)題,在執(zhí)行ping docker01的時(shí)候報(bào)錯(cuò),告訴你沒(méi)有這個(gè)命令,這時(shí)需要我們自己下載ping命令,執(zhí)行如下兩條命令即可:
# 更新
apt-get update
# 安裝
apt install iputils-ping
小結(jié)
好了,小伙伴們,我們簡(jiǎn)單的了解了docker的網(wǎng)絡(luò),現(xiàn)實(shí)的情況如果我們有成千上萬(wàn)個(gè)容器需要相互連通,這樣的手動(dòng)配置肯定是不行的,所以我們會(huì)用到docker-compose技術(shù)來(lái)進(jìn)行服務(wù)的編配,后續(xù),會(huì)和小伙伴們來(lái)討論docker-compose怎么實(shí)現(xiàn)服務(wù)的編排。






