Containers and CI/CD with Docker
Repeatable deploys, rollback in one command.
Shipping an application to production shouldn’t be a hand-crafted ritual that’s different every time. With Docker and a CI/CD pipeline, deployment becomes a repeatable, verifiable process: the same image goes from the developer’s laptop to staging and production, updates are tracked, and a rollback is ready the moment something doesn’t add up. This is the infrastructure behind our promise: we write the code and keep it running in production.
Overview
We containerize both new and existing applications with Docker and Docker Compose, then automate builds, tests and deploys with GitLab CI or GitHub Actions. The goal is simple: every release starts from an identical, predictable artifact and is promoted through separate environments - development, staging, production - with no manual steps forgotten along the way.
Containerization isn’t the end goal for us, it’s a means: it eliminates differences between environments, makes releases reversible and takes deployment out of the hands (and memory) of a single person. That’s why we never start from the technology - we start from your current release flow, where it breaks down, and what happens when an update goes wrong.
No configuration that lives only in someone’s head: Dockerfiles, Compose files and pipelines are written down, versioned in your repository and reproducible from scratch. And no over-engineering: if Compose and a good private registry are enough, we won’t push you toward a cluster.
Typical problems we solve
- Only one person knows how to deploy, by hand over SSH → we turn it into an automated pipeline anyone on the team can run and read.
- “Works on my machine” but not in production → we build Docker images that are identical across every environment, from development to production.
- A release breaks the site with no way back → we version every image and set up a rollback you can run with one command.
- Updates get tested directly in production → we set up a faithful staging environment to test them before they reach users.
- Every developer has a different local setup → we define a single stack with Docker Compose that rebuilds itself in minutes.
- Secrets and credentials scattered across config files and chat → we move them into protected pipeline variables, out of the codebase.
- Slow builds that hold up merges → we introduce caching, multi-stage builds and parallel steps to cut waiting time.
What’s included
- Containerization: review of the existing app, clean multi-stage Dockerfiles, and handling of environment variables, volumes and secrets.
- Docker Compose: service definitions (app, database, cache, reverse proxy) for local and staging environments that match production.
- Private registries: images published to GitLab Registry, GitHub Packages or a self-hosted registry, with versioned tags and periodic cleanup.
- CI/CD pipelines: automated build, tests, linting, image creation and deploy on merge, with manual approvals where a release needs a human check.
- Deploy and rollback: automated releases with a fast return to the previous version when something goes wrong.
- Staging environments: an environment that mirrors production, for testing updates and migrations before they reach users.
- Handover: documentation of the flow and a session with your team so they’re self-sufficient on day-to-day builds and releases.
Stack and technologies
We work with Docker and Docker Compose for the container runtime, and GitLab CI and GitHub Actions for pipelines. We keep orchestration light: Compose on a single host, or Docker Swarm when you need a bit of scaling; Kubernetes only when the workload genuinely justifies it, never as a trend. Containers run on Linux servers - mainly Debian and Ubuntu, with AlmaLinux or Rocky Linux on request - behind Nginx as a reverse proxy, with MySQL/MariaDB or PostgreSQL for data and Redis for caching and queues. On the cloud we mainly work with Google Cloud, with AWS and DigitalOcean as alternatives; Azure, Hetzner and OVH on request. Where the infrastructure is complex enough to warrant it, we describe it with Terraform; otherwise it stays as versioned, documented configuration, which is simpler to maintain.
A real-world example
A software house was releasing a Laravel management application with git pull over SSH and a manual checklist on a shared document: migrations run by hand, caches to clear, and every so often a skipped step that caused errors in production. We containerized the application with multi-stage Dockerfiles, defined the stack in Docker Compose (app, MariaDB, Redis, Nginx) and built a GitLab CI pipeline: tests and builds on every push, automatic deploy to staging, promotion to production with manual approval. Migrations and cache clearing became pipeline steps instead of checklist items. Today the team ships several times a week and, when an update doesn’t hold up, rolls back to the previous version in minutes.
Who it’s for
- Development teams who want to move past manual FTP or SSH deploys.
- Agencies and software houses juggling multiple projects who want one consistent release flow.
- SMEs and SaaS with a growing application that can no longer afford fragile releases.
- Anyone with an existing app to containerize without rewriting it from scratch.
How we work
We start with an audit of your application and current release flow, then containerize one service at a time and build the pipeline incrementally: your team keeps shipping while the new flow takes shape. Every configuration is documented and versioned in your repository: Dockerfiles, Compose files and pipeline definitions stay yours, readable and with no lock-in. A single point of contact follows the project from start to finish and leaves you reports that make sense even if you’re not a sysadmin by trade.
We bill on actuals at our hourly rate, or with hour packages that never expire; standard coverage is Mon-Fri 10:00-18:00 , with priorities and timing described on the response times page. Quotes are always free, with a reply within one business day.
Frequently asked questions
Can you containerize an application without rewriting it?
Yes. We start from the app as it is, write clean Dockerfiles and Compose files, and move it into containers without touching its architecture. If a refactor would genuinely be worth it, we propose it separately with clear costs and benefits.
Which CI/CD platforms do you support?
Mainly GitLab CI and GitHub Actions. We build pipelines that run builds, tests and deploys automatically, with manual approval steps where a release needs a human check.
What happens if a deploy breaks production?
Every release is a versioned image, so we roll back to the previous working version quickly. Even before that, updates go through a staging environment that mirrors production, so problems surface there rather than in front of your users.
Do I really need Kubernetes for this?
Usually not. For most projects, Docker Compose on a single host or Docker Swarm for light scaling is enough. Heavier orchestration only comes into play when the workload genuinely calls for it.
How much does it cost to containerize an application and build the pipeline?
We work at a flat €75/hour, or with hour packages that never expire: 5 hours at €350, 10 at €660, 20 at €1,200. Quotes are free, with a reply within one business day.
Do you provide support after it goes live?
Yes. Standard coverage is Monday to Friday, 10:00-18:00, with triage by priority: a production blocker (P1) is picked up within one business hour. Outside those hours we guarantee intervention only for P1 emergencies of clients with an active on-call plan.
Do you also work at night or on weekends?
Guaranteed only for clients with an active on-call plan, and only for real P1 emergencies: production down, data loss, active security incident. On-call is a monthly retainer with limited seats, available on systems we manage and, after a case-by-case assessment, on others too: prices and rules are on the On-call page. Without a plan, coverage is Mon-Fri 10:00-18:00 and out-of-hours work is best effort: it may happen, but it is neither guaranteed nor something you can demand. Night or holiday work planned at least 20 days ahead remains available to everyone, at the surcharged rate.
Need a hand with your infrastructure?
Tell us the problem: we reply with a clear plan and a quote.
Get in touch →