配置 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 例外
- 登录 Docker Home 并选择您的组织。
- 前往 **管理员控制台** > **桌面设置管理**。
- 创建或编辑设置策略.
- 找到 **增强容器隔离** 设置。
- 使用您受信任的镜像和命令限制配置 **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 通过以下方式验证允许的镜像:
- 从注册表下载允许镜像的镜像摘要
- 容器启动时将容器镜像摘要与允许列表进行比较
- 阻止摘要与允许镜像不匹配的容器
这可以防止通过重新标记未经授权的镜像来绕过限制
$ 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*"]
}
}安全建议
镜像允许列表最佳实践
- 保持限制性:只允许您绝对信任和需要的镜像
- 谨慎使用通配符:标签通配符 (
*) 方便但不如特定标签安全 - 定期审查:定期审查和更新您的允许列表
- 摘要锁定:在关键环境中,使用摘要引用以获得最大安全性
命令限制
- 默认拒绝:从拒绝列表开始,阻止
push和build等危险命令 - 最小权限原则:只允许您的工具实际需要的命令
- 监控使用情况:跟踪哪些命令被阻止以优化您的配置
监控和维护
- 定期验证:在 Docker Desktop 更新后测试您的配置,因为镜像摘要可能会更改。
- 处理摘要不匹配:如果允许的镜像意外被阻止
$ docker image rm <image> $ docker pull <image>
这解决了上游镜像更新时摘要不匹配的问题。
后续步骤
- 查看 增强容器隔离限制。
- 查看 增强容器隔离常见问题。