返回文章列表

Docker 網路連線與隔離容器實務

本文探討 Docker 網路管理,包含不同網路驅動程式、連線埠繫結、自定義橋接網路設定及容器間隔離等實務操作。從預設橋接網路的限制到自定義網路的建立與使用,以及如何動態變更執行中容器的網路連線,提供全面的 Docker 網路管理,並搭配圖表與程式碼範例,讓讀者輕鬆掌握 Docker 網路核心概念。

容器技術 網路管理

Docker 網路管理是容器化應用程式佈署的關鍵環節。理解 Docker 的網路驅動程式,如 bridge、host、none、overlay 和 macvlan,能幫助我們根據應用需求選擇合適的網路模式。本文將詳細說明如何設定容器網路,包含連線埠繫結、自定義橋接網路的建立與使用,以及如何在不停止容器的情況下動態調整網路設定。此外,我們還會探討如何使用 Docker 提供的命令列工具,例如 docker network lsdocker network inspect,來檢視和管理網路組態,並提供常見問題的解答,幫助讀者更深入地理解 Docker 網路管理的精髓。

Docker 網路基礎:連線與隔離容器

Docker 的網路系統是模組化的,預設包含多種網路驅動程式,能夠滿足大部分使用者的需求。在本章中,我們將探討 Docker 提供的網路驅動程式、如何設定容器網路,以及如何將容器對外暴露。

繫結埠號至服務

在伺服器端,例如使用 NGINX 作為網站伺服器時,需要將埠號繫結至伺服器行程。這個繫結可以是特定的 IP 地址,也可以是 0.0.0.0,代表繫結至伺服器上的所有可用 IP 地址。

例項解析

假設主機只有一張網路卡和一個 IP 地址,當我們要將埠號繫結至某個行程時,需要指定該 IP 地址和一個埠號,例如 80。這裡的關鍵是「繫結」—— 將一個埠號與特定的 IP 地址繫結後,該埠號就無法被其他行程使用。

# 示例:NGINX 組態檔案中的埠繫結
server {
    listen 80;
    server_name example.com;
    # 其他組態...
}

內容解密:

  1. listen 80;:這行組態表示 NGINX 將監聽 80 埠,接收來自該埠的 HTTP 請求。
  2. server_name example.com;:指定該伺服器區塊處理對應於 example.com 的請求。
  3. 其他組態:根據需求可以加入更多 NGINX 組態,例如反向代理、SSL 設定等。

如果嘗試在已經被繫結的埠上啟動另一個行程,將會收到類別似以下的錯誤訊息:

Bind for 192.168.1.1:443 failed: port is already allocated

解決方法是為新的行程指定一個未被使用的埠號。例如,在同一台伺服器上,可以讓 NGINX 執行在 80 埠,而 MySQL 資料函式庫執行在 3306 埠。

Docker 網路驅動程式

Docker 提供了多種網路驅動程式,以滿足不同的網路需求。預設情況下,Docker 包含以下幾種網路選項:

網路驅動程式描述
bridge提供容器間的網路通訊,僅限於同一主機上的容器。
host移除容器與主機之間的網路隔離,直接使用主機網路。
none停用容器的網路功能。
overlay跨多個 Docker 主機的容器網路,通常用於 Docker Swarm。
macvlan將容器直接連線到主機的網路介面,使其表現得像一台實體機器。

圖表說明:Docker 網路驅動程式架構圖

圖表翻譯: 該圖展示了 Docker 網路驅動程式的不同型別,包括 bridgehostnoneoverlaymacvlan。其中 bridge 驅動程式下又分為預設橋接網路和自定義橋接網路。

預設橋接網路

預設橋接網路是 Docker 在安裝時自動建立的網路,大多數使用者直接使用它來進行容器間的通訊。然而,預設橋接網路有一些限制,例如:

  • 多個容器預設可以互相通訊,可能引發安全性問題。
  • 容器間的通訊僅限於 IP 地址,若 IP 地址變更,則需要手動更新組態。

建議在生產環境中使用自定義橋接網路,以獲得更好的隔離性和靈活性。

自定義橋接網路

相較於預設橋接網路,自定義橋接網路提供了更多的功能和更好的安全性。例如,自定義橋接網路允許容器間使用容器名稱或主機名稱進行通訊,而不僅僅是 IP 地址。

建立自定義橋接網路

docker network create --driver bridge my_custom_bridge

將容器連線到自定義橋接網路

docker run --network=my_custom_bridge --name my_container my_image

內容解密:

  1. docker network create --driver bridge my_custom_bridge:建立一個名為 my_custom_bridge 的自定義橋接網路。
  2. docker run --network=my_custom_bridge --name my_container my_image:啟動一個名為 my_container 的容器,並將其連線到 my_custom_bridge 網路。

使用自定義橋接網路可以提高容器的隔離性和可管理性,是生產環境中的推薦做法。

Docker 網路管理深度解析

預設橋接網路的限制與改進

使用預設橋接網路(default bridge)時,所有容器分享相同的網路設定,這限制了網路組態的多樣性。例如,若需要某些容器執行巨型幀(jumbo frames),而其他容器使用標準MTU大小,預設橋接網路無法滿足此需求,因為它只能設定單一MTU大小。

相對地,使用者自定義橋接網路(user-defined bridge)提供了更大的靈活性。可以建立多個自定義橋接網路,每個網路可設定不同的MTU大小,如9000或保持預設的1500。

檢視現有網路

使用 docker network ls 命令可列出 Docker 主機上的所有現有網路。預設情況下,Docker 包含三個預設網路:bridgehostnone

深入瞭解網路細節

使用 docker network inspect <網路名稱> 命令可檢視特定網路的詳細資訊,包括子網、閘道、驅動程式型別和連線的容器等。

程式碼範例:檢視網路詳情

docker network inspect frontend

內容解密:

  1. docker network inspect 命令用於取得指定網路的詳細組態。
  2. 輸出結果包含網路的基本資訊,如子網和閘道設定。
  3. 連線至該網路的容器資訊,包括容器名稱和 IP 位址。

建立自定義橋接網路

建立自定義橋接網路時,可指定子網、IP 範圍和閘道等選項。這些設定的 IP 位址僅在 Docker 主機內有效,不會與外部衝突。

程式碼範例:建立自定義網路

docker network create --subnet=192.168.10.0/24 --gateway=192.168.10.1 backend

內容解密:

  1. 使用 docker network create 命令建立新的自定義網路。
  2. --subnet 引數指定子網範圍,--gateway 引數設定閘道 IP。
  3. Docker 主機會根據指定的閘道 IP 自動組態相關路由。

將容器連線到自定義網路

在啟動容器時,可使用 --network 選項將其連線到指定的自定義網路。

程式碼範例:連線容器至自定義網路

docker run --network=frontend --name nginx_container nginx

內容解密:

  1. 使用 docker run 命令啟動新的容器。
  2. --network=frontend 指定容器連線到名為 frontend 的自定義網路。
  3. --name nginx_container 為容器指定名稱,方便後續管理。

動態變更執行中容器的網路

使用自定義橋接網路的一大優勢是,可以在不停止容器的情況下變更其所屬網路。

程式碼範例:變更執行中容器的網路

docker network connect backend nginx_container
docker network disconnect frontend nginx_container

內容解密:

  1. docker network connect 命令將執行中的容器連線到新的網路。
  2. docker network disconnect 命令將容器從原有網路斷開。
  3. 這種動態變更能力提高了應用的靈活性和可用性。

Docker 網路管理與應用

在 Docker 中,網路管理是一項重要的功能。Docker 提供了多種網路選項,讓使用者可以根據需求選擇適合的網路組態。

使用自定義橋接網路

Docker 允許使用者建立自定義橋接網路,以滿足特定的網路需求。使用者可以使用 docker network create 命令建立新的網路。

切換執行中容器的網路

若要變更執行中容器的網路,可以使用 docker network connectdocker network disconnect 命令,分別用於新增和移除網路。

新增網路到容器

docker network connect backend frontend

此命令將名為 backend 的網路新增到名為 frontend 的容器。

從容器移除網路

docker network disconnect frontend frontend

此命令將名為 frontend 的網路從名為 frontend 的容器中移除。

內容解密:

  1. docker network connect 命令的作用:將指定的網路連線到指定的容器,使容器能夠與該網路中的其他容器進行通訊。
  2. docker network disconnect 命令的作用:將指定的網路從指定的容器中斷開,使容器不再與該網路中的其他容器進行通訊。
  3. 使用多個網路的優點:一個容器可以連線到多個網路,以滿足不同的網路需求,例如需要支援巨型訊框(jumbo frames)的網路和標準網路連線。

移除網路

若不再需要某個自定義網路,可以使用 docker network rm 命令刪除它。

docker network rm frontend

內容解密:

  1. docker network rm 命令的作用:刪除指定的網路。
  2. 刪除多個網路的方法:使用 docker network prune 命令刪除所有未使用的網路。

在無網路的情況下執行容器

若要測試可能包含惡意軟體的容器,可以在啟動容器時使用 --network=none 選項,使其不連線到任何網路。

docker run --network=none myimage

內容解密:

  1. --network=none 選項的作用:使容器在啟動時不連線到任何網路,以避免對外部網路造成風險。
  2. 斷開執行中容器的網路連線:使用 docker network disconnect 命令斷開容器的網路連線,以限制其對外部的影響。

暴露容器的服務

在 Docker 中,可以透過兩種方式暴露容器的服務:使用主機網路選項或在橋接網路上暴露埠。

使用主機網路選項

使用主機網路選項時,容器直接執行在主機網路上,無需進行埠對映。

docker run --net=host mynginx

內容解密:

  1. --net=host 選項的作用:使容器直接執行在主機網路上,繞過 Docker 的網路堆疊。
  2. 無需暴露埠:由於容器直接執行在主機網路上,因此無需進行埠對映或暴露埠。
  3. 驗證容器是否執行:使用 docker ps 命令檢視容器的執行狀態。
  4. 檢視埠使用情況:使用 netstat 命令檢視主機上的埠使用情況,以確認容器的服務是否正常執行。

圖表說明

圖表翻譯: 此圖表展示了使用主機網路選項啟動容器的流程。容器直接執行在主機網路上,無需進行埠對映,並可透過 netstat 命令檢視埠使用情況。

Docker 網路基礎:深入理解容器網路組態

Docker 的網路功能是其強大的特性之一,讓容器之間的通訊變得簡單高效。本章節將探討 Docker 網路的基本概念,特別是在容器連線埠(port)的暴露與使用不同網路模式之間的差異。

使用主機網路模式(Host Network)

在主機網路模式下,容器直接使用主機的網路堆積疊(network stack),這意味著容器不會獲得自己的獨立網路名稱空間(network namespace)。這樣,容器內的服務可以直接繫結到主機的連線埠上,而無需額外的連線埠對映組態。

主機網路模式範例

sudo docker run --net=host -d bitnami/nginx:latest

內容解密:

  • --net=host 引數指定容器使用主機的網路模式。
  • -d 引數讓容器在背景執行。
  • bitnami/nginx:latest 是要執行的 Docker 映像檔名稱。

在主機網路模式下,由於容器直接分享主機的網路介面,因此無需額外組態即可讓外部存取容器內的服務。然而,這也意味著如果多個容器嘗試繫結到同一個連線埠,將會發生衝突。

暴露連線埠使用橋接網路(Bridge Network)

相較於主機網路模式,使用橋接網路模式時需要明確指定要暴露的連線埠。這種方式提供了更好的隔離性和靈活性,允許多個容器執行在同一個主機上而不會發生連線埠衝突。

暴露連線埠範例

docker run -p 8080:8080 -p 8443:8443 -d bitnami/nginx:latest

內容解密:

  • -p 8080:8080 將主機的 8080 連線埠對映到容器的 8080 連線埠。
  • -p 8443:8443 將主機的 8443 連線埠對映到容器的 8443 連線埠。
  • -d 引數讓容器在背景執行。

這種方式允許開發者控制哪些連線埠對外部開放,並且可以避免連線埠衝突的問題。當需要執行多個相同的服務時,可以透過對映到不同的主機連線埠來解決衝突。

多容器連線埠對映範例

如果需要執行另一個 NGINX 容器,可以透過改變主機端的連線埠來避免衝突:

docker run -p 8081:8080 -p 8444:8443 --name nginx2 -d bitnami/nginx:latest

內容解密:

  • 這裡將主機的 8081 連線埠對映到第二個容器的 8080 連線埠。
  • 同樣地,將主機的 8444 連線埠對映到第二個容器的 8443 連線埠。

Docker 網路模式比較

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Docker 網路連線與隔離容器實務

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

圖表翻譯: 此圖示比較了 Docker 的主機網路模式和橋接網路模式。主機網路模式下,容器直接使用主機的網路堆積疊,無需額外的連線埠對映,但可能導致連線埠衝突。橋接網路模式需要明確指定連線埠對映,提供更好的隔離性和靈活性,有效避免了連線埠衝突的問題。

深入理解 Docker 網路架構

Docker 網路功能提供了多種網路模式,讓容器之間的通訊變得更加靈活。在本章中,我們將探討 Docker 的不同網路型別,並瞭解如何有效地使用它們。

Docker 網路型別解析

Docker 提供了多種網路模式,包括預設的 bridge 網路、客製化的 bridge 網路、host 網路和 none 網路。每種網路模式都有其特定的使用場景和優缺點。

預設 Bridge 網路

Docker 預設會為容器建立一個 bridge 網路,讓容器之間可以互相通訊。然而,預設的 bridge 網路存在一些限制,例如無法自定義子網和無法對容器進行精細的網路控制。

客製化 Bridge 網路

客製化的 bridge 網路允許使用者自定義子網和閘道器,提供更好的網路控制和安全性。建立客製化 bridge 網路的命令如下:

docker network create --driver bridge my_bridge_network

Host 網路

host 網路模式下,容器直接使用主機的網路名稱空間,這意味著容器不會獲得自己的 IP 地址,而是直接使用主機的 IP 地址。這種模式適用於需要最大網路效能的應用程式。

None 網路

none 網路模式下,容器沒有任何網路介面,完全與外界隔離。這種模式適用於需要高度安全的應用程式,例如分析惡意軟體。

連線埠對映與衝突解決

在 Docker 中,連線埠對映是將容器的連線埠對映到主機的連線埠上。例如,將容器的 80 連線埠對映到主機的 8080 連線埠上,可以使用以下命令:

docker run -p 8080:80 -d nginx

如果主機上的 8080 連線埠已經被佔用,可以使用不同的主機連線埠,例如 8081:

docker run -p 8081:80 -d nginx

Socket 與連線埠

Socket 是由 IP 地址和連線埠號碼組成的,例如 192.168.100.10:80。在 Docker 中,每個容器都有自己的網路名稱空間,因此可以擁有相同的連線埠號碼而不會發生衝突。

常見問題與解答

  1. 由於 Docker 建立了預設的 bridge 網路,因此沒有必要建立客製化的 bridge 網路。 答案:B. False

  2. 下列哪個是 socket 的範例? 答案:C. 192.168.100.10:80

  3. 如何在主機上啟動一個名為 nginx-web 的容器,並將其 8080 連線埠對映到主機的連線埠上,而主機的 8080 連線埠已經被其他容器佔用? 答案:C. docker run -p 8081:8080 -d nginx-web bitnami/nginx

  4. 您懷疑某個映像檔可能包含惡意軟體,需要安全地執行它來檢查其內容。哪個 Docker 命令可以減輕網路風險? 答案:D. docker run --network=none -it badimage bash

  5. 一旦容器連線到客製化的 bridge 網路,就無法更改其連線的網路。 答案:B. False

  6. 容器可以暴露的最高 IP 連線埠號碼是多少? 答案:B. 65535