tft每日頭條

 > 生活

 > docker容器配置網絡端口

docker容器配置網絡端口

生活 更新时间:2024-10-03 11:12:37

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

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

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_forward net.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 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

注意:

  • 這裡的規則映射了 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" }

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved