Docker啟動(dòng)時(shí), 會(huì)自動(dòng)在主機(jī)上創(chuàng)建一個(gè)docker0虛擬網(wǎng)橋, 實(shí)際上是Linux的一個(gè)bridge,可以理解為一個(gè)軟件交換機(jī), 它會(huì)而掛載到它的網(wǎng)口之間進(jìn)行轉(zhuǎn)發(fā) 當(dāng)創(chuàng)建一個(gè)Docker容器的時(shí)候, 同理會(huì)創(chuàng)建一對(duì)veth pair接口(當(dāng)數(shù)據(jù)包發(fā)送到一個(gè)接口時(shí), 另外一個(gè)接口也可以收到相同的數(shù)據(jù)包), 這對(duì)接口一端在容器內(nèi), 即eth0;另一端在本地并被掛載到docker0網(wǎng)橋, 名稱以veth開頭。
Docker容器的DNS和主機(jī)名
實(shí)際上容器中/etc目錄下有3個(gè)文件是容器啟動(dòng)后被虛擬文件覆蓋掉的, 分別是/etc/hostname、 /etc/hosts、 /etc/resolve.conf,通過在容器中運(yùn)行mount命令可以查看。
Docker容器的5種網(wǎng)絡(luò)模式
在使用docker run創(chuàng)建docker容器時(shí), 可以用--net選項(xiàng)指定容器的網(wǎng)絡(luò)模式, Docker有以下5種網(wǎng)絡(luò)模式:
1. bridge模式
使用docker run --net=bridge指定, bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置, 此模式會(huì)為每一個(gè)容器分配Network Namespace、 設(shè)置IP等, 并將一個(gè)主機(jī)上的Docker容器連接到一個(gè)虛擬網(wǎng)橋上。 此模式與外界通信使用NAT協(xié)議, 增加了通訊的復(fù)雜性, 在復(fù)雜場(chǎng)景下使用會(huì)有諸多
限制。
route -n 查看 IP routing tables;
iptables -t nat -L -n 查看iptables rules.
2. host模式
使用docker run --net=host指定, 這種模式Docker Server將不為Docker容器創(chuàng)建網(wǎng)絡(luò)協(xié)議棧, 即不會(huì)創(chuàng)建獨(dú)立的network namespace,Docker容器中的進(jìn)程處于宿主機(jī)的網(wǎng)絡(luò)環(huán)境中,相當(dāng)于Docker容器的宿主機(jī)共用同一個(gè)network namespace,使用宿主機(jī)的網(wǎng)卡、 IP、 端口等信息。 此模式?jīng)]有網(wǎng)絡(luò)隔離性, 同時(shí)會(huì)引起網(wǎng)絡(luò)資源的競(jìng)爭(zhēng)與沖突。
3. container模式
使用docker run --net=container:othercontainer_name指定, 這種模式與host模式相似, 指定新創(chuàng)建的容器和已經(jīng)存在的某個(gè)容器共享同一個(gè)network namespace, 以下兩種模式都共享network namespace,區(qū)別就在于host模與宿主機(jī)共享, 而container模式與某個(gè)存在的容器共享。 在container模式下, 兩個(gè)容器的進(jìn)程可以通過lo回環(huán)網(wǎng)絡(luò)設(shè)備通訊, 增加了容器間通訊的便利性和效率。 container模式的應(yīng)用場(chǎng)景就在于可以將一個(gè)應(yīng)用的多個(gè)組件放在不同的容器趾, 這些 容器配成container模式的網(wǎng)絡(luò), 這樣它們可以作為一個(gè)整體對(duì)外提供服務(wù)。 同
時(shí), 這種模式也降低了容器間的隔離性。
docker run -it --name helloworld busybox sh docker run -it --name helloword-con --
net=container:helloword busybox sh
4. none模式
使用docker run --net=none指定, 在這種模式下, Docker容器擁有自己的Network
Namespace, 但是, 并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。 也就是說, 這個(gè)Docker容器沒有網(wǎng)卡、 IP、 路由等信息。 需要我們自己為Docker容器添加網(wǎng)卡、 配置IP等。 這種模式如果不進(jìn)行特定的配置是無法正常使用的, 但它也給了用戶最大的自由度來自定義容器的網(wǎng)絡(luò)環(huán)境。
5. overlay模式
overlay網(wǎng)絡(luò)特點(diǎn):
跨主機(jī)通訊
無需做端口映射
無需擔(dān)心IP沖突
服務(wù)發(fā)現(xiàn)與k/v存儲(chǔ): etcd, consul
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),順昌企業(yè)網(wǎng)站建設(shè),順昌品牌網(wǎng)站建設(shè),網(wǎng)站定制,順昌網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,順昌網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
[root@localhost ~]# docker pull busybox
//下載一個(gè)busybox
[root@localhost ~]# docker network ls
//查看原生網(wǎng)絡(luò)
1.None:什么都沒有的網(wǎng)絡(luò)
[root@localhost ~]# docker run -itd --name none --network none busybox:latest
//根據(jù)busybox創(chuàng)建一個(gè)容器,網(wǎng)卡為none
[root@localhost ~]# docker exec -it none /bin/sh
//進(jìn)入剛剛創(chuàng)建的容器
/ # ip a
//查看一下IP
用到None網(wǎng)絡(luò)的容器,會(huì)發(fā)現(xiàn)它只有一個(gè)Loop back回環(huán)的地址,沒有Mac地址,IP等信息,意味著他不能跟外界通信,是被隔離起來的網(wǎng)絡(luò)。需要我們自己為Docker容器添加網(wǎng)卡、 配置IP等。 這種模式如果不進(jìn)行特定的配置是無法正常使用的, 但它也給了用戶最大的自由度來自定義容器的網(wǎng)絡(luò)環(huán)境。
使用場(chǎng)景:
隔離意味著安全,所以此網(wǎng)絡(luò)可以運(yùn)行一些關(guān)于安全方面的驗(yàn)證碼、效驗(yàn)碼等服務(wù)。
2.Host網(wǎng)絡(luò):基于宿主機(jī)的網(wǎng)絡(luò)
[root@localhost ~]# docker run -itd --name host --network host busybox:latest
//根據(jù)busybox創(chuàng)建一個(gè)容器,網(wǎng)卡為host
[root@localhost ~]# docker exec -it host /bin/sh
//進(jìn)入剛剛創(chuàng)建的容器
/ # ip a
//查看一下IP
用到Host網(wǎng)絡(luò)的容器,它的網(wǎng)絡(luò)跟宿主機(jī)的網(wǎng)絡(luò)一模一樣,那是因?yàn)?,在?chuàng)建這個(gè)容器之初、并沒有對(duì)它的Net網(wǎng)絡(luò)棧進(jìn)行隔離,而是直接使用的宿主機(jī)的網(wǎng)絡(luò)棧。
使用場(chǎng)景:
網(wǎng)絡(luò)配置與dockerHost完全相同,性能較好,但不便之處是靈活性不高,此模式?jīng)]有網(wǎng)絡(luò)隔離性,容器與宿主機(jī)出現(xiàn)端口沖突問題。
3.Bridge:橋接網(wǎng)絡(luò)
[root@localhost ~]# brctl show
//查看一下橋接網(wǎng)絡(luò)
docker0:在我們安裝docker這個(gè)服務(wù)的時(shí)候,默認(rèn)就會(huì)生產(chǎn)- -張docker0的網(wǎng)卡,一般默認(rèn)IP為172.17.0.1/16.
[root@localhost ~]# docker run -itd --name test1 busybox:latest
//根據(jù)busybox創(chuàng)建一個(gè)容器
[root@localhost ~]# docker exec -it test1 /bin/sh
//進(jìn)入剛剛創(chuàng)建的容器
/ # ip a
//查看一下IP
/ # exit
//退出容器
[root@localhost ~]# ip a
//查看一下IP,*會(huì)發(fā)現(xiàn)多出一張網(wǎng)卡(docker0的網(wǎng)卡@容器中的if6)*
[root@localhost ~]# brctl show
//查看一下橋接網(wǎng)絡(luò),*這里也多了一個(gè)網(wǎng)卡*
容器默認(rèn)使用的網(wǎng)絡(luò)是docker0網(wǎng)絡(luò),docker0此時(shí)相當(dāng)于一個(gè)路由器,基于此網(wǎng)絡(luò)的容器,網(wǎng)段都是和docker0一致的。
自帶了-個(gè)ContainerDNSserver功能(域名解析)
1.bridge
[root@localhost ~]# docker network create -d bridge my_net
//創(chuàng)建一個(gè)名稱為my_net的bridge網(wǎng)絡(luò)
-d:設(shè)置網(wǎng)卡模式
[root@localhost ~]# ip a
//查看ip,會(huì)發(fā)現(xiàn)多了一個(gè)網(wǎng)卡
[root@localhost ~]# brctl show
//查看一下橋接網(wǎng)絡(luò),這里也多了一個(gè)網(wǎng)卡
[root@localhost ~]# docker run -itd --name test3 --network my_net busybox:latest
//開啟一臺(tái)容器,網(wǎng)卡為剛剛創(chuàng)建的my_net
[root@localhost ~]# docker exec -it test3 /bin/sh
//進(jìn)入剛剛創(chuàng)建的容器
/ # ip a
//查看一下IP
[root@localhost ~]# ip a
//查看ip,會(huì)發(fā)現(xiàn)多了一個(gè)網(wǎng)卡
[root@localhost ~]# brctl show
//查看一下橋接網(wǎng)絡(luò),這里也多了一個(gè)網(wǎng)卡
[root@localhost ~]# docker run -itd --name test4 --network my_net busybox:latest
//開啟一臺(tái)容器,網(wǎng)卡為剛剛創(chuàng)建的my_net
[root@localhost ~]# docker exec -it test3 /bin/sh
/ # ping test4
//ping 剛剛創(chuàng)建的容器名稱
自定義網(wǎng)絡(luò)優(yōu)點(diǎn),它可以通過容器的名稱通信。
2.指定容器IP
[root@localhost ~]# docker run -itd --name t1 --network my_net --ip 172.18.0.8 busybox:latest
//開啟一個(gè)容器并指定IP
[root@localhost ~]# docker network create -d bridge --subnet 172.30.16.0/24 --gateway 172.30.16.1 my_net3
//創(chuàng)建一個(gè)自定義網(wǎng)絡(luò),并且指定網(wǎng)關(guān)和網(wǎng)段
[root@localhost ~]# docker network ls
//查看網(wǎng)絡(luò)
[root@localhost ~]# ip a
如果想要給容器指定IP地址,那么自定義網(wǎng)絡(luò)的時(shí)候,必須指定網(wǎng)關(guān)gate和subnet網(wǎng)段選項(xiàng)。
開啟兩個(gè)容器測(cè)試一下
[root@localhost ~]# docker run -itd --name test5 --network my_net3 --ip 172.30.16.5 busybox:latest
//開啟一個(gè)容器test5并指定IP
[root@localhost ~]# docker exec -it test5 /bin/sh
/ # ip a
[root@localhost ~]# docker run -itd --name test6 --network my_net3 --ip 172.30.16.6 busybox:latest
//開啟一個(gè)容器test6并指定IP
[root@localhost ~]# docker exec -it test6 /bin/sh
/ # ip a
/ # ping test5
3.各網(wǎng)卡互通
[root@localhost ~]# iptables-save
//查看網(wǎng)卡信息的配置規(guī)則(可以看到防火墻的規(guī)則當(dāng)另一個(gè)網(wǎng)卡信息來到自己這里時(shí)直接丟棄)
[root@localhost ~]# docker network connect my_net3 test4
//my_net3網(wǎng)卡橋接test4 (網(wǎng)卡名稱 容器名稱)
[root@localhost ~]# docker exec -it test5 /bin/sh
/ # ping test4
剩下的以此類推,然后就可以各個(gè)網(wǎng)卡互通了