Docker Registry + Docker Compose+ Docker labels (docktail.*)+ Tailscale Services+ Tailscale Funnel通过Docker标签自动把容器暴露为Tailscale服务/HTTPS/TCP/Funnel,无需发布端口。
DockTail读取容器标签自动注册Tailscale服务,直接代理到容器网络IP,免去端口发布和独立设备配额。
方案简介
DockTail 是一套把 Docker 容器自动暴露为 Tailscale Services 的轻量化方案。它通过读取容器上的 docktail.* 标签,由单一代理容器把请求直接转发到 Docker 网络中的容器 IP,因此应用容器默认无需在 Docker 上发布端口,也不会占用独立的 Tailscale 设备配额。方案同时支持 HTTP、HTTPS、TCP、TLS 终止的 TCP,以及 Tailscale 自动证书和 Tailscale Funnel 公网暴露。
它适合以下场景:
- 已在 Tailscale tailnet 内运行自托管应用,希望按服务名访问容器;
- 不想为每个容器单独注册 Tailscale 节点或编写 Compose 模板;
- 需要在同一容器上挂载多个 Tailscale 服务,或把内部服务通过 Funnel 临时开放到公网;
- 多台机器统一管理,希望复用同一套标签驱动的服务暴露流程。
亮点与能力
- 基于 Docker 标签的自动发现:通过
docktail.*标签声明要暴露的服务,无需修改 Compose 网络结构。 - OAuth 或 API Key 自动创建 Tailscale Services:支持自动凭证注册,免去手工在控制台添加服务。
- 多协议支持:HTTP、HTTPS、TCP 以及 TLS 终止的 TCP 均可一键启用。
- PROXY 协议支持:TCP 服务可选择开启 PROXY protocol,让后端看到 tailnet 客户端真实 IP。
- Tailscale HTTPS 自动证书:由 Tailscale 颁发并续期证书。
- Tailscale Funnel 公网暴露:支持 HTTP(S) Funnel,可挂载到指定路径或端口。
- 多服务同容器:单个容器可以暴露多个 Tailscale 服务。
- 自动调和与无状态:容器重启或 IP 变更时自动重新对账,运行时无本地状态。
实施步骤
1. 准备 Tailscale 宿主机
确保 Docker 宿主机已登录 Tailscale 并被允许在 tailnet 上 advertise services。
2. 编写 Docker Compose
按 README Quick Start 模板启动 DockTail,并把 Docker socket 与 Tailscale socket 挂载进去。材料原文:
services:
docktail:
image: ghcr.io/marvinvr/docktail:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/run/tailscale:/var/run/tailscale
environment:
# Optional but recommended. Enables automatic service creation.
- TAILSCALE_OAUTH_CLIENT_ID=${TAILSCALE_OAUTH_CLIENT_ID}
- TAILSCALE_OAUTH_CLIENT_SECRET=${TAILSCALE_OAUTH_CLIENT_SECRET}
myapp:
image: nginx:latest
# No ports needed. DockTail proxies directly to the container IP.
labels:
- "docktail.service.enable=true"
- "docktail.service.name=myapp"
- "docktail.service.port=80"
如使用 Docker secrets 等挂载的密钥文件,改为设置 FILE__TAILSCALE_OAUTH_CLIENT_ID / FILE__TAILSCALE_OAUTH_CLIENT_SECRET,或 TAILSCALE_OAUTH_CLIENT_ID_FILE / TAILSCALE_OAUTH_CLIENT_SECRET_FILE 为文件路径。
3. 启动栈
在仓库根目录执行:
docker compose up -d
4. 验证服务可达
在同 tailnet 的设备上访问:
curl http://myapp.your-tailnet.ts.net
优缺点
- ✓ 不占用Tailscale设备槽位
- ✓ 标签驱动,零配置即自动发现
- ✕ 依赖宿主机已接入Tailscale网络
出处
本方案挖掘自开源项目 marvinvr/docktail,方案内容与实施命令均来自其 README 原文。
本方案由真实开源项目挖掘整理,实施命令均来自其 README 原文,安装使用请遵循项目开源协议。