配置 Docker socket 例外和高级设置

订阅: 企业版
适用对象: 管理员

本页向您展示如何配置 Docker socket 例外和增强容器隔离 (ECI) 的其他高级设置。这些配置使 Testcontainers 等受信任工具能够与 ECI 配合使用,同时保持安全性。

Docker socket 挂载权限

默认情况下,增强容器隔离会阻止容器挂载 Docker socket,以防止恶意访问 Docker Engine。但是,某些工具需要 Docker socket 访问权限。

需要 Docker socket 访问权限的常见场景包括:

  • 测试框架:Testcontainers,用于管理测试容器
  • 构建工具:Paketo buildpacks,用于创建临时构建容器
  • CI/CD 工具:作为部署流水线一部分管理容器的工具
  • 开发实用工具:用于容器管理的 Docker CLI 容器

配置 socket 例外

使用设置管理配置 Docker socket 例外

  1. 登录 Docker Home 并选择您的组织。
  2. 前往 **管理员控制台** > **桌面设置管理**。
  3. 创建或编辑设置策略.
  4. 找到 **增强容器隔离** 设置。
  5. 使用您受信任的镜像和命令限制配置 **Docker socket 访问控制**。

创建 admin-settings.json 文件并添加

{
  "configurationFileVersion": 2,
  "enhancedContainerIsolation": {
    "locked": true,
    "value": true,
    "dockerSocketMount": {
      "imageList": {
        "images": [
          "docker.io/localstack/localstack:*",
          "docker.io/testcontainers/ryuk:*",
          "docker:cli"
        ],
        "allowDerivedImages": true
      },
      "commandList": {
        "type": "deny",
        "commands": ["push", "build"]
      }
    }
  }
}

镜像允许列表配置

imageList 定义了哪些容器镜像可以挂载 Docker socket。

镜像引用格式

格式描述
<image_name>[:<tag>]镜像名称,带可选标签。如果省略标签,则使用 :latest 标签。如果标签是通配符 *,则表示“该镜像的任何标签”。
<image_name>@<digest>镜像名称,带特定仓库摘要(例如,由 docker buildx imagetools inspect <image> 报告)。这意味着只允许名称和摘要匹配的镜像。

配置示例

用于测试工具的基本允许列表

"imageList": {
  "images": [
    "docker.io/testcontainers/ryuk:*",
    "docker:cli",
    "alpine:latest"
  ]
}

通配符允许列表 (Docker Desktop 4.36 及更高版本)

"imageList": {
  "images": ["*"]
}
警告

使用 "*" 允许所有容器挂载 Docker socket,这会降低安全性。仅在无法明确列出允许镜像时才使用此选项。

安全验证

Docker Desktop 通过以下方式验证允许的镜像:

  1. 从注册表下载允许镜像的镜像摘要
  2. 容器启动时将容器镜像摘要与允许列表进行比较
  3. 阻止摘要与允许镜像不匹配的容器

这可以防止通过重新标记未经授权的镜像来绕过限制

$ docker tag malicious-image docker:cli
$ docker run -v /var/run/docker.sock:/var/run/docker.sock docker:cli
# This fails because the digest doesn't match the real docker:cli image

派生镜像支持

对于像 Paketo buildpacks 这样创建临时本地镜像的工具,您可以允许从受信任的基础镜像派生的镜像。

启用派生镜像

"imageList": {
  "images": [
    "paketobuildpacks/builder:base"
  ],
  "allowDerivedImages": true
}

allowDerivedImages 为 true 时,从允许的基础镜像(在 Dockerfile 中使用 FROM)构建的本地镜像也获得 Docker socket 访问权限。

派生镜像要求

  • 仅限本地镜像:派生镜像不得存在于远程注册表中
  • 基础镜像可用:必须先在本地拉取父镜像
  • 性能影响:验证会使容器启动时间增加最多 1 秒
  • 版本兼容性:完整的通配符支持需要 Docker Desktop 4.36+

命令限制

阻止指定命令,同时允许所有其他命令

"commandList": {
  "type": "deny",
  "commands": ["push", "build", "image*"]
}

允许列表

只允许指定命令,同时阻止所有其他命令

"commandList": {
  "type": "allow",
  "commands": ["ps", "container*", "volume*"]
}

命令通配符

通配符阻止/允许
"container\*"所有 "docker container ..." 命令
"image\*"所有 "docker image ..." 命令
"volume\*"所有 "docker volume ..." 命令
"network\*"所有 "docker network ..." 命令
"build\*"所有 "docker build ..." 命令
"system\*"所有 "docker system ..." 命令

命令阻塞示例

当执行被阻止的命令时

/ # docker push myimage
Error response from daemon: enhanced container isolation: docker command "/v1.43/images/myimage/push?tag=latest" is blocked; if you wish to allow it, configure the docker socket command list in the Docker Desktop settings.

常见配置示例

Testcontainers 设置

用于 Java/Python 测试与 Testcontainers

"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker.io/testcontainers/ryuk:*",
      "testcontainers/*:*"
    ]
  },
  "commandList": {
    "type": "deny",
    "commands": ["push", "build"]
  }
}

CI/CD 流水线工具

用于受控的 CI/CD 容器管理

"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker:cli",
      "your-registry.com/ci-tools/*:*"
    ]
  },
  "commandList": {
    "type": "allow",
    "commands": ["ps", "container*", "image*"]
  }
}

开发环境

用于本地开发与 Docker-in-Docker

"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker:dind",
      "docker:cli"
    ]
  },
  "commandList": {
    "type": "deny",
    "commands": ["system*"]
  }
}

安全建议

镜像允许列表最佳实践

  • 保持限制性:只允许您绝对信任和需要的镜像
  • 谨慎使用通配符:标签通配符 (*) 方便但不如特定标签安全
  • 定期审查:定期审查和更新您的允许列表
  • 摘要锁定:在关键环境中,使用摘要引用以获得最大安全性

命令限制

  • 默认拒绝:从拒绝列表开始,阻止 pushbuild 等危险命令
  • 最小权限原则:只允许您的工具实际需要的命令
  • 监控使用情况:跟踪哪些命令被阻止以优化您的配置

监控和维护

  • 定期验证:在 Docker Desktop 更新后测试您的配置,因为镜像摘要可能会更改。
  • 处理摘要不匹配:如果允许的镜像意外被阻止
    $ docker image rm <image>
    $ docker pull <image>
    

这解决了上游镜像更新时摘要不匹配的问题。

后续步骤

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.