Run containerised applications with Docker and Compose on a server we help you configure, secure and monitor.
Docker makes an application portable: the same image runs on your laptop, in CI and on the server. It does not make a server production-ready by itself. Someone still needs to set up TLS, persistent storage, log limits, restarts, backups and a deployment process.
Our VPS plans include root access and free DevOps support, including Docker deployment help. For many applications, Docker Compose on one well-run VPS is simpler and cheaper than a cluster. When you outgrow it, see Kubernetes management or AWS.
A current, correctly installed Docker with Compose files kept in version control.
Nginx, Traefik or Caddy in front of your containers, with automatic certificates.
Databases and uploads stored on volumes, not inside containers that get replaced.
Images pulled from Docker Hub, GitHub Container Registry or Amazon ECR.
Push to Git, build the image, deploy it. No manual copying.
Log rotation and resource limits so one container cannot fill the disk or starve the host.
Restart policies and health checks so failures recover on their own.
Non-root containers, no exposed Docker socket and databases that are not public.
This example shows the details that separate a working Compose file from a reliable one: a pinned image tag, a localhost-only port, a health check, log limits and a database that must be healthy before the application starts.
services:
app:
image: ghcr.io/your-org/your-app:1.4.2
restart: unless-stopped
env_file: .env
ports:
- "127.0.0.1:3000:3000"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3000/health"]
interval: 30s
timeout: 5s
retries: 3
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
retries: 5
volumes:
pgdata:
secrets:
db_password:
file: ./secrets/db_password.txt
Docker manages its own firewall rules. A container published with -p 8080:80 can be reachable from the internet even if your UFW rules say otherwise. The safest pattern is to bind application ports to 127.0.0.1, as above, and expose only the reverse proxy.
server {
listen 443 ssl;
server_name app.example.com;
# ssl_certificate lines managed by certbot
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Review the Dockerfile: multi-stage builds, a non-root user and a small final image.
Install Docker, set the firewall, configure the reverse proxy and TLS.
Build and push the image, then deploy it automatically on every release.
Monitoring, volume backups and image updates become routine.
Something else on your mind? Message us and an engineer will answer.
Ask a QuestionCompose on one VPS is enough for most small production applications. Kubernetes pays off when you need scheduling across several nodes or run many services. See Kubernetes management.
Docker deployment is part of free DevOps support. A larger containerisation effort is scoped with you first.
With database dumps and volume archives copied off the server, and restores that are tested.
Whichever fits your workflow: Docker Hub, GitHub Container Registry or Amazon ECR. We can set up any of them.
Tell us about your application and we will plan the setup with you.