Container Resource Constraints: Ensuring Stability and Performance
Learn to master container resource constraints. Set CPU and memory limits to prevent noisy neighbors and ensure long-term stability for your services.

Previously in this course, we explored understanding buildkit to speed up our image creation process. In this lesson, we shift our focus from build-time optimization to runtime stability by implementing resources limits on our running containers.
By default, a Docker container has no constraints on the host's hardware; it can consume as much cpu and memory as it needs, potentially crashing your host if one service runs wild.
The Problem: The Noisy Neighbor
In a multi-service environment, if one container starts a memory-intensive task, it can trigger the host’s Out-Of-Memory (OOM) killer, causing the kernel to terminate processes—often killing your database or web server instead of the offending container. This "noisy neighbor" effect is a primary cause of instability in production systems. Just as you might manage Kubernetes resource requests and limits for orchestration, you must define these boundaries in Docker to keep your infrastructure predictable.
Setting Resource Limits
We define resource constraints in our docker-compose.yml file under the deploy key. This allows the Docker engine to enforce hard limits and soft reservations.
- Limits: The absolute maximum a container is allowed to consume.
- Reservations: The minimum amount of resources the container is guaranteed to have.
Here is how you configure this for a typical service in your project:
YAMLservices: web-app: image: my-web-app:latest deploy: resources: limits: cpus: '0.50' memory: 512M reservations: cpus: '0.25' memory: 128M
In this example, the web-app is capped at using 50% of a single CPU core and 512MB of RAM. If it tries to exceed these, the kernel will throttle the CPU or, in the case of memory, potentially send a signal to the process.
Monitoring Container Usage
You cannot manage what you cannot measure. To see how your containers are behaving in real-time, use the docker stats command. This provides a live feed of resource consumption.
- Start your services using
docker compose up -d. - Run
docker statsin your terminal.
You will see columns for CPU %, MEM USAGE / LIMIT, and MEM %. If you see a container hitting its limit, you know it's time to either optimize the code or increase the allocation in your Compose file.
Hands-on Exercise
To practice, update your current multi-service project:
- Open your
docker-compose.ymlfile. - Add a
deployblock to your main application service. - Set a memory limit of
256M. - Run
docker compose up -dto apply the changes. - Run
docker statsto verify that the "LIMIT" column now reflects your 256MB setting.
Common Pitfalls
- Setting limits too low: If you set memory limits below the application's startup requirement, the container will enter a "CrashLoopBackOff" state (or simply restart repeatedly). Always check your logs if a container fails to start after applying limits.
- Ignoring the Swap: Memory limits in Docker often interact with host swap. If you see performance degradation, ensure your host has enough physical RAM rather than relying on swapping to disk.
- Assuming Limits are Requests: Remember that setting a limit does not guarantee the container gets those resources if the host is under heavy load; only a reservation guarantees access.
FAQ
Q: What happens when a container hits its memory limit? A: If the container hits its hard limit, the kernel will usually trigger an OOM kill, and the container will exit with an error code (typically 137).
Q: Can I change these limits without restarting the container?
A: Some resource constraints can be updated on the fly using docker update, but for a consistent, reproducible environment, you should always manage them in your docker-compose.yml and recreate the services.
Q: Do these limits apply to the host or the container? A: They apply specifically to the container. The host OS remains unaware of these limits, which is why your container can "see" the host's total RAM even if you've restricted its usage.
Recap
We have learned that managing resources is essential for stability. By defining cpu and memory constraints, we prevent individual services from monopolizing system resources. Using docker stats allows us to monitor our configuration, ensuring our applications perform as expected under load.
Up next: We will explore how to manage your service outputs effectively using Logging Drivers.
Work with me

CI/CD Pipeline & Docker Containerization
Ship with confidence: automated CI/CD pipelines and Docker setups so every push is tested and deployed — no more manual, error-prone releases.

VPS Server Setup, Deployment & Hardening
Get your app live on a fast, secure server — properly configured, hardened, and deployment-ready. No more wrestling with the command line.


