日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker容器之网络模式

發(fā)布時間:2024/1/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker容器之网络模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、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:80

2、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 ls

2、查看容器詳細(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。