Docker容器之网络模式
目錄
一、Docker網絡實現原理
二、Docker的網絡模式
1、Host模式
2、Container模式?
3、None模式?
4、bridge模式?
三、自定義網絡?
1、查看網絡模式列表
2、查看容器詳細信息(包含配置、環境、網關、掛載、cmd等信息)?
3、指定分配容器IP地址?
四、暴露端口?
五、為容器創建端口映射?
一、Docker網絡實現原理
①docker使用Linux橋接,在宿主機虛擬一個docker容器網橋(docker0)
②docker啟動一個容器時會根據網橋的網段分配給容器一個IP地址,成為Container-IP
③同時Docker網橋是每個容器的默認網關。因為在同一個宿主機內的容器都接入同一個網橋,這樣容器之間就能通過容器的Container-IP直接通信
docker網橋是宿主機虛擬出來的,并不是真實存在的網絡設備,外部網絡是無法尋址到的,這也意味著外部網絡無法直接通過Container-IP訪問到容器。如果容器希望外部能夠訪問到,可以通過映射容器端口到宿主機(端口映射),即docker run創建容器的時候,通過-p或者-P參數來啟用。訪問容器的時候,就通過[宿主機IP]:[容器端口]訪問容器
二、Docker的網絡模式
①Host:容器不會虛擬出自己的網卡,配置主機的IP等,而是使用宿主機的IP和端口
②Container:創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口的范圍
③None:該模式關閉了容器的網絡功能
④Bridge:默認為該模式,橋接,此模式會為每一個容器分配,設置IP等,并將容器連接到一個docker0的虛擬網橋,通過docker0網段以及iptables nat表配置與宿主機通信
1、Host模式
①host模式:使用--net=host指定
②相當于VMware中的橋接模式,與宿主機同一個網絡中,但是沒有獨立IP
③Docker使用Linux的Namespace技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網絡等
④一個Network Namespace提供了一份獨立的網絡環境,包括網卡、路由、iptable規則等斗魚其他Network Namespace隔離。
⑤一個Docker容器一般會分配一個獨立的Network Namespace
但是如果啟動容器的時候使用host模式,那么這個容器不會獲得一個獨立的Network Namespace,而是和宿主機公鑰一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口,此時容器不再擁有隔離的,獨立的網絡棧,不擁有所有端口資源。
#創建容器web 1,指定網絡模式為 host #因為是host模式,所有宿主機和容器共享ip和端口docker run -d --name web1 --net=host nginx#訪問宿主機的ip和80端口,則可以訪問到web1的nginx服務 curl http://192.168.109.11:802、Container模式?
①container模式:使用--net=container:NAME_or_ID指定
②這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP,端口范圍等。可以在一定程度上節省網絡資源,容器內依然不會擁有所有端口。
③同樣,兩個容器除了網絡方面,其他的如文件系統,進程列表等還是隔離的
④兩個容器的進程可以通過io網卡設備通信
#基于鏡像centos:7 創建一個名為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] #創建test2容器,使用container網絡模式,和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容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡,IP,路由等信息
③這種網絡模式下,容器只有IO回環網絡,沒有其他網卡
④這種類型沒有辦法聯網,但是封閉的網絡能很好的保證容器的安全性
⑤該容器將完全獨立于網絡,用戶可以根據需要為容器添加網卡。此模式擁有所有端口。(none網絡模式配置網絡)
⑥特殊情況下才會用到,一般不用
4、bridge模式?
bridge模式是docker的默認網絡模式,不寫--net參數,就bridge模式
相當于VMware中的nat模式,容器使用獨立network Namespace,并連接到docker0虛擬網卡。通過docker0網橋以及iptables nat表配置與宿主機通信,此模式會為每一個容器分配Network Namespace,設置IP等,并將一個主機上的Docker容器連接到一個虛擬網橋上。
①當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在一個二層網絡中。
②從docker0子網中分配一個IP給容器使用,并設置docker0的IP地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair。veth設備總是成對出現的,它們組成一個數據的通道,數據從一個設備進入,就會從另一個設備出來。因此,veth設備常用來連接兩個網絡設備
③Docker將veth pair設備的一段放在新創建的容器中,并命名為eth0(容器的網卡),另一端放在主機中,以veth*這樣類似的名字命名,并將這個網絡設備加入到docker0網橋中。可以通過brctl show命令查看
④容器之間通過veth pair進行訪問
⑤使用docker run -p時,docker實際是在iptables做了DNAT規則,實現端口轉發功能。可以使用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",三、自定義網絡?
1、查看網絡模式列表
docker network ls2、查看容器詳細信息(包含配置、環境、網關、掛載、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.#以上會出現報錯,因為用戶使用的IP地址不被規則所允許,docker0定義的就是按照順序來,所以需要創建一個dockers network create --subnet=172.18.0.0/16 mynetwork自定義完網絡,我們再指定IP
docker run -itd --name test3 --network mynetwork --ip=172.18.0.10 centos:7 /bin/bash四、暴露端口?
兩個容器如果端口一致的情況下,暴露出去會產生地址沖突,所以需要再docker0上做一個端口映射,通過ens33暴露出去不同端口就可以了
-p 自定義端口 ( 宿主機端口:容器內端口 )-P 隨機端口 (-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#進入容器開啟nginx docker exec -it 4d2879a1059c /bin/bash -c nginx瀏覽器訪問
?
五、為容器創建端口映射?
隨機映射端口(從32768開始)docker run -d --name 為容器指定名稱 -P ? 鏡像指定映射端口docker ? run -d --name 為容器指定名稱 -p 宿主機端口:容器內端口 ? 鏡像 #使用nginx鏡像創建容器,名稱為web1 ,隨機映射端口 docker run -d --name web1 -P nginx docker ps -a#使用nginx鏡像創建容器,名稱為web2,將容器內的80端口映射到宿主機的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#主機查看端口號 netstat -natp|grep docker#實際上是通過nat表進行轉發的 iptables -nL -t nat??
總結
以上是生活随笔為你收集整理的Docker容器之网络模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 歌曲网站
- 下一篇: 屏幕进入省电模式计算机未输出,戴尔 U2