我希望通过代理将 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" "-"
相关信息
将 CloudWatch Logs 用于容器实例
Amazon ECS 的 Docker 基本知识