如何为 Docker 选择 VPS,并避免容器数据丢失
容器启动快,但稳定运行取决于虚拟化、内存、磁盘、网络以及数据如何持久化。下面从单机 Docker 到小型 Compose 栈,给出选型、部署、备份和安全方案。

哪种虚拟化适合 Docker
优先选择 KVM 或其他完整硬件虚拟化。它通常提供独立内核能力、cgroups、网络与文件系统功能,兼容性也更可预测。容器型 VPS 可能限制内核模块、嵌套网络或存储驱动;购买前务必确认服务商明确允许 Docker,而不是只看 Linux 版本。
如果需要 Kubernetes 嵌套虚拟化、特殊 VPN 模块或自定义内核参数,应在试用期验证。独立 IPv4 方便对外提供服务,但多个容器通常通过一个反向代理共享 80/443 端口。
容器需要多少资源
| 场景 | 建议起点 | 注意事项 |
|---|---|---|
| 一个小型 API 或机器人 | 1–2 vCPU、2 GB 内存 | 限制日志,监控 OOM |
| 应用 + 数据库 + 代理 | 2–4 vCPU、4–8 GB 内存 | 数据库缓存与持久化卷 |
| 多个业务服务 | 4+ vCPU、8+ GB 内存 | 资源限制、队列和可观测性 |
| 构建服务器或私有 registry | 快 CPU、NVMe、充足磁盘 | 镜像层、缓存和网络流量 |
不要只把容器声明的内存相加:操作系统、Docker daemon、page cache、代理和监控同样占用资源。给数据库和高峰请求预留空间,为每个服务设置合理的 limit,避免一个泄漏的进程拖垮整台主机。选择方法可参考CPU 与内存估算。
Docker 为什么会悄悄占满磁盘
旧镜像、停止的容器、构建缓存和无限增长的 JSON 日志都会积累。数据库写入 volume,但容器可写层、临时文件和异常日志也会消耗系统盘。NVMe 适合数据库、registry 和频繁构建,不过磁盘容量与持续性能同样重要。
- 为容器日志设置大小和文件数上限。
- 定期检查 image、volume、build cache 的占用,不要盲目清理。
- 数据库、上传文件和队列状态放入显式命名的 volume。
- 至少保留 20–30% 可用空间并设置告警。
- 备份前确认 volume 与容器的对应关系。
实用部署架构
单台 VPS 可由反向代理负责 TLS 和路由,应用与数据库仅加入内部 Docker 网络。用 Compose 或等效的声明文件记录镜像版本、端口、volume、healthcheck 和重启策略。生产环境不要使用浮动的 latest 标签;版本必须能追溯到源码提交。
- 从仓库取得声明文件并校验受控配置。
- 从密钥存储注入 secret,不写入镜像或 Git。
- 先拉取固定版本镜像并执行数据库备份。
- 启动新版本,等待 healthcheck,再切换流量。
- 验证日志、指标和关键业务操作。
- 保留上一版本及明确回滚步骤。
无意外的更新
应用更新、数据库迁移和镜像更新应分开考虑。先在相同数据结构的测试环境演练。滚动更新不能自动解决不向后兼容的数据库变更;需要 expand/contract、双写或明确维护窗口。
如何备份 volume 和数据库
容器不是备份。数据库应使用自身的一致性工具导出,或采用经过验证的物理备份流程;仅复制正在写入的数据目录可能得到不可恢复的副本。上传文件、配置和证书也要备份到 VPS 外部,并设置保留周期和加密。
定期在干净 VPS 上恢复:创建网络与 volume、导入数据库、启动指定镜像并执行功能检查。服务商快照便于整机回滚,但不能替代可移植备份。详见VPS 备份指南。
Docker 主机的网络与安全
只暴露反向代理和必要管理端口。不要把数据库端口绑定到 0.0.0.0,也不要把 Docker socket 挂载进不受信任的容器,因为控制 socket 几乎等于主机 root 权限。使用非 root 镜像、只读文件系统和最少 Linux capabilities,及时更新主机与基础镜像。
SSH 使用密钥,防火墙默认拒绝,管理面板最好经 VPN 访问。监控容器重启、OOM、磁盘、证书、5xx、数据库延迟和备份结果。
常见错误
- 把数据库放在容器可写层。重建容器就会丢失数据。
- 生产使用 latest。同一部署命令可能得到不同代码。
- 不限制日志。磁盘常在夜间被写满。
- 把所有端口暴露到公网。内部数据库和队列成为攻击面。
- 只备份 volume 目录。活跃数据库可能不一致。
- 没有资源限制。单个容器可耗尽内存并触发 OOM。
- 在 1 GB VPS 堆叠多个服务。系统和缓存没有余量。
常见问题
1 GB 内存够 Docker 用吗?
单个很小的无数据库服务可能够,但 daemon、系统和更新都会占用空间。生产环境通常从 2 GB 起,多服务栈从 4 GB 起更稳妥。
Docker 需要独立 IPv4 吗?
不需要每个容器一个 IP。一般一个公网 IP 加反向代理即可;是否需要 IPv4 取决于对外访问和 DNS。
值得在单台 VPS 上装 Kubernetes 吗?
学习可以,单机生产通常增加复杂度却没有高可用。Compose 往往更清晰;需要多节点调度时再采用 Kubernetes。
PostgreSQL 可以放在 Docker 中吗?
可以,只要数据位于持久化 volume、版本固定、备份与恢复经过验证。问题通常来自错误存储和运维,而不是容器本身。
如何判断需要升级 VPS?
观察 CPU throttling、OOM、swap、磁盘延迟、容量和响应时间;排除泄漏与错误请求后,升级持续耗尽的那项资源。
如果栈中包含数据库,可继续查看数据库 VPS 筛选。
