Share feedback
Answers are generated based on the documentation.

气隙容器

Subscription: Business
For: Administrators

气隙容器允许您通过控制容器可以发送和接收数据的位置来限制容器网络访问。此功能将自定义代理规则应用于容器网络流量,有助于保护容器不应具有无限制互联网访问权限的环境。

Docker Desktop 可以配置容器网络流量以接受连接、拒绝连接或通过 HTTP 或 SOCKS 代理进行隧道传输。您可以控制策略应用于哪些 TCP 端口,以及是通过代理自动配置 (PAC) 文件使用单个代理还是每目标策略。

谁应该使用气隙容器?

在以下情况下使用气隙容器:

  • 您的组织要求容器仅与已批准的内部服务通信
  • 您需要满足要求网络隔离的合规标准(例如 SOC 2、ISO 27001 或 PCI DSS)
  • 您希望防止容器在构建时或运行时泄露数据或访问未批准的外部端点

气隙容器如何工作

containersProxy 管理两条不同的流量路径:

  • 镜像拉取(始终强制执行):Docker Desktop 在 VM 启动时在 daemon.json 中将 http.docker.internal:3128 硬连线为守护进程的代理,因此所有 docker pull 和 Compose 拉取操作始终通过 containersProxy 进行,包括任何 PAC 文件规则。
  • 运行中的容器出站流量(可选):Docker Desktop 拦截容器 TCP 连接,并仅对 transparentPorts 中列出的端口应用代理规则。若未配置,运行中的容器流量会完全绕过 containersProxy
Important

如果您在 containersProxy 下配置了 PAC 文件,该 PAC 文件必须返回适当的代理服务器以连接到托管您镜像的注册表。

其他注意事项:

  • 如果 PAC 文件下载失败,容器将阻止对目标 URL 的请求
  • 端口 80 和 443 可用主机名,但其他端口仅可用 IP 地址

先决条件

在配置气隙容器之前,您必须具有:

  • 启用了 强制登录以确保用户使用您的组织进行身份验证
  • Docker Business 订阅
  • 使用 admin-settings.json 文件配置了 设置管理以管理组织策略

配置气隙容器

将容器代理添加到您的 admin-settings.json 文件。例如:

{
  "configurationFileVersion": 2,
  "containersProxy": {
    "locked": true,
    "mode": "manual",
    "http": "",
    "https": "",
    "exclude": [],
    "pac": "http://192.168.1.16:62039/proxy.pac",
    "transparentPorts": "*"
  }
}

配置参数

containersProxy 设置控制应用于 docker image pull 以及(在配置了 transparentPorts 时)运行中容器出站流量的网络策略:

参数 描述
locked 防止开发人员覆盖设置 true (锁定), false (默认)
mode 代理配置方法 system (使用系统代理), manual (自定义)
http HTTP 代理服务器 URL (例如 "http://proxy.company.com:8080")
https HTTPS 代理服务器 URL (例如 "https://proxy.company.com:8080")
exclude 对这些地址绕过代理 主机名/IP 数组
pac 代理自动配置文件 URL PAC 文件 URL
transparentPorts 受代理规则约束的端口 逗号分隔的端口或通配符 ("*")

配置示例

阻止所有外部访问:

"containersProxy": {
  "locked": true,
  "mode": "manual",
  "http": "",
  "https": "",
  "exclude": [],
  "transparentPorts": "*"
}

允许特定内部服务:

"containersProxy": {
  "locked": true,
  "mode": "manual",
  "http": "",
  "https": "",
  "exclude": ["internal.company.com", "10.0.0.0/8"],
  "transparentPorts": "80,443"
}

通过企业代理路由:

"containersProxy": {
  "locked": true,
  "mode": "manual",
  "http": "http://corporate-proxy.company.com:8080",
  "https": "http://corporate-proxy.company.com:8080",
  "exclude": ["localhost", "*.company.local"],
  "transparentPorts": "*"
}

代理自动配置 (PAC) 文件

PAC 文件通过为不同目标定义规则,提供对容器网络访问的细粒度控制。

基本 PAC 文件结构

function FindProxyForURL(url, host) {
	if (localHostOrDomainIs(host, 'internal.corp')) {
		return "PROXY 10.0.0.1:3128";
	}
	if (isInNet(host, "192.168.0.0", "255.255.255.0")) {
	    return "DIRECT";
	}
    return "PROXY reject.docker.internal:1234";
}

一般注意事项

  • FindProxyForURL 函数 URL 参数格式为 http://host_or_ip:porthttps://host_or_ip:port

  • 如果您有一个内部容器试图访问 https://docs.docker.com/enterprise/security/hardened-desktop/air-gapped-containers,Docker 代理服务将向 FindProxyForURL 提交 docs.docker.com 作为 host 值,https://docs.docker.com:443 作为 url 值,如果您在 PAC 文件中使用 shExpMatch 函数如下:

    if(shExpMatch(url, "https://docs.docker.com:443/enterprise/security/*")) return "DIRECT";
    

    shExpMatch 函数将失败,而应使用:

    if (host == docs.docker.com && url.indexOf(":443") > 0) return "DIRECT";
    

PAC 文件返回值

返回值 操作
PROXY host:port 通过指定主机和端口的 HTTP 代理路由
SOCKS5 host:port 通过指定主机和端口的 SOCKS5 代理路由
DIRECT 允许直接连接而不使用代理
PROXY reject.docker.internal:any_port 完全阻止请求

高级 PAC 文件示例

function FindProxyForURL(url, host) {
  // 允许访问 Docker Hub 以获取批准的基准镜像
  if (dnsDomainIs(host, ".docker.io") || host === "docker.io") {
    return "PROXY corporate-proxy.company.com:8080";
  }

  // 允许内部包仓库
  if (localHostOrDomainIs(host, 'nexus.company.com') ||
      localHostOrDomainIs(host, 'artifactory.company.com')) {
    return "DIRECT";
  }

  // 允许特定端口上的开发工具
  if (url.indexOf(":3000") > 0 || url.indexOf(":8080") > 0) {
    if (isInNet(host, "10.0.0.0", "255.0.0.0")) {
      return "DIRECT";
    }
  }

  // 阻止访问开发人员的 localhost
  if (host === "host.docker.internal" || host === "localhost") {
    return "PROXY reject.docker.internal:1234";
  }

  // 阻止所有其他外部访问
  return "PROXY reject.docker.internal:1234";
}

验证气隙容器配置

应用配置后,测试容器网络限制是否正常工作:

测试阻止的访问:

$ docker run --rm alpine wget -O- https://www.google.com
# 应根据您的代理规则失败或超时

测试允许的访问:

$ docker run --rm alpine wget -O- https://internal.company.com
# 如果 internal.company.com 在您的排除列表或 PAC 规则中,则应成功

测试代理路由:

$ docker run --rm alpine wget -O- https://docker.io
# 如果通过批准的代理路由,则应成功

安全考虑

  • 网络策略执行:气隙容器在 Docker Desktop 级别工作。高级用户可能通过各种方式绕过限制,因此对于高安全环境,请考虑额外的网络级控制。
  • 开发工作流影响:过于严格的策略可能会破坏合法的开发工作流。彻底测试并为必要的服务提供明确的例外。
  • PAC 文件管理:在可靠的基础设施上托管 PAC 文件。PAC 下载失败会导致容器网络访问被阻止。
  • 性能考虑:具有许多规则的复杂 PAC 文件可能会影响容器网络性能。保持规则简单高效。

下一步