一罢低、網(wǎng)絡(luò)
docker提供幾種網(wǎng)絡(luò)璃饱,它決定容器之間和外界和容器之間怎么樣去相互通信。查看網(wǎng)絡(luò)苍柏,我們可以執(zhí)行:
docker network ls
-
null
是無(wú)網(wǎng)絡(luò)尼斧,使用這種網(wǎng)絡(luò)的容器會(huì)完全隔離。 -
host
是主機(jī)網(wǎng)絡(luò)试吁,只用這種網(wǎng)絡(luò)的容器會(huì)使用主機(jī)的網(wǎng)絡(luò)棺棵,這種網(wǎng)絡(luò)對(duì)外界是完全開放的,能夠訪問到主機(jī)熄捍,就能訪問到容器烛恤。 -
bridge
是橋接網(wǎng)絡(luò),除非創(chuàng)建容器的時(shí)候指定網(wǎng)絡(luò)余耽,不然容器就會(huì)默認(rèn)的使用橋接網(wǎng)絡(luò)缚柏。屬于這個(gè)網(wǎng)絡(luò)的容器之間可以相互通信,不過(guò)外界想要訪問到這個(gè)網(wǎng)絡(luò)的容器呢碟贾,需使用橋接網(wǎng)絡(luò)币喧,有點(diǎn)像主機(jī)和容器之間的一座橋轨域,對(duì)容器有一點(diǎn)隔離作用。
bridge網(wǎng)絡(luò)
查看bridge網(wǎng)絡(luò)的信息杀餐,可以使用:
docker network inspect bridge
這里會(huì)列出bridge網(wǎng)絡(luò)的相關(guān)信息干发,Containers
表示使用了這網(wǎng)絡(luò)的容器,現(xiàn)在還沒有×常現(xiàn)在去創(chuàng)建一個(gè):
docker run -d --name web1 --net bridge nginx
使用nginx的鏡像創(chuàng)建一個(gè)名叫web1的容器铐然,同時(shí)使用--net
的選項(xiàng)指定使用的網(wǎng)絡(luò),如果不指定恶座,默認(rèn)也是bridge網(wǎng)絡(luò)搀暑。再查看下bridge網(wǎng)絡(luò)的信息:
會(huì)看到在Container里面有個(gè)容器,就是剛剛創(chuàng)建的web1容器跨琳。也可以看到這個(gè)容器在這個(gè)網(wǎng)絡(luò)下的IP地址:172.17.0.2自点。
我們?cè)賱?chuàng)建一個(gè)容器叫web2,查看bridge網(wǎng)絡(luò)信息脉让,可知web2的網(wǎng)絡(luò)IP為172.17.0.3桂敛。接著登錄web1容器,ping web2容器的IP:
可以看到處在bridge網(wǎng)絡(luò)下的容器之間可以相互通信溅潜。
none網(wǎng)絡(luò)
可以先創(chuàng)建容器术唬,使用--net
指定none網(wǎng)絡(luò):
docker run -d --name web_none --net none nginx
然后查看none網(wǎng)絡(luò)的相關(guān)信息:
docker network inspect none
在Container里有剛剛創(chuàng)建的網(wǎng)絡(luò)web_none,然后發(fā)現(xiàn)這個(gè)容器并沒有可以使用的IP地址滚澜,所以這個(gè)網(wǎng)絡(luò)無(wú)法跟外界通信粗仓。
登錄容器,查看ip地址:
沒有IP地址设捐,只有l(wèi)o的網(wǎng)絡(luò)借浊。
host網(wǎng)絡(luò)
使用nginx創(chuàng)建一個(gè)屬于host網(wǎng)絡(luò),并后臺(tái)運(yùn)行萝招,然后查看host網(wǎng)絡(luò)信息:
看到host網(wǎng)絡(luò)下有剛剛創(chuàng)建的容器蚂斤,但這個(gè)容器同樣沒有IP地址。因?yàn)樗褂玫氖侵鳈C(jī)的IP地址槐沼。
二曙蒸、端口
如果你想讓外界可以訪問到,基于bridge網(wǎng)絡(luò)創(chuàng)建的容器提供的服務(wù)母赵,那你可以告訴Docker你要使用哪些接口逸爵。如果想查看鏡像會(huì)使用哪些端口,可以使用:
docker inspect nginx
ExposedPorts凹嘲,會(huì)告訴你這個(gè)鏡像使用哪些端口师倔。nginx使用了443和80,443是https使用的端口,80是http使用的端口趋艘。
端口綁定
在創(chuàng)建容器的時(shí)候可以指定這個(gè)容器的端口與主機(jī)端口的映射關(guān)系疲恢。
docker run -d --name web3 -p 8888:80 nginx
說(shuō)明:
-
-p
或者--publish
可以指定主機(jī)與容器的端口關(guān)系,冒號(hào)左邊是主機(jī)的端口瓷胧,冒號(hào)右邊是映射到容器中得端口显拳。
創(chuàng)建完容器后,訪問本機(jī)的8888端口搓萧,可以訪問到容器的80端口杂数。
想要查看容器的端口情況,可以使用:
docker port web3
如果在創(chuàng)建容器的時(shí)候瘸洛,-p
參數(shù)后只有一個(gè)指定端口揍移,意思就是主機(jī)會(huì)隨機(jī)一個(gè)端口,映射到容器的的該指定端口:
docker run -d --name web3 -p 80 nginx
訪問隨機(jī)分配的端口:32768
接著刪掉web3容器反肋,使用--publish-all
或者-P
來(lái)創(chuàng)建容器:
Docker會(huì)為我們分配所有鏡像中會(huì)使用的端口的映射端口那伐,nginx使用443和80,使用了-P
選項(xiàng)創(chuàng)建容器時(shí)石蔗,則幫我們做了443->32769 80->32770的映射關(guān)系罕邀。
三、自定義網(wǎng)絡(luò)
我們可以基于某一個(gè)類型的網(wǎng)絡(luò)去創(chuàng)建一些自定義的網(wǎng)絡(luò)养距,這樣屬于這個(gè)網(wǎng)絡(luò)的容器就可以單獨(dú)隔離出來(lái)诉探,他們之間可以相互通信,而不在這個(gè)網(wǎng)絡(luò)的容器棍厌,就不能直接訪問到他們阵具。一個(gè)容器可以屬于多個(gè)網(wǎng)絡(luò),同一個(gè)自定義網(wǎng)絡(luò)下的容器定铜,可以通過(guò)各自的容器名訪問到對(duì)方,因?yàn)闀?huì)使用到Docker內(nèi)嵌的一個(gè)dns功能怕敬。
創(chuàng)建一個(gè)新的網(wǎng)絡(luò)揣炕,可以使用:
docker network create --driver bridge web
--driver
是指定網(wǎng)絡(luò)的類型,后面的是該網(wǎng)絡(luò)的類型东跪。
查看網(wǎng)絡(luò)類型列表可以查看到新創(chuàng)建的web網(wǎng)絡(luò)畸陡。查看web網(wǎng)絡(luò)的相關(guān)信息,Subnet表示這個(gè)網(wǎng)絡(luò)下的子網(wǎng)IP端虽填,那么基于web自定義網(wǎng)絡(luò)下創(chuàng)建的容器ip都會(huì)是172.18開頭丁恭。目前這個(gè)自定義網(wǎng)絡(luò)下還有沒有容器,所以Container為空斋日。
基于web網(wǎng)絡(luò)去創(chuàng)建容器:
docker run -d --name web5 --net web nginx
如果想將已創(chuàng)建的容器web3放到自定義網(wǎng)絡(luò)web中牲览,可以使用:
docker network connect web web3
登錄web3網(wǎng)絡(luò),執(zhí)行ip addr恶守,會(huì)看到web3正處于兩個(gè)網(wǎng)絡(luò)當(dāng)中第献,bridge和web贡必。
如果想將web3從bridge網(wǎng)絡(luò)中移出,可以執(zhí)行:
docker network disconnect bridge web3
可以看到庸毫,bridge網(wǎng)絡(luò)中仔拟,已經(jīng)沒有了web3容器。