VPS requirements for Docker
What makes Docker convenient is that the whole project — application, database, queue, reverse proxy — is described in a single compose.yaml file and moves from server to server in minutes. But it places demands on the virtual server that an ordinary PHP site doesn't. The table above already lists only the plans that meet them: KVM, 2+ cores, 2 GB of memory and 30 GB on NVMe, with the cheapest per core shown first.
Virtualization: why KVM
Containers rely on Linux kernel mechanisms: namespaces, cgroups, network bridges, iptables. On KVM a VDS has its own kernel, and Docker installs from the official repository without surprises. On OpenVZ and LXC the kernel is shared with the host machine: Docker either doesn't start at all or works only with special settings from the host, with network restrictions and old versions. It isn't worth spending an evening finding out — go straight for a KVM VPS.
The second point is the storage driver. By default Docker uses overlay2, which needs OverlayFS support in the kernel. Without it, Docker falls back to the vfs driver, which copies every image layer in full: the disk fills up several times faster and builds are slow. You can check the driver with docker info right after installation.
How much memory several containers need
The Docker daemon itself takes about 100 MB. From there, count by what's in your stack:
- Nginx or Caddy — 20–50 MB;
- an application in Python, Node.js or PHP-FPM — 100–300 MB per process;
- PostgreSQL or MySQL — from 200 MB, noticeably more under load;
- Redis — tens of megabytes plus the size of the data.
A typical "proxy + app + database + Redis" stack fits into 1–1.5 GB, so 2 GB is a sensible minimum, and for several projects on one server 4 GB RAM is better. Set memory limits for containers and add a swap file: without them, one bloated process will take down its neighbours via the OOM killer.
Disk: space disappears quietly
Images weigh anywhere from tens of megabytes to a gigabyte, and with every update the old versions stay on disk. Container logs are written with no size limit by default. Hence three rules: configure log rotation in daemon.json (the max-size and max-file options), run docker system prune periodically, and don't take less than 30 GB. If databases live in your containers, look at NVMe plans — for random writes the difference from SATA SSD is tangible.
Network, security and payment
A common trap: ports published with -p are opened by Docker bypassing UFW, so firewall rules don't apply to them. Bind internal services to 127.0.0.1 or use compose's internal networks. Pulling images from Docker Hub can at times be slow or restricted, so set up a registry mirror in advance. Payment methods for each plan are in the "Payment" column; prices are shown in your currency and updated from the hosts' websites.