docker容器配置網絡端口?文章索引:1、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 服務啟動的時候才能配置,而且不能馬上生效。
下面2個命令選項既可以在啟動服務時指定,也可以在啟動容器時指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執行 docker run 時可以覆蓋設置的默認值。
最後這些選項隻有在 docker run 執行時使用,因為它是針對容器的特性内容。
容器訪問控制
容器的訪問控制,主要通過 Linux 上的 iptables 防火牆來進行管理和實現。iptables 是 Linux 上默認的防火牆軟件,在大部分發行版中都自帶。
容器訪問外部網絡
容器要想訪問外部網絡,需要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。
$sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
如果為 0,說明沒有開啟轉發,則需要手動打開。
$sysctl -w net.ipv4.ip_forward=1
如果在啟動 Docker 服務的時候設定 --ip-forward=true, Docker 就會自動設定系統的 ip_forward 參數為 1。
容器之間訪問
容器之間相互訪問,需要兩方面的支持。
訪問所有端口
當啟動 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 destiNATion DROP 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 destination ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80 ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80 DROP 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 destination MASQUERADE 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 destination DNAT 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 -nL Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
注意:
{ "ip": "0.0.0.0" }
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!