Linux 容器实例的 HTTP 代理配置 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Linux 容器实例的 HTTP 代理配置

您可以将 Amazon ECS 容器实例配置为对 Amazon ECS 容器代理和 Docker 守护程序使用 HTTP 代理。如果您的容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络,则这非常有用。

要将 Amazon ECS Linux 容器实例配置为使用 HTTP 代理,请在启动时在相关文件中设置以下变量(利用 Amazon EC2 用户数据)。您也可以手动编辑配置文件并重新启动代理。

/etc/ecs/ecs.config(Amazon Linux 2 和 Amazon Linux AMI)
HTTP_PROXY=10.0.0.131:3128

将此值设置为某个 HTTP 代理的主机名(或 IP 地址)和端口号,供 Amazon ECS 代理用来连接到互联网。例如,在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。

NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock

将此值设置为 169.254.169.254,169.254.170.2,/var/run/docker.sock 可筛选 EC2 实例元数据、任务的 IAM 角色以及来自代理的 Docker 守护程序流量。

/etc/systemd/system/ecs.service.d/http-proxy.conf(仅 Amazon Linux 2)
Environment="HTTP_PROXY=10.0.0.131:3128/"

将此值设置为某个 HTTP 代理的主机名 (或 IP 地址) 和端口号,供 ecs-init 代理用来连接到互联网。例如,在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。

Environment="NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock"

将此值设置为 169.254.169.254,169.254.170.2,/var/run/docker.sock 可筛选 EC2 实例元数据、任务的 IAM 角色以及来自代理的 Docker 守护程序流量。

/etc/init/ecs.override (仅限 Amazon Linux AMI)
env HTTP_PROXY=10.0.0.131:3128

将此值设置为某个 HTTP 代理的主机名 (或 IP 地址) 和端口号,供 ecs-init 代理用来连接到互联网。例如,在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。

env NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock

将此值设置为 169.254.169.254,169.254.170.2,/var/run/docker.sock 可筛选 EC2 实例元数据、任务的 IAM 角色以及来自代理的 Docker 守护程序流量。

/etc/systemd/system/docker.service.d/http-proxy.conf(仅 Amazon Linux 2)
Environment="HTTP_PROXY=http://10.0.0.131:3128"

将此值设置为某个 HTTP 代理的主机名 (或 IP 地址) 和端口号,供 Docker 守护程序用来连接到互联网。例如,在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。

Environment="NO_PROXY=169.254.169.254"

将此值设置为 169.254.169.254 可筛选来自代理的 EC2 实例元数据。

/etc/sysconfig/docker(仅限 Amazon Linux AMI 和 Amazon Linux 2)
export HTTP_PROXY=http://10.0.0.131:3128

将此值设置为某个 HTTP 代理的主机名 (或 IP 地址) 和端口号,供 Docker 守护程序用来连接到互联网。例如,在容器实例无法通过 Amazon VPC互联网网关、NAT 网关或实例访问外部网络时。

export NO_PROXY=169.254.169.254,169.254.170.2

将此值设置为 169.254.169.254 可筛选来自代理的 EC2 实例元数据。

在以上文件中设置这些环境变量仅影响 Amazon ECS 容器代理、ecs-init 和 Docker 守护程序。它们不配置任何其他服务(如 yum)使用代理。

例 Amazon LinuxHTTP 代理用户数据脚本

下面的示例用户数据 cloud-boothook 脚本将 Amazon ECS 容器代理、ecs-init、Docker 守护程序和 yum为使用您指定的 HTTP 代理。您还可以指定容器实例在其中自行进行注册的集群。

要在启动容器实例时使用此脚本,请执行启动 Amazon ECS Linux 容器实例步骤 7中的步骤。然后,将下面的 cloud-boothook 脚本复制并粘贴到 User data 字段中 (请务必将红色示例值替换为您自己的代理和集群信息)。

注意

以下用户数据脚本仅支持经 Amazon ECS 优化的 AMI 的 Amazon Linux 2 和 Amazon Linux AMI 变体。

#cloud-boothook # Configure Yum, the Docker daemon, and the ECS agent to use an HTTP proxy # Specify proxy host, port number, and ECS cluster name to use PROXY_HOST=10.0.0.131 PROXY_PORT=3128 CLUSTER_NAME=proxy-test if grep -q 'Amazon Linux release 2' /etc/system-release ; then OS=AL2 echo "Setting OS to Amazon Linux 2" elif grep -q 'Amazon Linux AMI' /etc/system-release ; then OS=ALAMI echo "Setting OS to Amazon Linux AMI" else echo "This user data script only supports Amazon Linux 2 and Amazon Linux AMI." fi # Set Yum HTTP proxy if [ ! -f /var/lib/cloud/instance/sem/config_yum_http_proxy ]; then echo "proxy=http://$PROXY_HOST:$PROXY_PORT" >> /etc/yum.conf echo "$$: $(date +%s.%N | cut -b1-13)" > /var/lib/cloud/instance/sem/config_yum_http_proxy fi # Set Docker HTTP proxy (different methods for Amazon Linux 2 and Amazon Linux AMI) # Amazon Linux 2 if [ $OS == "AL2" ] && [ ! -f /var/lib/cloud/instance/sem/config_docker_http_proxy ]; then mkdir /etc/systemd/system/docker.service.d cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=http://$PROXY_HOST:$PROXY_PORT/" Environment="HTTPS_PROXY=https://$PROXY_HOST:$PROXY_PORT/" Environment="NO_PROXY=169.254.169.254,169.254.170.2" EOF systemctl daemon-reload if [ "$(systemctl is-active docker)" == "active" ] then systemctl restart docker fi echo "$$: $(date +%s.%N | cut -b1-13)" > /var/lib/cloud/instance/sem/config_docker_http_proxy fi # Amazon Linux AMI if [ $OS == "ALAMI" ] && [ ! -f /var/lib/cloud/instance/sem/config_docker_http_proxy ]; then echo "export HTTP_PROXY=http://$PROXY_HOST:$PROXY_PORT/" >> /etc/sysconfig/docker echo "export HTTPS_PROXY=https://$PROXY_HOST:$PROXY_PORT/" >> /etc/sysconfig/docker echo "export NO_PROXY=169.254.169.254,169.254.170.2" >> /etc/sysconfig/docker echo "$$: $(date +%s.%N | cut -b1-13)" > /var/lib/cloud/instance/sem/config_docker_http_proxy fi # Set ECS agent HTTP proxy if [ ! -f /var/lib/cloud/instance/sem/config_ecs-agent_http_proxy ]; then cat <<EOF > /etc/ecs/ecs.config ECS_CLUSTER=$CLUSTER_NAME HTTP_PROXY=$PROXY_HOST:$PROXY_PORT NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock EOF echo "$$: $(date +%s.%N | cut -b1-13)" > /var/lib/cloud/instance/sem/config_ecs-agent_http_proxy fi # Set ecs-init HTTP proxy (different methods for Amazon Linux 2 and Amazon Linux AMI) # Amazon Linux 2 if [ $OS == "AL2" ] && [ ! -f /var/lib/cloud/instance/sem/config_ecs-init_http_proxy ]; then mkdir /etc/systemd/system/ecs.service.d cat <<EOF > /etc/systemd/system/ecs.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=$PROXY_HOST:$PROXY_PORT/" Environment="NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock" EOF systemctl daemon-reload if [ "$(systemctl is-active ecs)" == "active" ]; then systemctl restart ecs fi echo "$$: $(date +%s.%N | cut -b1-13)" > /var/lib/cloud/instance/sem/config_ecs-init_http_proxy fi # Amazon Linux AMI if [ $OS == "ALAMI" ] && [ ! -f /var/lib/cloud/instance/sem/config_ecs-init_http_proxy ]; then cat <<EOF > /etc/init/ecs.override env HTTP_PROXY=$PROXY_HOST:$PROXY_PORT env NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock EOF echo "$$: $(date +%s.%N | cut -b1-13)" > /var/lib/cloud/instance/sem/config_ecs-init_http_proxy fi