1班缰、查看docker網(wǎng)絡(luò)
docker network ls
2匈睁、查看bridge網(wǎng)絡(luò)的詳細(xì)信息
docker network inspect
看到當(dāng)前虛機(jī)有三個(gè)容器蹬碧,每個(gè)容器都有自己的網(wǎng)段以及ip地址
3皇筛、在虛擬機(jī)中運(yùn)行ip a命令查看所有網(wǎng)絡(luò)接口信息
ip a
其中docker0屬于本機(jī),要和容器進(jìn)行通信社痛,就需要本地和容器有一對(duì) veth接口對(duì)见转。
4、查看容器接口對(duì)以及ip信息
docker exec 3cea9f8e0a2d ip a
可以看出該容器和本地的57號(hào)接口 同屬于一個(gè)接口對(duì)蒜哀。正式由于這一對(duì)接口的存在才保證了docker容器和本地進(jìn)行通信斩箫。
也就是說:docker容器連接到docker0,然后通過docker0訪問其他容器以及外網(wǎng)撵儿。
5乘客、通過命令檢查容器連接到docker0
brctl show --需要安裝插件 bridge-utils
可以看到當(dāng)前有三個(gè)容器接口連接到docker0,和上面在本地通過ip a查看到的網(wǎng)絡(luò)接口信息一致淀歇。
6易核、單個(gè)容器如何和外網(wǎng)進(jìn)行通信:結(jié)構(gòu)圖如下
(1)、首先linux主機(jī)是可以通過eth0訪問外網(wǎng) internet
(2)浪默、容器里面的數(shù)據(jù)包牡直,要訪問外網(wǎng),會(huì)進(jìn)過docker0 這個(gè)bridge纳决。在此處做一個(gè)網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)碰逸,轉(zhuǎn)換成eth0的地址,然后作為linux主機(jī)的一個(gè)數(shù)據(jù)包被發(fā)送到外網(wǎng)阔加,自然就訪問了外網(wǎng)饵史。
(3)、此處的NAT網(wǎng)絡(luò)地址轉(zhuǎn)換是通過iptables來實(shí)現(xiàn)的掸哑。
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
這條規(guī)則會(huì)將源地址為172.17.0.0/16的包(也就是從Docker容器產(chǎn)生的包)约急,并且不是從docker0網(wǎng)卡發(fā)出的,進(jìn)行源地址轉(zhuǎn)換苗分,轉(zhuǎn)換成主機(jī)網(wǎng)卡的地址。這么說可能不太好理解牵辣,舉一個(gè)例子說明一下摔癣。
假設(shè)主機(jī)有一塊網(wǎng)卡為eth0,IP地址為10.10.101.105/24纬向,網(wǎng)關(guān)為10.10.101.254择浊。從主機(jī)上一個(gè)IP為172.17.0.1/16的容器中ping百度(180.76.3.151)。IP包首先從容器發(fā)往自己的默認(rèn)網(wǎng)關(guān)docker0逾条,包到達(dá)docker0后琢岩,也就到達(dá)了主機(jī)上。然后會(huì)查詢主機(jī)的路由表师脂,發(fā)現(xiàn)包應(yīng)該從主機(jī)的eth0發(fā)往主機(jī)的網(wǎng)關(guān)10.10.105.254/24担孔。接著包會(huì)轉(zhuǎn)發(fā)給eth0江锨,并從eth0發(fā)出去(主機(jī)的ip_forward轉(zhuǎn)發(fā)應(yīng)該已經(jīng)打開)。這時(shí)候糕篇,上面的Iptable規(guī)則就會(huì)起作用啄育,對(duì)包做SNAT轉(zhuǎn)換 ( 源地址轉(zhuǎn)換 ),將源地址換為eth0的地址拌消。這樣挑豌,在外界看來,這個(gè)包就是從10.10.101.105上發(fā)出來的墩崩,Docker容器對(duì)外是不可見的氓英。
反之,假如對(duì)一個(gè)web容器做端口映射鹦筹,-p 80:80铝阐,那么容器啟動(dòng)之后,在iptables規(guī)則中則會(huì)生成一條類似如下的規(guī)則盛龄。也就是對(duì)包做了一個(gè)DNAT轉(zhuǎn)換(目的地址轉(zhuǎn)換)饰迹,將訪問主機(jī)80端口的包轉(zhuǎn)換成容器的ip地址,從而發(fā)往容器余舶。
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80
7啊鸭、新建docker network
docker network create -d bridge my-bridge
-d --指定Driver為bridge
8、新建docker時(shí)指定使用那個(gè)bridge
docker run -d --name test --network my-bridge busybox /bin/sh
可以通過brctl show 檢測(cè)到接口綁定到my-bridge上匿值。
9赠制、修改已經(jīng)運(yùn)行的docker連接的network
docker network connect my-bridge test
my-bridge 表示network
test 表示容器名
但是通過此種方法,test默認(rèn)在docker0上的連接不會(huì)刪除挟憔,只會(huì)在my-bridge這個(gè)網(wǎng)橋上新建一個(gè)連接
如果bridge是用戶自己創(chuàng)建的钟些,并且連接有多個(gè)容器,那么這些容器之間不僅可以通過ping ip绊谭,還可以通過ping 容器名政恍,默認(rèn)容器之間是使用了--link 參數(shù)的,可以相互連通达传。