使用 Envoy Docker 映像
注意
Envoy OCI 映像是使用 Docker 建置的,並已在以 Docker 執行的大規模部署中經過廣泛測試。使用其他容器技術(例如 Podman)可能可以正常運作,但尚未經過廣泛測試,並且未明確支援。
以下範例使用官方 Envoy OCI 映像。
已知這些指示適用於 x86_64
和 arm64
架構。
使用 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 已設定為監聽埠 9901
和 10000
,您現在可以使用以下命令在 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,這表示在使用 docker
或 podman
驅動程式時,在任務的 config
區塊中設定 readonly_rootfs = true
。
以非 root 使用者身分在容器中執行 Envoy 的權限
依預設,Envoy OCI 映像將以 root 使用者身分啟動,但會在 Docker ENTRYPOINT
中切換到建置時建立的 envoy
使用者。
或者,您可以啟動容器並指定 Docker user
。
在此情況下,容器不會嘗試捨棄權限,但您仍然需要確保在容器內執行的使用者具有任何必要的權限,如下所述。
變更容器內 envoy
使用者的 uid
和/或 gid
envoy
使用者的預設 uid
和 gid
為 101
。
可以使用 ENVOY_UID
和 ENVOY_GID
環境變數在執行階段設定此使用者的 uid
和 gid
。
例如,可以在 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