跳至正文

解决方案 · 容器

Docker 需要多大的服务器?

容器是共享同一内核的进程,而不是小型虚拟机:守护进程约占 100 MB,其余都只是您自己的进程。所以答案比预想的小:代理、应用、数据库和缓存加起来约 515 MB,在 BD-8($12.90)上绰绰有余。

一个容器实际占用多少

区间值,而非基准测试

您的镜像、配置和流量对这些数字的影响,比任何表格都大。在您自己的技术栈上运行 docker stats:那才是唯一适用于您的数字。

常见容器工作负载的一般常驻内存
容器一般内存占用BD-8(8 GB)可容纳
一个反向代理nginx、Caddy、Traefik15–60 MB129 偏高情况
一个小型 Web 应用Node、Python、Go:单个进程60–200 MB38 偏高情况
PostgreSQL 或 MySQL小数据集,默认连接池200–500 MB15 偏高情况
Redis用作缓存,受 maxmemory 限制20–200 MB38 偏高情况
一个 JVM 服务Java、Kotlin、Elasticsearch500–2000 MB3 偏高情况

算一笔账

每个套餐能容纳多少

内存减去操作系统的 300 MB 和守护进程的 100 MB,再除以您的容器占用。中间一列是一整套服务栈(代理、应用、数据库、缓存),约 515 MB。

各套餐的容器和服务栈容量,附磁盘和实时价格
套餐RAM完整技术栈小型应用磁盘价格部署
VPS-11 GB1325 GB$9.90部署
BD-88 GB1538100 GB$12.90部署
BD-1212 GB2359200 GB$17.90部署
BD-2424 GB46120300 GB$31.90部署

磁盘是第二个意外,人们往往后来才遇到:镜像、卷和日志会悄悄堆积。请在问题变得紧迫之前,而不是之后,把 docker system prune 加入每周的 cron。

与自家产品对比

哪些情况下不应购买

托管容器平台更贵,是因为它负责运维。这是值得购买的真实服务。

VPS 给您 root 权限,同时也把更新、重启、证书和半夜告警交给您。这便宜得多,也确实需要更多工作。如果您不想承担这些工作,托管平台才是实在的答案,我们宁愿推荐它,也不愿卖给您一台最终被弃置、带着未打补丁的守护进程暴露在互联网上的机器。同一建议中还有两点:为每个容器设置内存限制,这样出问题的容器会被终止,而不是您的数据库;单台机器上不要用 Kubernetes,没有可调度对象的编排器只会增加复杂度。

常见问题

购买前大家常问的问题。

Docker 本身占用多少 RAM?
非常少,这一点常常出乎意料。Docker 守护进程大约占用 100 MB,之后每个容器都只是一个进程:没有第二个操作系统,没有第二个内核,也不像虚拟机那样每个容器都有固定开销。所以算法很简单:机器内存,减去操作系统约 300 MB 和守护进程 100 MB,剩下的分给您实际运行的进程。
小型 VPS 能运行多少个容器?
比问题本身暗示的要多,因为“一个容器”并不是一个规格单位。十个反向代理和一个 Elasticsearch 对机器的要求天差地别。在 BD-8(8 GB,$12.90)上,一个代理、一个 Web 应用、一个数据库和一个缓存加起来大约 515 MB,机器的大部分资源仍然空闲。上表已经帮您做了除法;在您自己的技术栈上运行 `docker stats`,才能得到真正适用于您的数字。
VPS 比托管容器平台便宜吗?
几乎总是更便宜,但价格并非比较的全部。平台收费更高,是因为它负责运维:更新、重启、证书、凌晨 3 点的告警。VPS 给您 root 权限,同时把这些全部交还给您。如果您想运行容器并愿意承担这些工作,VPS 便宜得多。如果您不愿意,请选择平台。我们宁愿直说,也不愿卖给您一台最终被弃置、上面跑着未打补丁的守护进程的机器。
我需要 Docker Swarm 或 Kubernetes 吗?
在一台机器上,不需要。对于运行在单台服务器上的技术栈,Compose 就足够了,而且对绝大多数自托管部署来说它都是正确的选择:编排器的工作是跨机器调度,只有一台机器时没有什么可调度的。等您真正拥有多台机器、并且有理由承担这份复杂性时,再考虑 Kubernetes,不要提前。
最先成为瓶颈的是内存、CPU 还是磁盘?
通常是内存,而且会明显地出问题:内核的内存不足终止机制会选中一个进程并结束它,看起来就像某个容器莫名其妙地重启。请为每个容器设置内存限制,让出问题的那个被终止,而不是您的数据库。磁盘是第二个意外:镜像、卷和日志会悄悄堆积,因此早在问题紧迫之前,就应把 `docker system prune` 加入每周的 cron。
宿主机应运行哪个系统镜像?
我们的任何系统都可以:所有套餐都支持所有系统镜像,Docker 在所有镜像上都能运行。如果您没有偏好,默认选 Ubuntu LTS 即可,原因很简单:大多数容器文档都以它为前提。发行版的影响远比想象中小:容器自带用户空间,主机几乎只是一个内核加一个守护进程。