新四季網

docker容器配置網絡埠(docker容器的訪問控制以及埠映射等高級網絡配置)

2023-04-13 11:02:57 3

docker容器配置網絡埠?文章索引:1、docker入門之鏡像、容器和倉庫,今天小編就來說說關於docker容器配置網絡埠?下面更多詳細答案一起來看看吧!

docker容器配置網絡埠

文章索引:

1、docker入門之鏡像、容器和倉庫

2、docker的安裝與鏡像加速器的配置

3、docker系列基礎課程--如何獲取鏡像、列出鏡像和刪除鏡像

4、docker系列基礎課程:利用commit 理解鏡像構成

5、docker系列基礎課程:使用 Dockerfile 定製鏡像

6、docker系列基礎課程:Dockerfile 指令詳解(1)

7、docker系列基礎課程:Dockerfile 指令詳解(2)

8、docker系列基礎課程:Dockerfile 指令詳解(3)

9、docker系列基礎課程:docker容器的操作與維護

10、docker倉庫的使用以及通過Nexus構建私有倉庫

11、Docker數據管理以及數據持久化機制

12、docker網絡中外部訪問容器以及容器互聯機制

本節將繼續介紹 Docker 的一些高級網絡配置和選項。

當 Docker 啟動時,會自動在主機上創建一個 docker0 虛擬網橋,實際上是 Linux 的一個 bridge,可以理解為一個軟體交換機。它會在掛載到它的網口之間進行轉發。

同時,Docker 隨機分配一個本地未佔用的私有網段(在 RFC1918 中定義)中的一個地址給 docker0 接口。比如典型的 172.17.42.1,掩碼為 255.255.0.0。此後啟動的容器內的網口也會自動分配一個同一網段(172.17.0.0/16)的地址。

接下來的部分將介紹在一些場景中,Docker 所有的網絡定製配置。以及通過 Linux 命令來調整、補充、甚至替換 Docker 默認的網絡配置。

快速配置指南

下面是一個跟 Docker 網絡相關的命令列表。

其中有些命令選項只有在 Docker 服務啟動的時候才能配置,而且不能馬上生效。

-b BRIDGE 或 --bridge=BRIDGE 指定容器掛載的網橋--bip=CIDR 定製 docker0 的掩碼-H SOCKET... 或 --host=SOCKET... Docker 服務端接收命令的通道--icc=true|false 是否支持容器之間進行通信--ip-forward=true|false 請看下文容器之間的通信--iptables=true|false 是否允許 Docker 添加 iptables 規則--mtu=BYTES 容器網絡中的 MTU

下面2個命令選項既可以在啟動服務時指定,也可以在啟動容器時指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執行 docker run 時可以覆蓋設置的默認值。

--dns=IP_ADDRESS... 使用指定的DNS伺服器--dns-search=DOMAIN... 指定DNS搜索域

最後這些選項只有在 docker run 執行時使用,因為它是針對容器的特性內容。

-h HOSTNAME 或 --hostname=HOSTNAME 配置容器主機名--link=CONTAINER_NAME:ALIAS 添加到另一個容器的連接--net=bridge|none|container:NAME_or_ID|host 配置容器的橋接模式-p SPEC 或 --publish=SPEC 映射容器埠到宿主主機-P or --publish-all=true|false 映射容器所有埠到宿主主機

容器訪問控制

容器的訪問控制,主要通過 Linux 上的 iptables 防火牆來進行管理和實現。iptables 是 Linux 上默認的防火牆軟體,在大部分發行版中都自帶。

容器訪問外部網絡

容器要想訪問外部網絡,需要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。

$sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1

如果為 0,說明沒有開啟轉發,則需要手動打開。

$sysctl -w net.ipv4.ip_forward=1

如果在啟動 Docker 服務的時候設定 --ip-forward=true, Docker 就會自動設定系統的 ip_forward 參數為 1。

容器之間訪問

容器之間相互訪問,需要兩方面的支持。

容器的網絡拓撲是否已經互聯。默認情況下,所有容器都會被連接到 docker0 網橋上。本地系統的防火牆軟體 -- iptables 是否允許通過。

訪問所有埠

當啟動 Docker 服務(即 dockerd)的時候,默認會添加一條轉發策略到本地主機 iptables 的 FORWARD 鏈上。策略為通過(ACCEPT)還是禁止(DROP)取決於配置--icc=true(預設值)還是 --icc=false。當然,如果手動指定 --iptables=false 則不會添加 iptables 規則。

可見,默認情況下,不同容器之間是允許網絡互通的。如果為了安全考慮,可以在 /etc/docker/daemon.json 文件中配置 {"icc": false} 來禁止它。

訪問指定埠

在通過 -icc=false 關閉網絡訪問後,還可以通過 --link=CONTAINER_NAME:ALIAS 選項來訪問容器的開放埠。

例如,在啟動 Docker 服務時,可以同時使用 icc=false --iptables=true 參數來關閉允許相互的網絡訪問,並讓 Docker 可以修改系統中的 iptables 規則。

此時,系統中的 iptables 規則可能是類似

$ sudo iptables -nL...Chain FORWARD (policy ACCEPT)target prot opt source destiNATionDROP all -- 0.0.0.0/0 0.0.0.0/0...

之後,啟動容器(docker run)時使用 --link=CONTAINER_NAME:ALIAS 選項。Docker 會在 iptable 中為 兩個容器分別添加一條 ACCEPT 規則,允許相互訪問開放的埠(取決於 Dockerfile 中的 EXPOSE 指令)。

當添加了 --link=CONTAINER_NAME:ALIAS 選項後,添加了 iptables 規則。

$ sudo iptables -nL...Chain FORWARD (policy ACCEPT)target prot opt source destinationACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80DROP all -- 0.0.0.0/0 0.0.0.0/0

注意:--link=CONTAINER_NAME:ALIAS 中的 CONTAINER_NAME 目前必須是 Docker 分配的名字,或使用 --name 參數指定的名字。主機名則不會被識別。

映射容器埠到宿主主機的實現

默認情況下,容器可以主動訪問到外部網絡的連接,但是外部網絡無法訪問到容器。

容器訪問外部實現

容器所有到外部網絡的連接,源地址都會被 NAT 成本地系統的 IP 地址。這是使用 iptables 的源地址偽裝操作實現的。

查看主機的 NAT 規則。

$ sudo iptables -t nat -nL...Chain POSTROUTING (policy ACCEPT)target prot opt source destinationMASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16...

其中,上述規則將所有源地址在 172.17.0.0/16 網段,目標地址為其他網段(外部網絡)的流量動態偽裝為從系統網卡發出。MASQUERADE 跟傳統 SNAT 的好處是它能動態從網卡獲取地址。

外部訪問容器實現

容器允許外部訪問,可以在 docker run 時候通過 -p 或 -P 參數來啟用。

不管用那種辦法,其實也是在本地的 iptable 的 nat 表中添加相應的規則。

使用 -P 時:

$ iptables -t nat -nL...Chain DOCKER (2 references)target prot opt source destinationDNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80

使用 -p 80:80 時:

$ iptables -t nat -nLChain DOCKER (2 references)target prot opt source destinationDNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80

注意:

這裡的規則映射了 0.0.0.0,意味著將接受主機來自所有接口的流量。用戶可以通過 -p IP:host_port:container_port 或 -p IP::port 來指定允許訪問容器的主機上的 IP、接口等,以制定更嚴格的規則。如果希望永久綁定到某個固定的 IP 地址,可以在 Docker 配置文件 /etc/docker/daemon.json 中添加如下內容。

{ "ip": "0.0.0.0"}

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了