socket 代理做什么
给 CI 或自动化收敛 Docker 权限:socket 代理只放行必要的 API 端点,默认拒绝写操作,避免把 /var/run/docker.sock 直接挂进容器。常见的实现按 API 分区提供开关,需要写操作的分区单独放行。
基本信息
| 目的 | 缩小 Docker API 的暴露面 |
|---|---|
| 机制 | 按 API 分区开关转发请求,写操作单独放行 |
| 部署 | 代理容器加有限的网络可达范围 |
| 需要避开的做法 | 把宿主 socket 直接挂进业务容器 |
| 核对 | 用只读查询验证放行范围符合预期 |
典型使用场景
- CI 运行器需要查询容器状态但不需要写操作
- 自动化脚本只用到部分 API,按分区收敛到最小集合
- 多团队共用构建机时按角色给出不同的 API 权限
- 审计现有流水线,找出直接挂宿主 socket 的位置并替换
- 临时给运维工具开放只读查询接口
代理与调用方示例
代理与调用方示例
services:
socket-proxy:
image: tecnativa/docker-socket-proxy
environment:
CONTAINERS: 1 # 允许容器查询
IMAGES: 1 # 允许镜像查询
POST: 0 # 拒绝所有写操作
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 127.0.0.1:2375:2375
runner:
image: ci/runner:3.1
environment:
DOCKER_HOST: tcp://socket-proxy:2375配置要点
| 要点 | 说明 | 风险 |
|---|---|---|
| 分区开关 | 按 API 类别放行 | 放行过多等于没有收敛 |
| 写操作开关 | 控制是否允许写 | 打开即放开对应写能力 |
| 监听地址 | 只绑定本机或专用网络 | 暴露到公网等于开放 API |
| socket 挂载 | 以只读方式挂载 | 读写挂载会放大影响面 |
代理是权限收敛手段而不是万能替身:放行哪些分区要按业务实际用到的 API 逐项验证,多余的分区一律不加。
代理端口只绑定本机或专用网络,发到公网等于重演 API 直接暴露的问题。
被代理方仍受放行分区约束,把写开关打开等于放开对应写操作,加开关时要评估影响面。
直接挂宿主 socket 的场景风险最高,等于把宿主守护进程的控制权交出去;能用代理就不要直挂,替换后要回归验证流水线。
代理镜像的配置结构会随维护情况变化,升级前先核对当前版本的环境变量命名,避免开关失效后回到默认行为。