久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Docker的網絡模式有哪些

244次閱讀
沒有評論

共計 3063 個字符,預計需要花費 8 分鐘才能閱讀完成。

本篇內容主要講解“Docker 的網絡模式有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“Docker 的網絡模式有哪些”吧!

我們在使用 docker run 創建 Docker 容器時,可以用 –net 選項指定容器的網絡模式,Docker 有以下 4 種網絡模式:

· host 模式,使用 –net=host 指定。

· container 模式,使用 –net=container:NAME_or_ID 指定。

· none 模式,使用 –net=none 指定。

· bridge 模式,使用 –net=bridge 指定,默認設置。

下面分別介紹一下 Docker 的各個網絡模式。

1 host 模式

眾所周知,Docker 使用了 Linux 的 Namespaces 技術來進行資源隔離,如 PID Namespace 隔離進程,Mount Namespace 隔離文件系統,Network Namespace 隔離網絡等。一個 Network Namespace 提供了一份獨立的網絡環境,包括網卡、路由、Iptable 規則等都與其他的 Network Namespace 隔離。一個 Docker 容器一般會分配一個獨立的 Network Namespace。但如果啟動容器的時候使用 host 模式,那么這個容器將不會獲得一個獨立的 Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬出自己的網卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。

例如,我們在 10.10.101.105/24 的機器上用 host 模式啟動一個含有 web 應用的 Docker 容器,監聽 tcp80 端口。當我們在容器中執行任何類似 ifconfig 命令查看網絡環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用 10.10.101.105:80 即可,不用任何 NAT 轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。

2 container 模式

在理解了 host 模式后,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。

3 none 模式

這個模式和前兩個不同。在這種模式下,Docker 容器擁有自己的 Network Namespace,但是,并不為 Docker 容器進行任何網絡配置。也就是說,這個 Docker 容器沒有網卡、IP、路由等信息。需要我們自己為 Docker 容器添加網卡、配置 IP 等。

4 bridge 模式

bridge 模式是 Docker 默認的網絡設置,此模式會為每一個容器分配 Network Namespace、設置 IP 等,并將一個主機上的 Docker 容器連接到一個虛擬網橋上。下面著重介紹一下此模式。

4.1 bridge 模式的拓撲

當 Docker server 啟動時,會在主機上創建一個名為 docker0 的虛擬網橋,此主機上啟動的 Docker 容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。接下來就要為容器分配 IP 了,Docker 會從 RFC1918 所定義的私有 IP 網段中,選擇一個和宿主機不同的 IP 地址和子網分配給 docker0,連接到 docker0 的容器就從這個子網中選擇一個未占用的 IP 使用。如一般 Docker 會使用 172.17.0.0/16 這個網段,并將 172.17.42.1/16 分配給 docker0 網橋(在主機上使用 ifconfig 命令是可以看到 docker0 的,可以認為它是網橋的管理接口,在宿主機上作為一塊虛擬網卡使用)。單機環境下的網絡拓撲如下,主機地址為 10.10.101.105/24。

Docker 完成以上網絡配置的過程大致是這樣的:

1. 在主機上創建一對虛擬網卡 veth pair 設備。veth 設備總是成對出現的,它們組成了一個數據的通道,數據從一個設備進入,就會從另一個設備出來。因此,veth 設備常用來連接兩個網絡設備。

2. Docker 將 veth pair 設備的一端放在新創建的容器中,并命名為 eth0。另一端放在主機中,以 veth75f9 這樣類似的名字命名,并將這個網絡設備加入到 docker0 網橋中,可以通過 brctl show 命令查看。

3. 從 docker0 子網中分配一個 IP 給容器使用,并設置 docker0 的 IP 地址為容器的默認網關。

網絡拓撲介紹完后,接著介紹一下 bridge 模式下容器是如何通信的。

4.2 bridge 模式下容器的通信

在 bridge 模式下,連在同一網橋上的容器可以相互通信(若出于安全考慮,也可以禁止它們之間通信,方法是在 DOCKER_OPTS 變量中設置 –icc=false,這樣只有使用 –link 才能使兩個容器通信)。

容器也可以與外部通信,我們看一下主機上的 Iptable 規則,可以看到這么一條

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

這條規則會將源地址為 172.17.0.0/16 的包(也就是從 Docker 容器產生的包),并且不是從 docker0 網卡發出的,進行源地址轉換,轉換成主機網卡的地址。這么說可能不太好理解,舉一個例子說明一下。假設主機有一塊網卡為 eth0,IP 地址為 10.10.101.105/24,網關為 10.10.101.254。從主機上一個 IP 為 172.17.0.1/16 的容器中 ping 百度(180.76.3.151)。IP 包首先從容器發往自己的默認網關 docker0,包到達 docker0 后,也就到達了主機上。然后會查詢主機的路由表,發現包應該從主機的 eth0 發往主機的網關 10.10.105.254/24。接著包會轉發給 eth0,并從 eth0 發出去(主機的 ip_forward 轉發應該已經打開)。這時候,上面的 Iptable 規則就會起作用,對包做 SNAT 轉換,將源地址換為 eth0 的地址。這樣,在外界看來,這個包就是從 10.10.101.105 上發出來的,Docker 容器對外是不可見的。

那么,外面的機器是如何訪問 Docker 容器的服務呢?我們首先用下面命令創建一個含有 web 應用的容器,將容器的 80 端口映射到主機的 80 端口。

docker run -d –name web -p 80:80 fmzhen/simpleweb

然后查看 Iptable 規則的變化,發現多了這樣一條規則:

-A DOCKER ! -i docker0 -p tcp -m tcp –dport 80 -j DNAT –to-destination 172.17.0.5:80

此條規則就是對主機 eth0 收到的目的端口為 80 的 tcp 流量進行 DNAT 轉換,將流量發往 172.17.0.5:80,也就是我們上面創建的 Docker 容器。所以,外界只需訪問 10.10.101.105:80 就可以訪問到容器中得服務。

除此之外,我們還可以自定義 Docker 使用的 IP 地址、DNS 等信息,甚至使用自己定義的網橋,但是其工作方式還是一樣的。

到此,相信大家對“Docker 的網絡模式有哪些”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計3063字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 林口县| 青川县| 开远市| 达拉特旗| 石屏县| 满城县| 铁力市| 灵璧县| 三亚市| 大理市| 永仁县| 湘潭市| 金溪县| 通榆县| 浮山县| 九龙县| 焦作市| 化隆| 揭西县| 容城县| 罗田县| 霍城县| 二连浩特市| 茶陵县| 忻州市| 新乡县| 镇远县| 阜平县| 永清县| 东丰县| 文登市| 中方县| 阳东县| 永兴县| 长沙市| 依安县| 呼和浩特市| 武隆县| 崇仁县| 英超| 元朗区|