Learn Docker With My Newest Course

Dive into Docker takes you from "What is Docker?" to confidently applying Docker to your own projects. It's packed with best practices and examples. Start Learning Docker →

Docker Tip #78: Using Compatibility Mode to Set Memory and CPU Limits

blog/cards/docker-tips-and-tricks.jpg

Docker Compose's Compatibility mode may help you use certain API v2 properties inside of an API v3 Docker Compose file.

For example, let’s say you’re not using Docker Swarm but you still want to use resource limits on your containers.

Back with API v2, you could set mem_limit and cpu_shares on your services but these properties aren’t compatible with API v3. If you try to use them with version: 3.x then Docker Compose is going to yell at you.

There’s still cases where you may want to use version: 3.x even if you’re not using Swarm, plus it’s beneficial to design your Compose file in such a way that makes it compatible with Compose and Swarm with the least amount of edits possible.

Setting resource limits in an API v3 compatible way:
version: "3.4"

services:
  redis:
    image: "redis:alpine"
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: "50M"

Now, if you ran this with docker-compose up you would get this warning:

WARNING: Some services (redis) use the ‘deploy’ key, which will be ignored. Compose does not support ‘deploy’ configuration - use docker stack deploy to deploy to a swarm.

You can get around that warning by running docker-compose --compatibility up.

Using --compatibility mode is what lets us do this. It will attempt to convert that API v3 way of setting resource limits back into v2 compatible properties.

And you can verify it was set by running docker-compose --compatibility config. You should see that the deploy’s resource limits were translated into mem_list and cpu_shares. You can re-run the command without --compatibility to see the difference in output.

It also works with other properties too, but your mileage may vary. It’s not a perfect solution, so if you plan to use --compatibility always double check to make sure Docker Compose is doing what you expect it to do. Using config is a great way to test that.

Free Intro to Docker Email Course

Over 5 days you'll get 1 email per day that includes video and text from the premium Dive Into Docker course. By the end of the 5 days you'll have hands on experience using Docker to serve a website.


Comments