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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker容器之网络模式

發布時間:2024/1/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:80

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

2、查看容器詳細信息(包含配置、環境、網關、掛載、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容器之网络模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。