Docker小白到实战之Docker网络简单了解一下
前言
現(xiàn)在對(duì)于Docker容器的隔離性都有所了解了,但對(duì)容器IP地址的分配、容器間的訪問(wèn)等還是有點(diǎn)小疑問(wèn),如果容器的IP由于新啟動(dòng)導(dǎo)致變動(dòng),那又怎么才能保證原有業(yè)務(wù)不會(huì)被影響,這就和網(wǎng)絡(luò)有掛鉤了,接下來(lái)就大概說(shuō)說(shuō)。
正文
1. Docker網(wǎng)絡(luò)模式簡(jiǎn)介
當(dāng)Docker進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器默認(rèn)會(huì)連接到這個(gè)虛擬網(wǎng)橋上。這樣所有容器通過(guò)這個(gè)虛擬網(wǎng)橋就打通了,所以這里的docker0工作方式和物理交換機(jī)很像。
在主機(jī)上可以執(zhí)行命令ip link show docker0查看:
Docker在啟動(dòng)容器時(shí)可以指定網(wǎng)絡(luò)模式,如果不指定,默認(rèn)就是采用Bridge模式;Docker的網(wǎng)絡(luò)模式有如下幾種:
Bridge(橋接)模式:默認(rèn)的網(wǎng)絡(luò)模式,比較適用于在同一Docker Daemon主機(jī)上運(yùn)行的容器,用戶也可以自定義bridge網(wǎng)絡(luò),優(yōu)于默認(rèn)的bridge網(wǎng)絡(luò);如果需要不同Docker主機(jī)進(jìn)行通信,可以通過(guò)操作系統(tǒng)網(wǎng)絡(luò)配置,也可以使用Overlay模式。
Host模式:和宿主機(jī)共用一個(gè)Network Namespace。即容器不會(huì)虛擬出自己的網(wǎng)卡和配置自己的IP等,而是使用宿主機(jī)的IP和端口;
Overlay模式:覆蓋網(wǎng)絡(luò)可以將多個(gè) Docker Daemon主機(jī)連接在一起,并使 swarm 服務(wù)能夠相互通信;也可以讓Docker Daemon主機(jī)上的兩個(gè)獨(dú)立容器進(jìn)行通信。
Macvlan模式:Macvlan 網(wǎng)絡(luò)允許為容器分配 MAC 地址,使其在網(wǎng)絡(luò)上顯示為物理設(shè)備。Docker Deamon通過(guò)容器的 MAC 地址將流量路由到容器。
None模式:Docker容器擁有自己的Network Namespace,但是并不為容器進(jìn)行任何網(wǎng)絡(luò)配置。即容器沒(méi)有網(wǎng)卡、IP、路由等信息。需要單獨(dú)為Docker容器添加網(wǎng)卡、配置IP;
Docker在啟動(dòng)容器的時(shí)候可以通過(guò)--net指定網(wǎng)絡(luò)模式,不指定,默認(rèn)就是bridge模式,如下:
#?--net指定網(wǎng)絡(luò)模式,這里指定為host模式 docker?run?-d?--name?testnet?--net?host?nginx #?通過(guò)docker?inspect?容器?看網(wǎng)絡(luò)細(xì)節(jié),如下圖 docker?inspect?testnet2. Bridge默認(rèn)模式了解一下
這里就以默認(rèn)的Bridge(橋接)展開(kāi)來(lái)說(shuō)說(shuō),其他模式后續(xù)根據(jù)應(yīng)用場(chǎng)景再具體細(xì)說(shuō)。
這里主要看看主機(jī)和容器之間的網(wǎng)絡(luò)、容器和容器之間的網(wǎng)絡(luò)。
在Bridge模式下,當(dāng)啟動(dòng)容器時(shí),Docker會(huì)分配一個(gè)IP給容器,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān);這個(gè)時(shí)候會(huì)在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備接口,Docker將veth pair設(shè)備的一端配置在新啟動(dòng)的容器中,并命名為eth0@ifxxx(容器的網(wǎng)卡),另一端在主機(jī)中以veth***@ifxxx這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。
容器沒(méi)有啟動(dòng)時(shí)主機(jī)的網(wǎng)絡(luò)配置如下:
當(dāng)啟動(dòng)容器時(shí),Docker主機(jī)就會(huì)創(chuàng)建一對(duì)虛擬網(wǎng)卡vethpair設(shè)備接口,如下:
可以進(jìn)入到容器看看IP分配情況,如果ip addr命令在容器內(nèi)找不到,那是因?yàn)榛A(chǔ)鏡像只包含核心命令,如果要執(zhí)行其他命令,需要額外安裝。可以在容器內(nèi)執(zhí)行如下命令進(jìn)行安裝。
apt?update?&&?apt?install?-y?iproute2安裝好之后,就可以查看容器內(nèi)的IP情況了,如下:
這里有沒(méi)有發(fā)現(xiàn)容器內(nèi)的IP是和主機(jī)多出來(lái)的虛擬網(wǎng)卡是成對(duì)出現(xiàn),這樣主機(jī)網(wǎng)絡(luò)和容器之間肯定能通;
當(dāng)然容器內(nèi)部也可以ping通主機(jī)。
那容器之間能不能訪問(wèn)呢?
容器內(nèi)ping命令也找不到,需要進(jìn)行安裝,執(zhí)行如下命令:
apt?update?&&?install?iputils-ping這里新啟動(dòng)一個(gè)容器mynginx2,IP內(nèi)部分配如下:
mynginx容器內(nèi)能ping通mynginx2,那是因?yàn)閮蓚€(gè)容器之間共用了docker0,通過(guò)docker0進(jìn)行轉(zhuǎn)發(fā)。
大概一個(gè)網(wǎng)絡(luò)流程如下:
這里的Docker0就好比是交換機(jī),形成了網(wǎng)絡(luò)橋梁。
3. 如何能通過(guò)容器名進(jìn)行訪問(wèn)
默認(rèn)情況,容器間的訪問(wèn)只能通過(guò)IP,不能通過(guò)容器名訪問(wèn);
這種情況對(duì)于線上項(xiàng)目很不靈活,比如數(shù)據(jù)庫(kù)備份需要臨時(shí)遷移,IP可能會(huì)不一樣,所以項(xiàng)目中的地址要重新配置,如果能通過(guò)容器名訪問(wèn),那么就不用操心更換啦,只要容器名一樣即可,就好比域名和IP的關(guān)系一樣,IP再怎么變,域名不變就行。
3.1 通過(guò)--link方式;
新啟動(dòng)一個(gè)容器mynginx3,如下:
#?通過(guò)--link關(guān)聯(lián)?mynginx容器 docker?run?-d?--name?mynginx3?--link?mynginx?nginx容器啟動(dòng)之后,可以進(jìn)入到容器測(cè)試:
#?進(jìn)入容器 docker?exec?-it?mynginx3?/bin/bash? #?安裝ping工具 apt?update?&&?apt?install?iputils-ping內(nèi)部原理其實(shí)是在mynginx3內(nèi)部做了個(gè)映射配置,容器mynginx3的hosts內(nèi)容如下:
這樣只能在容器mynginx3內(nèi)部通過(guò)mynginx容器名ping通,不能在mynginx內(nèi)部通過(guò)容器名mynginx3訪問(wèn),如果要達(dá)到同樣的效果,就得在啟動(dòng)mynginx時(shí)通過(guò)--link和mynginx3關(guān)聯(lián)起來(lái)。
如果每個(gè)容器都這樣的顯示指定的話,感覺(jué)就有點(diǎn)麻煩啦,通常的做法都是通過(guò)自定義網(wǎng)絡(luò)方式來(lái)達(dá)到這個(gè)目的。
3.2 通過(guò)自定義網(wǎng)絡(luò)方式;
首先新創(chuàng)建一個(gè)網(wǎng)絡(luò),如下:
命令解析:
#?--driver?指定網(wǎng)絡(luò)模式,這里為bridge橋接模式 #?--subnet?指定子網(wǎng)IP??192.168.0.0/16 #?--gateway?指定網(wǎng)關(guān)?192.168.0.1 #?my-net?創(chuàng)建的網(wǎng)絡(luò)名 docker?network?create?--driver?bridge?--subnet?192.168.0.0/16?--gateway?192.168.0.1?my-net #?顯示網(wǎng)絡(luò) docker?network?ls讓啟動(dòng)的容器使用自定義的網(wǎng)絡(luò),即在啟動(dòng)容器時(shí)使用--net指定即可:
啟動(dòng)容器時(shí)不需要--link,只需要接入到自定義網(wǎng)絡(luò)就可以通過(guò)容器名ping通了,如下:
自定義網(wǎng)絡(luò)之所以能通過(guò)容器名ping通,那是容器內(nèi)運(yùn)行了一個(gè)本地DNS解析器,該解析器將請(qǐng)求轉(zhuǎn)發(fā)到Docker內(nèi)部DNS服務(wù)器當(dāng)中,DNS服務(wù)器中記錄了容器啟動(dòng)時(shí)通過(guò)--name或--net-alias參數(shù)指定的名稱與容器之間的關(guān)系。
另外還有一個(gè)點(diǎn),現(xiàn)在分配給容器的IP是按照預(yù)先設(shè)置的子網(wǎng)范圍進(jìn)行分配的,而不是默認(rèn)的docker0子網(wǎng)范圍,執(zhí)行如下命令看詳細(xì):
#?看容器詳細(xì)信息 docker?inspect?testmynetnginx1總結(jié)
關(guān)于Docker網(wǎng)絡(luò)簡(jiǎn)單先說(shuō)這么多,后續(xù)根據(jù)實(shí)際應(yīng)用場(chǎng)景再好好細(xì)說(shuō),這里主要的目的是了解一下默認(rèn)的網(wǎng)絡(luò)模式和自定義網(wǎng)絡(luò)方式的使用和解決的問(wèn)題。
Docker之前文章目錄:
Docker小白到實(shí)戰(zhàn)之開(kāi)篇概述
Docker小白到實(shí)戰(zhàn)之常用命令演示,通俗易懂
Docker小白到實(shí)戰(zhàn)之容器數(shù)據(jù)卷,整理的明明白白
Docker小白到實(shí)戰(zhàn)之Dockerfile解析及實(shí)戰(zhàn)演示,果然順手
到目前為止,一般的Docker使用沒(méi)問(wèn)題了,但當(dāng)容器比較多時(shí),一個(gè)一個(gè)的拉取鏡像和啟動(dòng)容器就顯得有點(diǎn)不方便了,所以下次我們來(lái)學(xué)學(xué)Docker Compose,關(guān)注“Code綜藝圈”,和我一起學(xué)習(xí)吧;最后祝小伙伴們中秋快樂(lè)~~~
總結(jié)
以上是生活随笔為你收集整理的Docker小白到实战之Docker网络简单了解一下的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WPF 实现火炬效果
- 下一篇: Web使用热敏打印小票(IE环境)