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"}
,