使用 Envoy Docker 映像

注意

Envoy OCI 映像是使用 Docker 建置的,並已在以 Docker 執行的大規模部署中經過廣泛測試。使用其他容器技術(例如 Podman)可能可以正常運作,但尚未經過廣泛測試,並且未明確支援。

以下範例使用官方 Envoy OCI 映像

已知這些指示適用於 x86_64arm64 架構。

使用 docker compose 執行 Envoy

如果您想使用 Envoy 和 docker compose,您可以使用磁碟區覆寫提供的組態檔案。

version: '3'
services:
  envoy:
    image: envoyproxy/envoy:dev-fcdc9d6d5a9da98fe30ad749201034770ff6b30e
    ports:
      - "10000:10000"
    volumes:
      - ./envoy.yaml:/etc/envoy/envoy.yaml

如果您使用此方法,則必須確保 envoy 使用者可以讀取掛載的檔案,方法是確保檔案的權限正確,或使其可供世界讀取,如下所述。

使用 Docker 建置並執行 Envoy 映像

建立簡單的 Dockerfile 以執行 Envoy。

如果您建立自訂的 envoy.yaml,您可以使用下列 Dockerfile 配方建立自己的 Docker 映像

FROM envoyproxy/envoy:dev-fcdc9d6d5a9da98fe30ad749201034770ff6b30e
COPY envoy.yaml /etc/envoy/envoy.yaml
RUN chmod go+r /etc/envoy/envoy.yaml

使用以下命令建置 Docker 映像

$ docker build -t envoy:v1 .

假設 Envoy 已設定為監聽埠 990110000,您現在可以使用以下命令在 Docker 中啟動它

$ docker run -d --name envoy -p 9901:9901 -p 10000:10000 envoy:v1

或在 Podman 中啟動(不支援)

$ podman run -d --name envoy -p 9901:9901 -p 10000:10000 envoy:v1

在容器中執行 Envoy 的根檔案系統權限

Envoy 容器映像可以使用以唯讀方式掛載的容器根檔案系統執行。例如,使用 Docker 和 Podman,您可以使用 run 命令的 --read-only 選項。

使用 Kubernetes,這表示將 podSpec.containers.securityContext.readOnlyFilesystem 設定為 true

使用 Nomad,這表示在使用 dockerpodman 驅動程式時,在任務的 config 區塊中設定 readonly_rootfs = true

以非 root 使用者身分在容器中執行 Envoy 的權限

依預設,Envoy OCI 映像將以 root 使用者身分啟動,但會在 Docker ENTRYPOINT 中切換到建置時建立的 envoy 使用者。

或者,您可以啟動容器並指定 Docker user

在此情況下,容器不會嘗試捨棄權限,但您仍然需要確保在容器內執行的使用者具有任何必要的權限,如下所述。

變更容器內 envoy 使用者的 uid 和/或 gid

envoy 使用者的預設 uidgid101

可以使用 ENVOY_UIDENVOY_GID 環境變數在執行階段設定此使用者的 uidgid

例如,可以在 Docker 命令列上執行此操作

$ docker run -d --name envoy -e ENVOY_UID=777 -e ENVOY_GID=777 envoyproxy/envoy:dev-fcdc9d6d5a9da98fe30ad749201034770ff6b30e

如果您希望限制或提供容器內 unix 通訊端的存取權限,或者為了控制從容器外部存取 Envoy 通訊端,這會很有用。

若要以 root 使用者身分在容器內執行程序,您可以將 ENVOY_UID 設定為 0,但這樣做可能會削弱執行中容器的安全性。

Envoy 容器內的記錄權限

依預設,envoy 映像會將應用程式記錄傳送到 /dev/stdout/dev/stderr,這些記錄可以在容器記錄中檢視。

如果您將應用程式、管理或存取記錄傳送到檔案輸出,則 envoy 使用者將需要寫入此檔案的必要權限。這可以透過設定 ENVOY_UID 和/或使檔案可供 envoy 使用者寫入來達成。

例如,若要從主機掛載記錄資料夾並使其可寫入,您可以

$ mkdir logs
$ chown 777 logs
$ docker run -d --name envoy -v $(pwd)/logs:/var/log -e ENVOY_UID=777 envoyproxy/envoy:dev-fcdc9d6d5a9da98fe30ad749201034770ff6b30e

然後,您可以將 envoy 設定為記錄到 /var/log 中的檔案

Envoy 容器內的組態和二進位檔案權限

envoy 使用者也需要有權限存取掛載到容器中的任何必要組態檔案。

組態中指定的任何二進位檔案也應該可供 envoy 使用者執行。

如果您在具有嚴格 umask 設定的環境中執行,您可能需要透過設定檔案的擁有權和/或權限來提供 envoy 的存取權限。

一種在不變更任何檔案權限的情況下執行此操作的方法是以主機使用者的 uid 啟動容器,例如

$ docker run -d --name envoy -v $(pwd)/envoy.yaml:/etc/envoy/envoy.yaml -e ENVOY_UID=$(id -u) envoyproxy/envoy:dev-fcdc9d6d5a9da98fe30ad749201034770ff6b30e

僅在 Envoy 容器內監聽 > 1024 的埠

基於 Unix 的系統會將開啟 well-known 埠(即埠號 < 1024)限制為 root 使用者。

如果您需要在 well-known 埠上監聽,可以使用 Docker 執行此操作。

例如,若要建立在埠 8000 上監聽的 Envoy 伺服器,並從埠 80 轉送

$ docker run -d --name envoy -p 80:8000 envoyproxy/envoy:dev-fcdc9d6d5a9da98fe30ad749201034770ff6b30e