Skip to content

Docker 部署导航面板:自动发现容器并生成可点击入口

如果目标是“自动发现 Docker 服务、读取宿主机发布端口,并生成可点击访问地址”,当前最贴合的选择是 Dockpeek。Homarr 更适合可视化看板、多用户权限和服务组件;Homepage 更适合用 Docker Labels 和配置文件维护导航。三者解决的问题有重叠,但自动解析端口的完成度不同。

本文按 2026-08-26 可读取的官方资料整理。示例配置只做静态说明,没有在本机启动这些面板;文中的验收命令是部署者执行后应观察的结果,不代表本机实测。

部署结论

项目本文采用的值
GitHub 地址dockpeek/dockpeek
官方镜像dockpeek/dockpeek:latest;镜像和 tag 以项目 README 为准,生产环境应固定已核验版本或摘要
正式部署Docker Compose,单容器导航面板
快速体验不提供独立 docker run 路径;本文重点是端口发现、链接生成和安全边界
对外端口宿主机 3420 → 容器 8000
持久化位置本文未声明持久化卷,按目标版本文档确认
验证范围官方资料和 Compose 配置静态审阅;未启动面板或访问真实 NAS
资料核对日期2026-08-26

本文选择 Dockpeek 作为部署示例,是因为它把容器发现、发布端口和公共主机名放在同一条配置路径中;latest 只用于跟随项目示例,长期运行前应重新核对版本和摘要。

1. 先理解“自动生成地址”

Docker 中有三个容易混淆的地址:

地址示例能否直接给浏览器访问
容器内部端口80/tcp通常不能,浏览器在宿主机或其他设备上无法直接使用
宿主机发布端口8080:80可以尝试访问 宿主机地址:8080
反向代理地址https://app.example.com通常是用户最终应该点击的地址

面板可以从 Docker API 读到容器和端口映射,但不一定知道用户希望使用哪个 IP、域名、HTTPS 证书或反向代理路径。因此,“读取 published port”与“推断最终 URL”是两个步骤:

  1. 读取 8080:80 这样的宿主机端口映射。
  2. 用配置的宿主机 IP/域名拼接地址;遇到反向代理时,用显式自定义链接覆盖自动结果。

这也是为什么有些面板能显示端口,却仍要求手动填写链接。

2. 面板能力对比

面板自动发现 Docker 容器自动读取发布端口并生成链接配置方式更适合
Dockpeek支持支持;可设置公共主机名,也可用 Labels 覆盖Web 界面 + 环境变量/Labels以 Docker 服务入口和端口导航为中心
Homarr支持 Docker 集成可显示容器和端口,但“Add to Homarr”仍需由管理员确认 Web 地址Web 拖拽配置多看板、组件、用户组和权限
Homepage支持 Docker 集成通常需要在 YAML 或 Labels 中声明 hrefYAML/Labels配置即代码、可进 Git、自动维护
Flame有 Docker 相关能力不作为自动端口解析首选,通常需要额外配置Web/Labels轻量书签首页
Portainer支持能查看端口,但主要是容器管理,不是导航首页Web 管理界面容器编排、日志和生命周期管理

Glance 更偏 RSS、天气和监控信息流,Dashy 更偏主题和布局定制,Heimdall 更偏传统书签入口。它们可以作为首页,但都不是“扫描 Docker published ports 并批量生成链接”的优先选择。

2.1 Dockpeek:最匹配端口自动化需求

Dockpeek 官方 README 将它定位为 Docker dashboard,提供容器 Web 入口、日志、端口监控、镜像更新检查和多主机管理。它会自动发现 Traefik Labels,并自动检测已发布端口;DOCKER_HOST_PUBLIC_HOSTNAME 用于生成可点击链接时指定宿主机 IP 或域名。

它还提供以下 Labels:

yaml
labels:
  - dockpeek.link=https://jellyfin.example.com
  - dockpeek.ports=8096,8920
  - dockpeek.https=8920
  - dockpeek.tags=media,production
  • 没有反向代理时,通常让 Dockpeek 根据发布端口生成地址。
  • 有反向代理时,用 dockpeek.link 指向最终域名。
  • 没有标准端口映射、使用 Host 网络或端口隐藏在代理后面时,用 dockpeek.ports 补充显示端口。

2.2 Homarr:功能丰富,但不是零配置端口导航

Homarr 的 Docker 集成支持查看容器、实时日志、CPU/内存列,以及启动、停止、重启和删除等操作。它可以批量选择容器并执行 Add to Homarr,但官方流程仍要求在弹窗中填写或确认这些容器的 Web 地址。

Homarr 的优势在于:

  • 多个 Board,可按影音、运维、家庭成员分组;
  • 拖拽布局和独立的移动端布局;
  • 本地账号、OIDC、LDAP、用户组和细粒度权限;
  • 大量服务集成和信息组件;
  • SQLite 实例支持整库备份与恢复。

所以它适合“导航 + 信息看板 + 权限管理”,但若第一要求是自动从端口生成链接,Dockpeek 更直接。

2.3 Homepage:自动发现依赖配置约定

Homepage 适合把导航配置写进 Git。它可以通过 Docker 集成读取容器状态,也可以用 Labels 声明名称、分组、图标和 href。这种方法可重复、可审查,但 URL 通常仍由使用者提供,并不是单纯读取 8080:80 后猜测最终域名。

当服务统一经过 Traefik、Caddy 或 Nginx Proxy Manager,并且每个服务都有固定域名时,Homepage 的配置即代码方式很有价值;当端口经常变化或服务数量动态增长时,维护链接的工作量会增加。

3. Dockpeek 部署

3.1 准备条件

  • 一台运行 Docker Engine 的 Linux/NAS 主机;
  • 已确认 Dockpeek 使用的端口没有被占用;
  • 明确访问者使用的宿主机 IP、局域网 DNS 名称或反向代理域名;
  • SECRET_KEY 和登录密码准备安全值,不把真实密钥写进公开文章或 Git。

3.2 Docker Compose

下面的配置采用官方 README 的端口和挂载方式,并把敏感值改成环境变量占位符:

yaml
services:
  dockpeek:
    image: dockpeek/dockpeek:latest
    container_name: dockpeek
    restart: unless-stopped
    ports:
      - "3420:8000"
    environment:
      SECRET_KEY: ${DOCKPEEK_SECRET_KEY}
      USERNAME: ${DOCKPEEK_USERNAME:-admin}
      PASSWORD: ${DOCKPEEK_PASSWORD}
      DOCKER_HOST_PUBLIC_HOSTNAME: ${DOCKER_HOST_PUBLIC_HOSTNAME}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

在同目录的 .env 中填入本机实际值,并限制文件权限:

dotenv
DOCKPEEK_SECRET_KEY=replace-with-a-random-secret
DOCKPEEK_USERNAME=admin
DOCKPEEK_PASSWORD=replace-with-a-strong-password
DOCKER_HOST_PUBLIC_HOSTNAME=192.168.1.100

启动:

bash
docker compose up -d
docker compose ps
docker compose logs --tail=100 dockpeek

浏览器打开 http://192.168.1.100:3420。成功条件是能登录,并看到 Docker 主机上的容器、发布端口和端口链接。

生产环境不应无条件跟随 latest 自动升级。先备份配置、固定经过验证的镜像标签或摘要,再手动更新并检查回滚路径。

4. 从容器到可点击链接的使用流程

第一步:检查容器是否真的发布了端口

bash
docker ps --format 'table {{.Names}}\t{{.Ports}}\t{{.Status}}'
docker port <container-name>

docker port 没有输出,说明没有标准的宿主机端口映射。此时面板无法凭空生成一个浏览器入口,需要给容器增加 ports、使用反向代理,或设置自定义链接。

第二步:确认自动生成的主机地址

如果面板显示的是 localhost、Docker 内部主机名或错误的局域网地址,设置 DOCKER_HOST_PUBLIC_HOSTNAME。这个值必须是“打开链接的客户端能够访问”的地址,不一定是 Dockpeek 容器自己能解析到的名字。

第三步:为反向代理服务设置覆盖链接

yaml
services:
  app:
    image: example/app:latest
    ports:
      - "8080:8080"
    labels:
      - dockpeek.link=https://app.example.com

这样做可以避免面板生成 http://宿主机:8080,而是直接打开用户真正使用的 HTTPS 域名。

第四步:验证链接的可达性

从实际使用面板的设备执行:

bash
curl -I http://192.168.1.100:8080

若使用 HTTPS 或反向代理,则检查最终域名:

bash
curl -I https://app.example.com

面板能显示端口不等于应用一定可访问。还要检查监听地址、防火墙、ACL、DNS、TLS 证书和反向代理规则。

5. Docker Socket 安全边界

Dockpeek、Homarr 的 Docker 管理功能都需要访问 Docker API。直接挂载 /var/run/docker.sock 的权限很高,恶意或被攻破的面板可能借此启动、停止、删除容器,甚至进一步影响宿主机。

建议按风险从低到高处理:

  1. 只在可信内网开放面板,并为面板设置强密码。
  2. 不需要容器控制时,不启用管理动作或不挂载 Socket。
  3. 使用 Docker Socket Proxy,只开放容器发现、状态和必要的端点。
  4. 需要启动/停止或更新容器时,再单独放行对应操作,并接受其安全代价。

Socket Proxy 可能导致部分 Dockpeek 管理功能不可用,这是权限限制的结果,不应为了“全功能”直接放开全部 Docker API。

6. 按需求选择

你的首要需求推荐原因
自动读取发布端口并点击跳转Dockpeek端口映射、公共主机名和自定义链接都是核心功能
统一域名、配置进 GitHomepageLabels/YAML 可审查、可复制、可版本化
拖拽看板、服务组件和多用户权限Homarr看板和权限模型比轻量导航更完整
只想要简单书签FlameHeimdall功能较少,维护成本低
影音/RSS/天气/监控混合首页GlanceHomarr信息组件比端口扫描更重要
同时管理容器生命周期PortainerDockpeek管理功能比纯导航面板更重要

一个实用的组合是:Dockpeek 负责自动发现 Docker 服务和端口,反向代理负责稳定域名,Homarr 或 Homepage 负责人工整理后的长期首页。如果不想维护两个入口,直接使用 Dockpeek;如果希望首页高度定制,则保留 Homarr/Homepage,并把 Dockpeek 当作动态服务清单。

7. 常见问题

看不到容器

检查 Socket 是否挂载、Dockpeek 是否运行在预期的 Docker 主机上,以及 Socket Proxy 是否放行了容器列表接口。多主机配置还要逐个确认 Docker API 地址和网络连通性。

能看到端口,但点击打不开

先在客户端执行 curl。重点检查端口是否只绑定到 127.0.0.1、防火墙是否放行、应用是否只监听容器内部地址,以及生成链接使用的 DOCKER_HOST_PUBLIC_HOSTNAME 是否正确。

应该打开域名,却生成了 IP 加端口

给容器添加 dockpeek.link,或在面板的服务配置中使用自定义地址。反向代理地址无法可靠地从普通 Docker 端口映射中推断出来。

一个容器有多个端口

Dockpeek 可以显示多个发布端口;但哪个端口是 Web 管理界面要由应用文档决定。必要时用 dockpeek.ports 补充端口,并用 dockpeek.link 指定唯一入口。

总结

这篇文章用 Docker Compose 部署 Dockpeek,并把“发现端口”和“生成最终可访问 URL”拆成两个可验证步骤。面板能读取 Docker Socket 不代表客户端一定能访问生成的地址,反向代理、监听地址和网络权限仍需在目标环境中验收。

8. 资料与验证边界

本文没有在真实 NAS、反向代理或多主机环境执行部署和恢复演练。Dockpeek 的自动 URL 是否可达,仍取决于宿主机绑定地址、客户端网络和反向代理配置;这些条件需要在目标环境中逐项验收。

全部公开文章由同一个站点构建和发布。