我的 NAS 常用容器记录:图床、OpenList、BBR 与 Emby

最近整理了一下 NAS 上常用的几个容器,顺手把它们的 Docker Compose 配置记录下来,方便以后重装、迁移或者排查问题时查阅。
这篇主要记录五个服务:图床、OpenList、绿联云上的 BBR 切换容器、Emby-Toolkit,以及 Emby 本体。
文中的 NAS 路径、数据库密码、Docker 网关地址和用户权限均已脱敏或改成占位符。下面的配置更适合作为公开分享和迁移时的模板,直接使用前需要按自己的环境修改。
1. 初春图床

这是我目前使用的图床服务,容器内部监听 8080,通过 NAS 的 12000 端口对外提供访问。
services: oneimg: image: onexru/oneimg-oneimg container_name: oneimg ports: - "12000:8080" volumes: - ./data:/app/data - /path/to/image-uploads:/app/uploads dns: - 223.5.5.5 - 119.29.29.29 sysctls: net.ipv6.conf.all.disable_ipv6: "1" restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3"这里需要注意的是,/path/to/image-uploads 只是脱敏后的示例路径,需要换成 NAS 上实际用于保存图片的目录。图片数据和配置最好放在稳定、定期备份的位置。
2. OpenList

OpenList 主要用来统一管理和访问各种存储服务。我的配置比较简单,只映射数据目录,并把 Web 服务暴露在 5244 端口。
services: openlist: image: openlistteam/openlist:latest container_name: openlist user: "${PUID:-1000}:${PGID:-1000}" volumes: - ./data:/opt/openlist/data ports: - "5244:5244" environment: - UMASK=022 restart: unless-stopped原配置使用的是 0:0,也就是 root 用户运行。为了公开分享时更稳妥,我在示例中改成了可通过环境变量调整的普通用户 UID/GID。如果遇到目录权限问题,可以先确认宿主机目录的所有者,再设置对应的 PUID 和 PGID。
3. 在绿联云上切换 BBR
这个容器的用途比较单一:启动时检查当前 TCP 拥塞控制算法,在 cubic 和 bbr 之间切换,然后退出。
services: bbr: image: alpine:latest privileged: true network_mode: host environment: - TZ=Asia/Shanghai command: - sh - -c - | apk update && apk add tzdata cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "Asia/Shanghai" > /etc/timezone CURRENT_CC=$$(sysctl -n net.ipv4.tcp_congestion_control) echo "======================" echo "当前拥塞控制算法: $$CURRENT_CC, 准备切换" if [ "$$CURRENT_CC" = "bbr" ]; then sysctl -w net.core.default_qdisc=pfifo_fast sysctl -w net.ipv4.tcp_congestion_control=cubic else sysctl -w net.core.default_qdisc=fq sysctl -w net.ipv4.tcp_congestion_control=bbr fi echo "最新拥塞控制算法:" sysctl net.core.default_qdisc sysctl net.ipv4.tcp_congestion_control date -R restart: "no"这个配置需要 privileged: true 才能修改宿主机的内核参数,同时使用了 network_mode: host。这两个设置权限都比较高,建议只在自己完全掌控的 NAS 上使用,并确认当前系统和内核确实支持 BBR。
另外,Compose 中的 $$ 不能随意改成单个 $,因为需要避免变量先被 Docker Compose 解释,而是交给容器里的 shell 处理。
4. Emby-Toolkit

Emby-Toolkit 是我用来辅助管理 Emby 的工具。它包含一个 Web 控制台和一个 PostgreSQL 数据库,工具服务会等待数据库健康检查通过后再启动。
services: emby-toolkit: image: hbq0405/emby-toolkit:latest container_name: emby-toolkit network_mode: bridge ports: - "5257:5257" # Web 控制台 - "8097:8097" # 反向代理/虚拟库端口 volumes: - /path/to/emby-toolkit:/config - /path/to/ETK_Media:/ETK_Media - /var/run/docker.sock:/var/run/docker.sock environment: - APP_DATA_DIR=/config - TZ=Asia/Shanghai - PUID=${PUID:-1000} - PGID=${PGID:-1000} - UMASK=022 - DB_HOST=${DOCKER_GATEWAY_IP} - DB_PORT=${DOCKER_GATEWAY_PORT:-5435} - DB_USER=app_user - DB_PASSWORD=${EMBY_TOOLKIT_DB_PASSWORD} - DB_NAME=app_db - CONTAINER_NAME=emby-toolkit - DOCKER_IMAGE_NAME=hbq0405/emby-toolkit:latest restart: unless-stopped depends_on: db: condition: service_healthy
db: image: postgres:18 container_name: emby-toolkit-db restart: unless-stopped network_mode: bridge volumes: - postgres_data:/var/lib/postgresql environment: - POSTGRES_USER=app_user - POSTGRES_PASSWORD=${EMBY_TOOLKIT_DB_PASSWORD} - POSTGRES_DB=app_db ports: - "5435:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U app_user -d app_db"] interval: 10s timeout: 5s retries: 5
volumes: postgres_data:数据库密码不要直接写进公开文章或提交到 Git。可以在 Compose 文件旁边创建一个不提交的 .env 文件:
EMBY_TOOLKIT_DB_PASSWORD=请替换为随机生成的强密码DOCKER_GATEWAY_IP=请替换为实际的 Docker 网关地址这里的 /path/to/emby-toolkit 和 /path/to/ETK_Media 也需要改成自己的 NAS 路径。另一个需要特别注意的地方是:挂载 /var/run/docker.sock 后,容器基本拥有管理宿主机 Docker 的能力,只有确认镜像来源可信时才建议这样配置。
5. Emby

最后是 Emby 本体。这里保留我目前使用的非官方镜像写法,配置文件和媒体库路径都需要按自己的目录修改。
services: emby: image: amilys/embyserver:latest container_name: emby restart: on-failure environment: - UID=${PUID:-1000} - GID=${PGID:-1000} - GIDLIST=${GIDLIST:-100} volumes: - /path/to/emby/config:/config - /path/to/ETK_Media:/ETK_Media ports: - "8096:8096" - "8920:8920" devices: - /dev/dri:/dev/dri/dev/dri 通常用于硬件转码。如果 NAS 没有对应设备,或者暂时不需要硬件转码,可以去掉 devices 配置。这个镜像不是 Emby 官方镜像,实际使用时还需要自行评估镜像来源、更新情况、版权和安全风险。
脱敏和安全检查清单
这次整理时,我把下面几类内容从公开配置中隐藏或泛化了:
- NAS 的真实存储路径,改成了
/path/to/...。 - 数据库密码,改成了
${EMBY_TOOLKIT_DB_PASSWORD}。 - Docker 内部网关地址,改成了
${DOCKER_GATEWAY_IP}。 - root 身份运行的 UID/GID,示例改成了可配置的普通用户 UID/GID。
而下面这些内容虽然不是密码,但依然值得重点检查:
privileged: true:容器拥有较高的宿主机权限。network_mode: host:容器直接使用宿主机网络。/var/run/docker.sock:通常意味着容器可以控制宿主机 Docker。latest标签:镜像更新不可控,升级前最好先确认变更并做好备份。- 对外暴露的端口:如果不需要公网访问,建议只在内网开放,或者通过反向代理和访问控制保护。
这篇先作为我的 NAS 配置备忘录。以后如果迁移设备,只要把路径、权限、网关地址和 .env 里的密码重新替换好,基本就能继续使用。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!














