气隙容器

要求: Docker Desktop 4.29.0 及更高版本

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

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

此页面提供了隔离容器的概述和配置步骤。

谁应该使用隔离容器?

隔离容器可帮助组织在受限环境中维护安全性

  • 安全开发环境:防止容器访问未经授权的外部服务
  • 合规性要求:满足需要网络隔离的监管标准
  • 数据丢失防护:阻止容器将敏感数据上传到外部服务
  • 供应链安全:控制容器在构建期间可以访问哪些外部资源
  • 企业网络策略:对容器化应用程序强制执行现有网络安全策略

隔离容器的工作原理

隔离容器通过拦截容器网络流量并应用代理规则来运行

  1. 流量拦截:Docker Desktop 拦截来自容器的所有出站网络连接
  2. 端口过滤:只有指定端口 (transparentPorts) 上的流量才受代理规则约束
  3. 规则评估:PAC 文件规则或静态代理设置决定如何处理每个连接
  4. 连接处理:根据规则,流量可以直接允许、通过代理路由或被阻止

一些重要考虑事项包括

  • 现有的 proxy 设置继续适用于主机上的 Docker Desktop 应用程序流量
  • 如果 PAC 文件下载失败,容器将阻止对目标 URL 的请求
  • URL 参数格式为 http://host_or_ip:porthttps://host_or_ip:port
  • 主机名适用于端口 80 和 443,但其他端口只适用于 IP 地址

先决条件

在配置隔离容器之前,您必须拥有

  • 启用 强制登录 以确保用户使用您的组织进行身份验证
  • Docker Business 订阅
  • 配置 设置管理 以管理组织策略
  • 下载 Docker Desktop 4.29 或更高版本

配置隔离容器

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

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

配置参数

containersProxy 设置控制应用于容器流量的网络策略

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

配置示例

阻止所有外部访问

"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";
}

PAC 文件返回值

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

高级 PAC 文件示例

function FindProxyForURL(url, host) {
  // Allow access to Docker Hub for approved base images
  if (dnsDomainIs(host, ".docker.io") || host === "docker.io") {
    return "PROXY corporate-proxy.company.com:8080";
  }

  // Allow internal package repositories
  if (localHostOrDomainIs(host, 'nexus.company.com') ||
      localHostOrDomainIs(host, 'artifactory.company.com')) {
    return "DIRECT";
  }

  // Allow development tools on specific ports
  if (url.indexOf(":3000") > 0 || url.indexOf(":8080") > 0) {
    if (isInNet(host, "10.0.0.0", "255.0.0.0")) {
      return "DIRECT";
    }
  }

  // Block access to developer's localhost
  if (host === "host.docker.internal" || host === "localhost") {
    return "PROXY reject.docker.internal:1234";
  }

  // Block all other external access
  return "PROXY reject.docker.internal:1234";
}

验证隔离容器配置

应用配置后,测试容器网络限制是否有效

测试被阻止的访问

$ docker run --rm alpine wget -O- https://www.google.com
# Should fail or timeout based on your proxy rules

测试允许的访问

$ docker run --rm alpine wget -O- https://internal.company.com
# Should succeed if internal.company.com is in your exclude list or PAC rules

测试代理路由

$ docker run --rm alpine wget -O- https://docker.io
# Should succeed if routed through approved proxy

安全考虑

  • 网络策略强制:隔离容器在 Docker Desktop 级别工作。高级用户可能会通过各种方式绕过限制,因此请考虑为高安全环境添加额外的网络级别控制。
  • 开发工作流程影响:过于严格的策略可能会破坏合法的开发工作流程。进行彻底测试并为必要的服务提供明确的例外。
  • PAC 文件管理:将 PAC 文件托管在可靠的内部基础设施上。PAC 下载失败会导致容器网络访问被阻止。
  • 性能考虑:包含许多规则的复杂 PAC 文件可能会影响容器网络性能。保持规则简单高效。
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.