如何通過代理將 Docker 容器日誌推送至 CloudWatch 日誌?

2 分的閱讀內容
0

我想通過代理將我的 Docker 容器日誌發佈到 Amazon CloudWatch。

簡短描述

當您將 Docker 容器日誌推送到 CloudWatch 時,您可以使用代理。此步驟會在 Docker 執行個體和網際網路繫結流量之間新增一層額外的安全性。

解決方法

首先,請務必針對您的特定使用案例設定您的基本 Docker 基礎架構。

在此範例中,基礎架構包括:

  • 作為 Docker 容器執行個體的私有子網路的一部分的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。
  • 作為代理執行個體的公有子網路一部分的 Amazon EC2 執行個體。
  • 安裝在私有子網路中 Amazon EC2 執行個體頂部的 Docker 守護程式。此常駐程式已設定為允許所有容器任務將其標準輸出日誌推送至 CloudWatch。
  • Amazon Linux 2 的操作系統 (OS)。

此外,請確定您的 AWS 身分識別與存取管理 (IAM) 角色具有 CloudWatchAgentAdminPolicyCloudWatchAgentServerPolicy 或與您的私有執行個體相關聯的類似政策。此政策必須允許您建立日誌群組、建立日誌串流,以及進行 PutLogEvents 呼叫。

準備您的 Docker 執行個體

1.    設定 Linux 環境變數,將來自 Docker 容器執行個體的所有流量路由到您的 Proxy 執行個體。在下列範例中,IP 位址適用於做為代理執行個體的 EC2 執行個體:

$ export https_proxy=http://192.0.2.86:8888/
$ export http_proxy=http://192.0.2.86:8888/
$ export no_proxy=localhost,169.254.169.254

**注意:**這些變數是 no_proxy 組態的最低需求。請務必包含您不希望用戶端透過 Proxy 存取的任何其他目標 IP 位址。

2.    將 Docker 容器安裝到您的 Docker 執行個體中。請參閱以下範例:

$ sudo yum update -y
$ sudo yum install docker -y
$ sudo docker version

3.    將您的 Docker 執行個體更新至最新版本。

4.    使用下列命令啟動 Docker 常駐程式:

sudo systemctl start docker

5.    若要允許 Docker 在沒有 sudo 權限的情況下執行,請執行下列命令:

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world

6.    若要驗證您的 Docker 安裝,請檢閱輸出。請確定您看到類似下列內容的安裝驗證訊息:

"Hello From Docker!"
"This message shows that your installation appears to be working correctly."

將您的代理設定添加到 Docker

對於在 Linux 初始化中安裝 Docker 引擎的組態(包括 Amazon Linux、RHEL 6 或 CentOS 6 發行版):

1.    使用您偏好的編輯器開啟設定檔案 /etc/sysconfig/docker

2.    將您的代理設定添加到檔案中。使用公用或代理執行個體的私有 IP 位址。請參閱以下範例:

# Setup proxy
export http_proxy="http://192.0.2.86:8888/"
export https_proxy="http://192.0.2.86:8888/"
export no_proxy="/var/run/docker.sock,localaddress,localhost,169.254.169.254"

**注意:**這些是 no_proxy 組態的最低需求。請務必包含您不希望用戶端透過 Proxy 存取的任何其他目標 IP 位址。

3.    儲存您的組態檔案。

4.    重新啟動 Docker 服務:

$ sudo service docker restart

對於在 Linux 系統管理常駐程式中安裝 Docker 引擎的組態 (包括 Amazon Linux 2 和 RHEL 7 發行版本):

1.    建立 Docker 服務的 systemd 目錄。請參閱以下範例:

$ sudo mkdir -p /etc/systemd/system/docker.service.d

2.    根據您的組態,建立 HTTP 或 HTTPS 代理檔案。請參閱以下範例:

$ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.0.2.86:8888/" "NO_PROXY=localhost,127.0.0.1,169.254.169.254"
$ vim /etc/systemd/system/docker.service.d/https-proxy.conf
[Service]
Environment="HTTPS_PROXY=http://192.0.2.86:8888/" "NO_PROXY=localhost,127.0.0.1,169.254.169.254"

**注意:**這些是 no_proxy 組態的最低需求。請務必包含您不希望用戶端透過 Proxy 存取的任何其他目標 IP 位址。

3.    要刷新您的變更,請使用以下命令:

$ sudo systemctl daemon-reload

4.    要重新啟動 Docker,請使用以下命令:

$ sudo systemctl restart docker

5.    驗證您的新組態:

$ systemctl show --property=Environment docker

6.    檢閱輸出:

Environment="HTTPS_PROXY=http://192.0.2.86:8888/" "NO_PROXY=localhost,127.0.0.1,169.254.169.254"

測試您的 Docker 日誌是否已推送至 CloudWatch

1.    在 Docker 中運行 nginx 映像。

2.    使用 Docker awslogs 日誌驅動程式,將任務的標準輸出日誌推送到 CloudWatch 日誌。請參閱以下範例:

$ sudo docker run -d --name nginx --log-driver=awslogs --log-opt awslogs-region=eu-west-1 --log-opt awslogs-group=DockerLogGroupWithProxy --log-opt awslogs-create-group=true -p 8112:80 nginx

3.    使用 curl 為您的第一個 Docker 任務生成日誌。請參閱以下範例:

curl localhost:8112

4.    在 CloudWatch 主控台中檢視傳送到日誌群組的資料

5.    驗證 Docker 任務的日誌事件已推送至 CloudWatch 日誌群組。例如,尋找類似下列內容的日誌事件:

198.51.100.100 - - [19/Sep/2018:10:13:38 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.53.1" "-"

相關資訊

監控容器執行個體

建立用於 Amazon ECS 的容器映像

AWS 官方
AWS 官方已更新 2 年前