Docker 的網路組態與容器監控是建構和維護容器化應用程式不可或缺的環節。本文從實務角度出發,探討 Docker 網路組態的各個導向,包含埠暴露與對映、自定義網路的建立與管理,以及容器連結機制。同時,也涵蓋了容器監控的重要議題,介紹 cAdvisor、Dive 和 Falco 等工具的應用,以協助開發者和維運人員有效監控容器的效能和安全性。透過理解這些技術,可以更有效地管理容器化應用程式,確保其穩定性和安全性。

Docker 網路組態與管理深度解析

在現代化的軟體開發與佈署過程中,Docker 已經成為不可或缺的工具之一。其輕量級的容器化技術不僅簡化了應用程式的佈署流程,更提供了靈活的網路組態方案。本文將探討 Docker 的網路組態與管理,涵蓋埠暴露、網路建立與管理等重要主題。

埠暴露與對映

在 Docker 中,埠暴露是實作容器與外界通訊的關鍵步驟。當建立一個容器時,可以透過 --expose 引數來指定容器內部需要暴露的埠。例如:

$ docker run -itd --expose 80 --expose 443 --name my_container

上述命令建立了一個名為 my_container 的容器,並暴露了 80 和 443 埠。然而,這些埠目前僅在容器內部暴露,若要從外部存取,還需要進行埠對映。

埠對映實作

Docker 提供了 -p--publish 引數來實作埠對映,將容器內部的埠對映到主機的特定埠。例如,將容器內的 8080 埠對映到主機的 8080 埠:

$ docker run -d -p 8080:8080 tomcat

自動分配埠

除了手動指定埠對映外,Docker 也支援自動分配埠的功能,使用 -P 引數即可實作:

$ docker run -d -P tomcat

此命令會自動將容器內部需要暴露的埠對映到主機的隨機可用埠上。

內容解密:

  1. 埠暴露:透過 --expose 引數指定需要暴露的埠,這些埠僅在容器內部生效。
  2. 埠對映:使用 -p 引數將容器內部的埠對映到主機的特定埠,實作外部存取。
  3. 自動分配埠:使用 -P 引數自動將需要暴露的埠對映到主機的隨機埠。

Docker 網路管理

Docker 提供了靈活的網路管理功能,允許使用者建立和管理自定義網路,以滿足不同的應用需求。

Docker 網路命令

以下是一些常用的 Docker 網路管理命令:

  • docker network inspect:檢視特定網路的詳細組態資訊。
  • docker network ls:列出 Docker 中所有已建立的網路。
  • docker network create:建立新的 Docker 網路。
  • docker network rm:刪除指定的 Docker 網路。

建立自定義網路

Docker 允許使用者建立自定義網路,以實作容器間的隔離或互通。例如,建立一個名為 dmz 的橋接網路,並指定子網為 10.10.1.0/24

$ docker network create --subnet 10.10.1.0/24 dmz

將容器連線到自定義網路

建立好自定義網路後,可以透過 --network 引數將容器連線到該網路:

$ docker run -d --name blog_mysql --network dmz mysql

對於已經執行的容器,也可以使用 docker network connect 命令將其連線到指定的網路:

$ docker network connect dmz existing_container

內容解密:

  1. docker network create:用於建立新的 Docker 網路,可以指定網路型別和子網等引數。
  2. --network 引數:在建立容器時指定需要連線的網路。
  3. docker network connect:將已經執行的容器連線到指定的網路。

網路組態範例與驗證

以下是一個完整的範例,展示瞭如何建立自定義網路並將多個容器連線到該網路,以實作容器間的通訊。

首先,建立一個名為 my-network 的自定義網路:

$ docker network create my-network

接著,分別啟動一個根據 Elasticsearch 映象的容器和一個根據 Ubuntu 映象的容器,並將它們連線到 my-network 網路:

$ docker run -d --net=my-network --name elasticSearch elasticsearch
$ docker run -it --net=my-network --name ubuntu ubuntu:14.04 bash

進入 Ubuntu 容器後,可以透過 ping 命令驗證與 Elasticsearch 容器的連通性:

$ docker exec -it ubuntu bash
$ ping elasticSearch

圖表翻譯:

此圖示呈現了容器間透過自定義網路進行通訊的流程。首先,建立自定義網路 my-network。接著,分別啟動 Elasticsearch 和 Ubuntu 容器,並將它們連線到 my-network。最後,透過 ping 命令驗證容器間的連通性。

  graph LR;
    A[建立 my-network] --> B[啟動 elasticSearch 容器];
    A --> C[啟動 ubuntu 容器];
    B --> D[連線至 my-network];
    C --> D;
    D --> E[驗證連通性];

圖表翻譯: 此圖示詳細展示了建立自定義網路並將多個容器連線到該網路的過程,以及如何驗證容器間的連通性。

Docker容器互聯技術詳解

在現代軟體開發與佈署過程中,Docker容器技術已成為不可或缺的重要工具。當多個容器需要協同工作時,容器間的通訊變得至關重要。本文將探討Docker的容器互聯技術,包括自定義網路和容器連結機制。

自定義Docker網路

Docker允許使用者建立自定義網路,以實作容器間的安全通訊。透過建立自定義網路,開發者可以將相關的容器加入同一網路,從而實作容器間的直接通訊。

建立自定義網路

要建立自定義網路,可以使用以下命令:

$ docker network create my_network

建立網路後,可以在啟動容器時透過--network引數將其加入該網路:

$ docker run -d --name elasticSearch --network my_network elasticsearch:2.2
$ docker run -it --name ubuntu --network my_network ubuntu:14.04 bash

驗證容器連通性

將容器加入同一網路後,可以驗證它們之間的連通性。首先,檢查elasticSearch容器的連線狀態:

$ curl http://elasticSearch:9200

內容解密:

此命令用於檢查elasticSearch服務是否正常執行,並驗證ubuntu容器是否能夠與elasticSearch容器通訊。http://elasticSearch:9200中的elasticSearch是容器的名稱,Docker DNS會將其解析為對應的IP地址。

進入elasticSearch容器,測試與ubuntu容器的連線:

$ docker exec -it elasticSearch bash
root@8c7c805209c2:/usr/share/elasticsearch# ping ubuntu

內容解密:

此步驟展示瞭如何從elasticSearch容器內部ping通ubuntu容器,驗證雙向連通性。由於兩者位於同一自定義網路,因此可以直接透過容器名稱進行通訊。

容器連結機制

除了自定義網路,Docker還提供了容器連結(linking)機制,允許在不建立自定義網路的情況下實作容器間的通訊。

使用–link引數連結容器

連結機制允許一個容器(源容器)與另一個容器(目標容器)建立安全連線,而無需暴露埠到主機。建立連結時,Docker會在目標容器的/etc/hosts檔案中新增源容器的IP對映,並設定環境變數。

建立elasticSearch容器:

$ docker run -d --name elasticSearch elasticsearch:2.2

建立ubuntu容器並連結到elasticSearch:

$ docker run -it --name ubuntu --link elasticSearch:elasticSearch ubuntu:14.04 bash

內容解密:

在上述命令中,--link elasticSearch:elasticSearch引數建立了ubuntu容器到elasticSearch容器的單向連結。elasticSearch:elasticSearch表示將源容器elasticSearch的網路資訊對映到ubuntu容器的/etc/hosts檔案中,並設定相關環境變數。

驗證連結效果

進入ubuntu容器,檢查/etc/hosts檔案:

root@a05699ed73ab:/# cat /etc/hosts

內容解密:

此步驟展示了ubuntu容器的/etc/hosts檔案中包含了elasticSearch容器的IP對映,使得ubuntu可以直接透過elasticSearch主機名存取elasticSearch服務。

檢查環境變數:

root@a05699ed73ab:/# set | grep -i elasticSearch

內容解密:

Docker在ubuntu容器中設定了多個與elasticSearch相關的環境變數,例如ELASTICSEARCH_PORTELASTICSEARCH_PORT_9200_TCP等,這些變數包含了elasticSearch容器的連線資訊。

應使用案例項:Wordpress與MySQL的連結

以下範例展示瞭如何使用連結機制佈署Wordpress與MySQL:

$ docker run --name wp-mysql -e MYSQL_ROOT_PASSWORD=yoursecretpassword -d mysql
$ docker run --name wordpress --link wp-mysql:mysql -p 10003:80 -d wordpress

內容解密:

第一條命令啟動了一個名為wp-mysql的MySQL容器,並設定了環境變數MYSQL_ROOT_PASSWORD。第二條命令啟動了Wordpress容器,並透過--link wp-mysql:mysql引數將其連結到MySQL容器,同時將主機的10003埠對映到容器的80埠。

存取http://localhost:10003即可看到Wordpress的設定介面。

安全考量

雖然連結機制提供了便利的容器間通訊方式,但也帶來了一些安全隱憂。例如,目標容器可以存取源容器的環境變數和網路資訊。因此,在生產環境中使用時需要謹慎評估安全風險。

MermaidDocker容器互聯架構圖

  graph LR
    subgraph Docker Host
        subgraph My Network
            elasticSearch[elasticSearch Container]
            ubuntu[ubuntu Container]
        end
        subgraph Default Network
            wp-mysql[MySQL Container]
            wordpress[Wordpress Container]
        end
    end
    ubuntu -->|link|> elasticSearch
    wordpress -->|link|> wp-mysql

圖表翻譯: 此圖表展示了Docker主機上的兩種不同網路架構。上半部分展示了自定義網路(My Network),其中包含elasticSearch和ubuntu兩個容器。下半部分展示了預設網路下的Wordpress和MySQL容器的連結關係。箭頭表示單向連結關係,從客戶端指向伺服器端。

綜上所述,Docker的容器互聯技術為現代微服務架構提供了強大的支援。無論是透過自定義網路還是連結機制,開發者都可以實作安全、靈活的容器間通訊。在實際應用中,應根據具體需求和安全考量選擇適當的方案,以充分發揮Docker的優勢。隨著技術的不斷進步,未來Docker在企業級應用中的角色將更加重要。

Docker 容器監控

本章節將介紹一些可用於 Docker 容器監控的開源工具,例如 cAdvisor、Dive 和 Sysdig Falco。當在生產環境中執行 Docker 時,考量如何衡量容器的效能是一個重要的課題。定義一個全面的策略來監控 Docker 基礎設施,對於事件、統計資料、組態和記錄的原生收集,以及提供 CPU、記憶體和網路容器的效能檢視至關重要。

結構

  • 容器統計資料、指標和事件
  • 使用 cAdvisor 進行效能監控
  • 使用 Dive 進行效能監控
  • 使用 Sysdig Falco 進行容器監控

目標

  • 瞭解如何從 Docker 容器取得統計資料、指標和事件
  • 瞭解 cAdvisor 作為效能監控工具的使用
  • 瞭解 Dive 作為效能監控工具的使用
  • 瞭解 Sysdig Falco 作為容器監控工具的使用

容器統計資料、指標和事件

有多種方式可以控制 Docker 容器的執行。可以檢視日誌、觀察容器的事件和統計資料,包括記憶體使用率和 CPU 等級。讓我們看看當我們想要檢視執行容器時記錄的日誌時,Docker 提供了什麼。

日誌管理

大多數應用程式將日誌傳送到標準輸出。如果容器在前台執行,可以直接在控制檯中看到日誌。然而,當在背景模式下執行容器時,只有容器識別碼(ID)會顯示在控制檯上。

日誌管理是安全領域中最重要的任務之一,因為它允許監控容器內部發生的事情。不同的容器將在同一台 Docker 主機上同時執行,每個容器都可以產生自己的日誌;因此,日誌的集中管理是必要的。

有多個命令可用於監控日誌:

$ docker logs
$ docker service logs

在這種情況下,Docker 引擎將執行中的容器的所有標準輸出收集到一個日誌檔案中。我們可以使用以下命令檢視容器的執行日誌:

$ docker logs -f

下圖顯示了 docker logs 命令的選項:

圖 10.1:Docker logs 命令選項

此命令的工作原理是,將傳送到容器中的標準輸出或錯誤輸出的日誌由 Docker 守護程式捕捉,並傳輸到可組態的後端,預設情況下為每個容器的 JSON 檔案。在這個例子中,我們可以看到一個 ngnix 容器的日誌輸出。

$ docker logs nginx
nginx stderr | 2019/11/09 00:34:56 [notice] 12#0: using the "epoll" ...
nginx stderr | 2019/11/09 00:34:56 [notice] 12#0: nginx/1.0.15
nginx stderr | 2019/11/09 00:34:56 [notice] 12#0: built by gcc 4.4.7 ...
nginx stderr | 2019/11/09 00:34:56 [notice] 12#0: OS: Linux 3.8.0-35-generic

支援此日誌的檔案預設位於 Docker 主機上的 /var/lib/docker/containers/ 路徑,其中 <container_id> 被替換為容器識別碼。這些檔案的格式類別似於每行由一個 JSON 物件表示。

圖 10.2:每個容器的日誌位置路徑

預設情況下,日誌儲存在位於 /var/lib/docker 路徑的 JSON 檔案中。這種行為可以更改,因為 Docker 使用註冊驅動程式的概念。透過使用不同的控制器,可以選擇另一種型別的日誌儲存。預設驅動程式是 JSON 檔案,它接受以下組態:

--log-opt max-size=[0-9+][k|m|g]
--log-opt max-file=[0-9+]

內容解密:

上述命令用於組態 Docker 的日誌驅動程式。其中,--log-opt max-size 用於設定日誌檔案的最大大小,而 --log-opt max-file 用於設定最大日誌檔案數量。當日誌檔案達到最大大小時,Docker 將自動旋轉日誌檔案。

使用 cAdvisor 進行效能監控

cAdvisor(Container Advisor)是一個用於監控容器資源使用和效能的開源工具。它提供了對 CPU、記憶體、網路和磁碟使用情況的即時資料收集和分析。

安裝 cAdvisor

可以使用以下命令安裝 cAdvisor:

$ docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

內容解密:

此命令用於啟動一個 cAdvisor 容器。它將主機的根目錄、/var/run 目錄、/sys 目錄和 Docker 資料目錄掛載到容器中,並將容器的 8080 連線埠對映到主機的 8080 連線埠。這樣,我們就可以透過存取 http://localhost:8080 來檢視 cAdvisor 的 Web 介面。

使用 Dive 進行效能監控

Dive 是一個用於分析和最佳化 Docker 映像的開源工具。它提供了對映像層的詳細分析,可以幫助開發人員減少映像大小和提高構建效率。

安裝 Dive

可以使用以下命令安裝 Dive:

$ docker run -it --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  wagoodman/dive:latest \
  <image_name>

內容解密:

此命令用於啟動一個 Dive 容器。它將主機的 Docker socket 掛載到容器中,並執行 Dive 對指定的 Docker 映像進行分析。

使用 Sysdig Falco 進行容器監控

Sysdig Falco 是一個開源的容器安全監控工具,它可以檢測和報警容器的異常行為。

安裝 Sysdig Falco

可以使用以下命令安裝 Sysdig Falco:

$ docker run -i -t --name falco \
  --privileged \
  -v /var/run/docker.sock:/host/var/run/docker.sock \
  -v /dev:/host/dev \
  -v /proc:/host/proc:ro \
  -v /boot:/host/boot:ro \
  -v /lib/modules:/host/lib/modules:ro \
  -v /usr:/host/usr:ro \
  falcosecurity/falco:latest

內容解密:

此命令用於啟動一個 Sysdig Falco 容器。它將主機的 Docker socket、/dev 目錄、/proc 目錄、/boot 目錄、/lib/modules 目錄和 /usr 目錄掛載到容器中,並以特權模式執行。這樣,Falco 就能夠監控主機和容器的系統呼叫。

本章節介紹了多種用於 Docker 容器監控的開源工具,包括 cAdvisor、Dive 和 Sysdig Falco。這些工具可以幫助開發人員和維運人員更好地理解和最佳化容器的效能和安全性。下一章節將介紹更多關於 Docker 安全性的主題。

圖表翻譯:

此圖示展示了Docker 日誌管理的基本概念。主要包括 Docker 日誌的產生、日誌儲存位置以及如何透過 docker logs 命令檢視日誌。此外,還簡要介紹瞭如何透過組態日誌驅動程式來改變日誌儲存方式,例如設定日誌檔案的最大大小和最大檔案數量。

  graph LR;
    A[應用程式] -->|標準輸出|> B[Docker 日誌];
    B --> C[JSON 日誌檔案];
    C --> D[/var/lib/docker/containers/];
    E[docker logs] -->|檢視日誌|> C;
    F[--log-opt max-size] -->|組態最大大小|> C;
    G[--log-opt max-file] -->|組態最大檔案數|> C;

圖表翻譯: 此圖表展示了Docker 日誌的基本流程,從應用程式輸出到最終的日誌儲存與管理。可以看到,日誌首先被Docker守護程式捕捉,然後儲存為JSON格式的日誌檔案,並且可以透過 docker logs 命令進行檢視。同時,可以透過 --log-opt 組態項來調整日誌的大小與數量。