自托管社区项目的数量正在持续增长,其中许多项目采用开源或公平代码许可证,帮助用户避免支付高昂的订阅费或按使用量计费的费用。
借助 Docker,你可以在标准 Web 服务器或本地工作站上,通过划分独立的资源环境,运行任意数量的自托管应用。借助 Docker Hub,你还能访问大量由社区维护的应用和项目,这些内容几乎不需要复杂配置就能正常运行。
本文将一步步带你了解如何在任意基于 Linux 的工作站或 VPS 服务器上自托管 Docker 应用,从安装 Docker Engine 到使用 Docker Compose 启动容器化应用。如果你还不确定这套方案能为你做什么,文章最后也会介绍一些常用的 Docker 应用供你参考。
什么是 Docker,为什么选择用它来自托管?
Docker 是一个开源平台,可将你的软件打包进独立的容器中运行。
容器,顾名思义,就是服务器或设备上被隔离出来的一块区域,其中包含某个应用所需的全部代码、库和配置。容器还拥有各自独立的资源分配,确保某个应用不会占用超出其预期的系统资源。
自托管应用往往依赖特定的"依赖项",例如数据库、编程语言、系统工具等。这也是为什么大多数自托管应用都推荐通过 Docker 安装——这样一个应用安装的依赖不会破坏另一个应用或服务的依赖。Docker 应用之间完全相互隔离,不会共享资源,也不会在运行时相互干扰。
你不需要深入掌握 Docker 的所有知识才能自托管应用,但了解一些基础概念会有帮助。简单来说:Docker Engine 是隔离应用的核心平台;镜像(Image)是用于安装应用或服务的项目库;Docker Hub 是一个公共镜像库,存放着大量可用 Docker 运行的应用;Docker Compose 是一个扩展工具,可以同时启动多个 Docker 容器,适用于较为复杂的应用。
什么是 Docker Compose,为什么需要它?
大多数应用并不简单到只用一个容器就能运行。它们通常包含前端组件、管理员后台,以及用于存储和检索数据的数据库。
如果每次需要重新运行应用时都要在 Linux 终端或 SSH 中逐一输入 docker run 来启动各个容器,操作会相当繁琐。为此,你可以创建一个 compose.yaml 文件,指定哪些容器和服务需要一起运行,这正是 Docker Compose 的用武之地。
创建好 compose.yaml 文件后,只需一条命令即可启动整个应用:
docker compose up
你也可以使用 docker compose stop 暂时暂停应用,或使用 docker compose down 完全停止并清除容器,以便进行下一次部署。
自托管 Docker 应用完整流程
了解了基础知识后,下面来逐步介绍如何使用 Docker Engine 和 Docker Compose 完成容器化应用的自托管。
前置要求
运行较新版本 Ubuntu 或 Debian 的基于 Linux 的家用服务器或 VPS
拥有该服务器的 Root 访问权限
本机安装了 SSH 客户端(macOS、Linux 和现代 Windows 终端均内置)
服务器的 IP 地址和 SSH 登录凭据
第一步:通过 SSH 连接并更新服务器
打开本地 macOS、Linux 或 Windows 设备的终端。输入以下命令,使用 SSH 凭据和服务器 IP 登录服务器:
ssh username@your-server-ip
出现提示时输入 SSH 密码。连接成功后,你就建立了从当前设备到目标服务器的直接链接。
接下来,在继续操作前先更新服务器的软件库和软件包,以避免安装时出现冲突,并立即应用最新的安全补丁:
sudo apt update && sudo apt upgrade -y
第二步:安装 Docker Engine 和 Compose
从 Docker 官方仓库拉取最新版本的 Docker Engine。首先安装必要的证书和 Docker 的 GPG 密钥,然后将官方 Docker 仓库添加到软件包源列表中。
随后更新软件包并安装带有 Compose 的 Docker Engine。安装完成后,可以通过版本检查确认 Docker 和 Compose 是否安装正确:
如果终端显示的是"command not found"错误而非版本号,说明安装过程中出现了问题,需要重新逐步执行上述步骤。
第三步:设置项目目录
Docker 安装完成后,接下来为自托管应用准备项目目录。首先,建议运行以下命令,确保所有用户都可以访问 Docker,而无需 sudo 或 root 权限:
sudo usermod -aG docker $USER
退出并重启终端以更新权限设置。然后创建实际的项目目录并进入该目录:
mkdir ~/my-app && cd ~/my-app
第四步:创建 compose.yaml 文件
现在可以在项目目录中编写 compose.yaml 文件了。执行以下命令进入 Nano 编辑器:
nano compose.yaml
根据所选 Docker 应用的设置说明,将对应的 compose.yaml 内容粘贴进去。通常,compose.yaml 文件应包含:项目镜像的 image 字段、容器名称、映射项目子文件夹的 volumes 字段,以及应用启动所用的端口。以下是一个状态监控应用 Uptime Kuma 的 YAML 文件示例:
保存文件并退出编辑器。如果感觉有些复杂,不用担心——你应该能在对应 Docker 应用在 Docker Hub 或 GitHub 上的设置说明中找到具体的 YAML 编写指引。
第五步:启动 Docker 应用
最后,使用 Compose 启动 Docker 应用。在任意项目目录下运行以下单条命令即可启动全部 Docker 容器:
docker compose up -d
容器启动完成后(通常不到一分钟),在浏览器中访问以下地址即可打开应用:http://your-server-ip:3001。请将 your-server-ip 替换为你的家用服务器或 VPS 的实际 IP 地址,格式类似 "192.168.1.1"(IPv4)或 "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]"(IPv6)。
值得一试的热门 Docker 自托管应用
Portainer:通过可视化界面管理 Docker 容器,无需使用终端或命令行。
Nextcloud:注重隐私的云存储替代方案,可替代 Google Drive 等公共云存储服务。
Pi-hole:全网广告和追踪器拦截工具,在 DNS 层面发挥作用。
Jellyfin:个人媒体服务器,可用于流媒体播放自有的电影、剧集和音乐,类似 Netflix,但支持自带媒体文件进行管理。
Vaultwarden:自托管密码管理器,可作为 Bitwarden API 的替代方案。
AdGuard Home:另一款热门的基于 DNS 的广告拦截工具,内置加密功能。
Uptime Kuma:简洁的状态监控工具,当自托管服务或应用出现故障时会及时发出告警。
Q&A
Q1:Docker 容器和普通应用安装有什么区别?
A:Docker 容器将应用所需的代码、库和配置全部封装在一个隔离环境中,拥有独立的资源分配。普通安装方式可能导致不同应用的依赖项互相冲突,而容器化安装可以完全避免这个问题,各应用之间互不干扰。
Q2:compose.yaml 文件怎么写?需要懂编程吗?
A:不需要专业编程知识。compose.yaml 文件通常包含镜像名称(image)、容器名称、数据卷映射(volumes)和端口号等字段。大多数 Docker 应用都会在 Docker Hub 或 GitHub 的项目页面上提供现成的 compose.yaml 示例,直接复制粘贴即可使用。
Q3:Uptime Kuma 是什么?怎么用 Docker 部署它?
A:Uptime Kuma 是一款自托管状态监控工具,可以在你的自托管服务或应用出现故障时发送告警通知。使用 Docker 部署时,只需在项目目录中创建包含 Uptime Kuma 相关配置的 compose.yaml 文件,然后运行 docker compose up -d 命令即可完成部署,之后通过浏览器访问对应的 IP 地址和端口号即可使用。
