如何通过代理将 Docker 容器日志推送到 CloudWatch Logs?

上次更新时间:2020 年 10 月 28 日

我希望通过代理将 Docker 容器日志发布到 Amazon CloudWatch。我该如何操作?

简短描述

将 Docker 容器日志推送到 CloudWatch 时可以使用代理。此步骤在​ Docker 实例和互联网流量之间添加了一个额外的安全层。

解决方案

在开始之前,请确保设置了您的特定使用案例所需的基本 ​Docker 基础设施。

在此示例中,基础设施包括:

  • 属于私有子网的一部分的 Amazon Elastic Compute Cloud (Amazon EC2) 实例,它充当 Docker 容器实例。
  • 属于公有子网的一部分的 Amazon EC2 实例,它充当代理实例。
  • 安装在私有子网中的 Amazon EC2 实例之上的 Docker 守护程序。​此守护程序配置为允许所有容器任务将其标准输出日志推送到 CloudWatch。
  • 作为操作系统 (OS) 的 Amazon Linux 2。

准备您的 Docker 实例

1.     设置 ​Linux 环境变量以将所有流量从 Docker 容器实例路由到您的代理实例。例如:

$ 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 配置的最低要求。请确保包括您不希望客户端通过代理转到的任何其他目标 IP 地址。​

2.     将 Docker 容器安装到您的 Docker 实例中。例如:

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

3.    将您的 Docker 实例更新至最新版本。

4.     验证您的 Docker 安装:

$ docker run hello-world

5.     检查输出。请确保您收到安装验证消息,类似以下内容:

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

将您的代理配置添加到 Docker

对于 Docker 引擎安装在 Linux init(包括 Amazon Linux、RHEL 6 或 CentOS 6 分发版)中的配置:

1.     使用您的首选编辑器打开配置文件 /etc/sysconfig/docker

2.     将您的代理配置添加到此文件。例如:

# 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 配置的最低要求。请确保包括您不希望客户端通过代理转到的任何其他目标 IP 地址。​

3.     保存您的配置文件。

4.     重启 Docker 服务:

$ sudo service docker restart

对于 Docker 引擎安装在 Linux systemd 系统管理守护程序(包括 Amazon Linux 2 和 RHEL 7 分发版)中的配置:

1.     为 Docker 服务创建 systemd 目录。例如:

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

2.     根据您的配置创建 HTTP 或 HTTPS 代理文件。例如:

$ 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 配置的最低要求。请确保包括您不希望客户端通过代理转到的任何其他目标 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 Logs。例如:

$ 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" "-"

这篇文章对您有帮助吗?


您是否需要账单或技术支持?