天天看點

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

文章目錄

  • 1. Docker 基礎網絡介紹
    • 1.1 外部通路容器
      • 1.1.1 映射所有端口位址
      • 1.1.2 映射到指定位址的指定端口
      • 1.1.3 映射到指定位址的任意端口
      • 1.1.4 檢視映射端口配置
    • 1.2 容器互聯
      • 1.2.1 建立網絡
      • 1.2.2 連接配接容器
      • 1.2.3 配置 DNS
  • 2. 進階網絡配置
    • 2.1 快速配置指南
    • 2.2 容器通路控制
      • 2.2.1 容器通路外部網絡
      • 2.2.2 容器之間通路
      • 2.2.3 通路所有端口
      • 2.2.4 通路指定端口
    • 2.3 映射容器端口到宿主主機的實作
      • 2.3.1 容器通路外部實作
      • 2.3.2 外部通路容器實作
      • 2.3.3 通路所有端口
      • 2.3.4 通路指定端口
    • 2.4 自定義網橋
      • 2.4.1 容器通路外部實作
      • 2.4.2 外部通路容器實作
      • 2.4.3 通路所有端口
      • 2.4.4 通路指定端口
    • 2.5 工具和示例
      • 2.4.1 容器通路外部實作
      • 2.4.2 外部通路容器實作
      • 2.4.3 通路所有端口
      • 2.4.4 通路指定端口
    • 2.6 編輯網絡配置檔案
    • 2.7 執行個體:建立一個點到點連接配接

Docker

允許通過外部通路容器或容器互聯的方式來提供網絡服務。

1. Docker 基礎網絡介紹

1.1 外部通路容器

當使用

-P

标記時,

Docker

随機映射

一個端口到内部容器開放的網絡端口。

使用

docker container ls

可以看到,本地主機的

49154

被映射到了容器的

80

端口。此時通路本機的

49154

端口(本機通路

http://localhost:49154

)即可通路容器内

nginx

預設頁面。

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置
DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

通路之後,可以通過

docker logs continerID

檢視通路日志:

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

-p

則可以指定要映射的端口,并且,在一個指定端口上隻可以綁定一個容器。支援的格式有:

  • ip:hostPort:containerPort

  • ip::containerPort

  • hostPort:containerPort

示例如下:

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

通路:

http://localhost:4172

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

檢視日志:

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

1.1.1 映射所有端口位址

使用

hostPort:containerPort

格式本地的

80

端口映射到容器的

80

端口,可以執行:

docker run -d -p 80:80 nginx:alpine
           

此時預設會綁定本地所有接口上的所有位址。通路:

http://localhost

即可看到

nginx

頁面。

1.1.2 映射到指定位址的指定端口

可以使用

ip:hostPort:containerPort

格式指定映射使用一個特定位址,比如

localhost

位址

127.0.0.1

docker run -d -p 127.0.0.1:80:80 nginx:alpine
           

1.1.3 映射到指定位址的任意端口

使用

ip::containerPort

綁定

localhost

的任意端口到容器的

80

端口,本地主機會

自動配置設定

一個端口。

docker run -d -p 127.0.0.1::80 nginx:alpine
           
DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

還可以使用

udp

标記來指定

udp

端口

docker run -d -p 127.0.0.1:80:80/udp nginx:alpine
           
DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

1.1.4 檢視映射端口配置

使用

docker port containerID portID

來檢視目前映射的端口配置,也可以檢視到綁定的位址

docker port 1aae 80
127.0.0.1:12500
           
DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

注意:

  • 容器有自己的内部網絡和

    ip

    位址(使用

    docker inspect

    檢視,

    Docker

    還可以有一個可變的網絡配置。)
  • -p

    标記可以多次使用來綁定多個端口

例如

$ docker run -d \
    -p 80:80 \
    -p 443:443 \
    nginx:alpine
           
DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

1.2 容器互聯

如果你之前有

Docker

使用經驗,你可能已經習慣了使用

--link

參數來進行容器互聯。

然而,随着

Docker

網絡的完善,這種方式已不是最優政策,強烈建議大家将容器加入自定義的

Docker

網絡來連接配接多個容器,而不是使用

--link

參數。

1.2.1 建立網絡

首先,我們來建立一個

Docker

網絡:

docker network create -d bridge dnet
           

-d

參數用來指定

Docker

網絡類型,有

bridge

overlay

兩種,其中

overlay

網絡類型用于 Swarm mode,這裡我們先忽略此概念。

1.2.2 連接配接容器

運作一個容器并連接配接到建立的

dnet

網絡:

docker run -it --rm --name busybox1 --network dnet busybox sh
           

打開新的終端,再運作一個容器并加入到

dnet

網絡:

docker run -it --rm --name busybox2 --network dnet busybox sh
           

再打開一個新的終端檢視容器資訊:

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

下面通過

ping

來證明

busybox1

容器和

busybox2

容器建立了互聯關系。

busybox1

容器輸入以下指令:

/ # ping busybox2
           

截圖如下:

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

ping

來測試連接配接

busybox2

容器,它會解析成

172.18.0.3

同理,在

busybox2

容器執行

ping busybox1

容器,也可以成功連接配接。

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

這就證明,

busybox1

容器和

busybox2

容器建立了互聯關系。可以看到,這種

Docker

網絡建構的方式非常簡單。

ps:

如果你有多個容器之間需要互相連接配接,推薦使用

Docker Compose

1.2.3 配置 DNS

如何自定義配置容器的主機名和

DNS

呢?秘訣就是

Docker

利用虛拟檔案來挂載容器的 3 個相關配置檔案。

在 容器 中使用

mount

指令可以看到挂載資訊:

未找到相應檔案和路徑,此處暫時略過

2. 進階網絡配置

Docker

啟動時,會自動在主機上建立一個

docker0

虛拟網橋,實際上是

Linux

的一個

bridge

,可以了解為一個軟體交換機。它會在挂載到它的網口之間進行轉發。

同時,

Docker

随機配置設定一個本地未占用的私有網段(在 RFC1918中定義)中的一個位址給

docker0

接口。比如典型的

172.17.42.1

,掩碼為

255.255.0.0

。此後啟動的容器内的網口也會自動配置設定一個同一網段(

172.17.0.0/16

)的位址。

當建立一個

Docker

容器的時候,同時會建立了一對

veth pair

接口(當資料包發送到一個接口時,另外一個接口也可以收到相同的資料包)。這對接口一端在容器内,即

eth0

;另一端在本地并被挂載到

docker0

網橋,名稱以

veth

開頭(例如

vethAQI2QT

)。通過這種方式,主機可以跟容器通信,容器之間也可以互相通信。

Docker

就建立了在主機和所有容器之間一個虛拟共享網絡。

DatawhaleTL24 | Docker Task04:網絡1. Docker 基礎網絡介紹2. 進階網絡配置

2.1 快速配置指南

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.2 容器通路控制

容器的通路控制,主要通過

Linux

上的

iptables

防火牆來進行管理和實作。

iptables

Linux

上預設的防火牆軟體,在大部分發行版中都自帶。

2.2.1 容器通路外部網絡

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

sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
           

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

如果在啟動

Docker

服務的時候設定

--ip-forward=true

,

Docker

就會自動設定系統的

ip_forward

參數為 1

2.2.2 容器之間通路

容器之間互相通路,需要兩方面的支援。

  • 容器的網絡拓撲是否已經互聯。預設情況下,所有容器都會被連接配接到

    docker0

    網橋上。
  • 本地系統的防火牆軟體

    -- iptables

    是否允許通過

2.2.3 通路所有端口

當啟動

Docker

服務(即

dockerd

)的時候,預設會添加一條轉發政策到本地主機

iptables

FORWARD

鍊上。政策為通過(

ACCEPT

)還是禁止(

DROP

)取決于配置

--icc=true

(預設值)還是

--icc=false

。當然,如果手動指定

--iptables=false

則不會添加

iptables

規則。

可見,預設情況下,不同容器之間是允許網絡互通的。如果為了安全考慮,可以在

/etc/docker/daemon.json ( WSL2 : ~/.docker/.daemon.json)

檔案中配置

{"icc": false}

來禁止它。

2.2.4 通路指定端口

通過

-icc=false

關閉網絡通路後,還可以通過

--link=CONTAINER_NAME:ALIAS

選項來通路容器的開放端口。

例如,在啟動

Docker

服務時,可以同時使用

icc=false --iptables=true

參數來關閉允許互相的網絡通路,并讓

Docker

可以修改系統中的

iptables

規則。

此時,系統中的

iptables

規則可能是類似

下邊省略的太多了,進行不下去了

2.3 映射容器端口到宿主主機的實作

2.3.1 容器通路外部實作

2.3.2 外部通路容器實作

2.3.3 通路所有端口

2.3.4 通路指定端口

2.4 自定義網橋

2.4.1 容器通路外部實作

2.4.2 外部通路容器實作

2.4.3 通路所有端口

2.4.4 通路指定端口

2.5 工具和示例

2.4.1 容器通路外部實作

2.4.2 外部通路容器實作

2.4.3 通路所有端口

2.4.4 通路指定端口

2.6 編輯網絡配置檔案

2.7 執行個體:建立一個點到點連接配接