Docker容器之网络模式
目錄
一、Docker網(wǎng)絡(luò)實(shí)現(xiàn)原理
二、Docker的網(wǎng)絡(luò)模式
1、Host模式
2、Container模式?
3、None模式?
4、bridge模式?
三、自定義網(wǎng)絡(luò)?
1、查看網(wǎng)絡(luò)模式列表
2、查看容器詳細(xì)信息(包含配置、環(huán)境、網(wǎng)關(guān)、掛載、cmd等信息)?
3、指定分配容器IP地址?
四、暴露端口?
五、為容器創(chuàng)建端口映射?
一、Docker網(wǎng)絡(luò)實(shí)現(xiàn)原理
①docker使用Linux橋接,在宿主機(jī)虛擬一個docker容器網(wǎng)橋(docker0)
②docker啟動一個容器時會根據(jù)網(wǎng)橋的網(wǎng)段分配給容器一個IP地址,成為Container-IP
③同時Docker網(wǎng)橋是每個容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕粋€宿主機(jī)內(nèi)的容器都接入同一個網(wǎng)橋,這樣容器之間就能通過容器的Container-IP直接通信
docker網(wǎng)橋是宿主機(jī)虛擬出來的,并不是真實(shí)存在的網(wǎng)絡(luò)設(shè)備,外部網(wǎng)絡(luò)是無法尋址到的,這也意味著外部網(wǎng)絡(luò)無法直接通過Container-IP訪問到容器。如果容器希望外部能夠訪問到,可以通過映射容器端口到宿主機(jī)(端口映射),即docker run創(chuàng)建容器的時候,通過-p或者-P參數(shù)來啟用。訪問容器的時候,就通過[宿主機(jī)IP]:[容器端口]訪問容器
二、Docker的網(wǎng)絡(luò)模式
①Host:容器不會虛擬出自己的網(wǎng)卡,配置主機(jī)的IP等,而是使用宿主機(jī)的IP和端口
②Container:創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口的范圍
③None:該模式關(guān)閉了容器的網(wǎng)絡(luò)功能
④Bridge:默認(rèn)為該模式,橋接,此模式會為每一個容器分配,設(shè)置IP等,并將容器連接到一個docker0的虛擬網(wǎng)橋,通過docker0網(wǎng)段以及iptables nat表配置與宿主機(jī)通信
1、Host模式
①host模式:使用--net=host指定
②相當(dāng)于VMware中的橋接模式,與宿主機(jī)同一個網(wǎng)絡(luò)中,但是沒有獨(dú)立IP
③Docker使用Linux的Namespace技術(shù)來進(jìn)行資源隔離,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng),Network Namespace隔離網(wǎng)絡(luò)等
④一個Network Namespace提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、iptable規(guī)則等斗魚其他Network Namespace隔離。
⑤一個Docker容器一般會分配一個獨(dú)立的Network Namespace
但是如果啟動容器的時候使用host模式,那么這個容器不會獲得一個獨(dú)立的Network Namespace,而是和宿主機(jī)公鑰一個Network Namespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口,此時容器不再擁有隔離的,獨(dú)立的網(wǎng)絡(luò)棧,不擁有所有端口資源。
#創(chuàng)建容器web 1,指定網(wǎng)絡(luò)模式為 host #因?yàn)槭莌ost模式,所有宿主機(jī)和容器共享ip和端口docker run -d --name web1 --net=host nginx#訪問宿主機(jī)的ip和80端口,則可以訪問到web1的nginx服務(wù) curl http://192.168.109.11:802、Container模式?
①container模式:使用--net=container:NAME_or_ID指定
②這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP,端口范圍等。可以在一定程度上節(jié)省網(wǎng)絡(luò)資源,容器內(nèi)依然不會擁有所有端口。
③同樣,兩個容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng),進(jìn)程列表等還是隔離的
④兩個容器的進(jìn)程可以通過io網(wǎng)卡設(shè)備通信
#基于鏡像centos:7 創(chuàng)建一個名為test1的容器 [root@docker ~]# docker run -itd --name test1 centos:7 /bin/bash a4538d99640aae2a511471ae4e5cb43e037b93d9ca4b1e417f9eb629d0287563 #查看該容器的pid號 [root@docker ~]# docker inspect -f '{{.State.Pid}}' test1 24244 #查看該容器的命名空間編號 [root@docker ~]# ls -l /proc/24244/ns total 0 lrwxrwxrwx. 1 root root 0 Oct 17 15:03 ipc -> ipc:[4026532568] lrwxrwxrwx. 1 root root 0 Oct 17 15:03 mnt -> mnt:[4026532566] lrwxrwxrwx. 1 root root 0 Oct 17 15:03 net -> net:[4026532571] lrwxrwxrwx. 1 root root 0 Oct 17 15:03 pid -> pid:[4026532569] lrwxrwxrwx. 1 root root 0 Oct 17 15:03 user -> user:[4026531837] lrwxrwxrwx. 1 root root 0 Oct 17 15:03 uts -> uts:[4026532567] #創(chuàng)建test2容器,使用container網(wǎng)絡(luò)模式,和test1共享network Namespace [root@docker ~]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash 8cd322418164a241409c68336116ff90a241211d6464fbc9312adcfd39883d71 #查看test2容器的pid [root@docker ~]# docker inspect -f '{{.State.Pid}}' test2 24540 #查看該容器的命令空間編號 [root@docker ~]# ls -l /proc/24540/ns total 0 lrwxrwxrwx. 1 root root 0 Oct 17 15:25 ipc -> ipc:[4026532642] lrwxrwxrwx. 1 root root 0 Oct 17 15:25 mnt -> mnt:[4026532640] lrwxrwxrwx. 1 root root 0 Oct 17 15:25 net -> net:[4026532571] lrwxrwxrwx. 1 root root 0 Oct 17 15:25 pid -> pid:[4026532643] lrwxrwxrwx. 1 root root 0 Oct 17 15:25 user -> user:[4026531837] lrwxrwxrwx. 1 root root 0 Oct 17 15:25 uts -> uts:[4026532641]?
3、None模式?
①none模式:使用--net=none指定
②使用none模式,docker容器有自己的network Namespace,但是并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說,這個Docker容器沒有網(wǎng)卡,IP,路由等信息
③這種網(wǎng)絡(luò)模式下,容器只有IO回環(huán)網(wǎng)絡(luò),沒有其他網(wǎng)卡
④這種類型沒有辦法聯(lián)網(wǎng),但是封閉的網(wǎng)絡(luò)能很好的保證容器的安全性
⑤該容器將完全獨(dú)立于網(wǎng)絡(luò),用戶可以根據(jù)需要為容器添加網(wǎng)卡。此模式擁有所有端口。(none網(wǎng)絡(luò)模式配置網(wǎng)絡(luò))
⑥特殊情況下才會用到,一般不用
4、bridge模式?
bridge模式是docker的默認(rèn)網(wǎng)絡(luò)模式,不寫--net參數(shù),就bridge模式
相當(dāng)于VMware中的nat模式,容器使用獨(dú)立network Namespace,并連接到docker0虛擬網(wǎng)卡。通過docker0網(wǎng)橋以及iptables nat表配置與宿主機(jī)通信,此模式會為每一個容器分配Network Namespace,設(shè)置IP等,并將一個主機(jī)上的Docker容器連接到一個虛擬網(wǎng)橋上。
①當(dāng)Docker進(jìn)程啟動時,會在主機(jī)上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在一個二層網(wǎng)絡(luò)中。
②從docker0子網(wǎng)中分配一個IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。在主機(jī)上創(chuàng)建一對虛擬網(wǎng)卡veth pair。veth設(shè)備總是成對出現(xiàn)的,它們組成一個數(shù)據(jù)的通道,數(shù)據(jù)從一個設(shè)備進(jìn)入,就會從另一個設(shè)備出來。因此,veth設(shè)備常用來連接兩個網(wǎng)絡(luò)設(shè)備
③Docker將veth pair設(shè)備的一段放在新創(chuàng)建的容器中,并命名為eth0(容器的網(wǎng)卡),另一端放在主機(jī)中,以veth*這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。可以通過brctl show命令查看
④容器之間通過veth pair進(jìn)行訪問
⑤使用docker run -p時,docker實(shí)際是在iptables做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能。可以使用iptables -t nat -vnL 查看
[root@docker ~]# docker run -itd --name test1 centos:7 /bin/bash 357d3f7aac0c0af56a169e2c31760431acc1b7bc65e454f48c3bce3ffa6765ab [root@docker ~]# docker inspect test1 | grep -i "networkmode""NetworkMode": "default",三、自定義網(wǎng)絡(luò)?
1、查看網(wǎng)絡(luò)模式列表
docker network ls2、查看容器詳細(xì)信息(包含配置、環(huán)境、網(wǎng)關(guān)、掛載、cmd等信息)?
docker inspect 容器ID或容器名?
3、指定分配容器IP地址?
[root@docker ~]# docker run -itd --name test2 --network bridge --ip 172.17.0.10 centos:7 /bin/bash d0b202d7c395685b778e7e71e62651c5e646a006b8bd206a38694aeb67078682 docker: Error response from daemon: user specified IP address is supported on user defined networks only.#以上會出現(xiàn)報錯,因?yàn)橛脩羰褂玫腎P地址不被規(guī)則所允許,docker0定義的就是按照順序來,所以需要創(chuàng)建一個dockers network create --subnet=172.18.0.0/16 mynetwork自定義完網(wǎng)絡(luò),我們再指定IP
docker run -itd --name test3 --network mynetwork --ip=172.18.0.10 centos:7 /bin/bash四、暴露端口?
兩個容器如果端口一致的情況下,暴露出去會產(chǎn)生地址沖突,所以需要再docker0上做一個端口映射,通過ens33暴露出去不同端口就可以了
-p 自定義端口 ( 宿主機(jī)端口:容器內(nèi)端口 )-P 隨機(jī)端口 (-P 49153起始 49153到65535) [root@docker ~]# docker run -itd -p 8080:80 nginx /bin/bash 4d2879a1059c9f6709fc5a3a6a14fd90dc51689b514818271111cb0ee7836242 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d2879a1059c nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp admiring_driscoll#進(jìn)入容器開啟nginx docker exec -it 4d2879a1059c /bin/bash -c nginx瀏覽器訪問
?
五、為容器創(chuàng)建端口映射?
隨機(jī)映射端口(從32768開始)docker run -d --name 為容器指定名稱 -P ? 鏡像指定映射端口docker ? run -d --name 為容器指定名稱 -p 宿主機(jī)端口:容器內(nèi)端口 ? 鏡像 #使用nginx鏡像創(chuàng)建容器,名稱為web1 ,隨機(jī)映射端口 docker run -d --name web1 -P nginx docker ps -a#使用nginx鏡像創(chuàng)建容器,名稱為web2,將容器內(nèi)的80端口映射到宿主機(jī)的39999端口 docker run -d --name web2 -p 40000:80 nginx docker ps -a#訪問 curl http://192.168.130.100:49154 curl http://192.168.130.100:40000#主機(jī)查看端口號 netstat -natp|grep docker#實(shí)際上是通過nat表進(jìn)行轉(zhuǎn)發(fā)的 iptables -nL -t nat??
總結(jié)
以上是生活随笔為你收集整理的Docker容器之网络模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 歌曲网站
- 下一篇: 屏幕进入省电模式计算机未输出,戴尔 U2