Resource management in Docker

In this blog post I would like to touch on the topic of resource management for Docker containers. It is often unclear how it works and what we can and cannot do. I hope that after reading this blog post resource management will be a bit easier for you to understand.

Docker uses cgroups to group processes running in the container. This allows you to manage the resources of a group of processes, which is very valuable, as you can imagine.


Runninng Docker containers as systemd services

Starting and stopping Docker containers is easy with the docker run and docker {stop|kill} commands. By default, when the Docker daemon is restarted, running containers are also restarted. This is a great feature but sometimes you need more control over the container’s lifecycle.

Imagine having a container which is linked to another one. Docker does not provide any way of specifying which container should be started when or what to do if a container dies.


Customizing the configuration of the WildFly Docker image

Default configuration is a great place to start with a project. We at JBoss try to make our projects (and products too!) usable out-of-box for as many use cases as we can, but there is no way that one configuration could satisfy everyone’s needs. For example, we ship 4 flavors of the standalone.xml configuration file with WildFly since there are so many different deployment scenarios. But this is still not enough. We need to be able to tweak it at any point. The jboss/wildfly image is not an exception here.

Following the Docker recreate — do not modify principle we do change the configuration by creating a new image (in most cases). This allows us to reuse the images (consider the jboss/wildfly image itself).


Logging with the WildFly Docker image

There are various ways to set up logging for Docker containers. Docker itself has a built-in logs command, you can mount a volume from the host and save the logs there, you can create a different container that would be only responsible for log handling, or set up a logging daemon. Every method has some pros and cons and it is up to you to choose the one that fits best.


JBoss projects as Docker images

I recently announced the availability of the official WildFly Docker image. Since then, our portfolio of images has grown a bit - as of today, we have 8 images. But this is not the end. We want to have a nice collection of JBoss projects shipped as Docker images.

All of our images are hooked up to automated builds. When we push an update to the repository, a new image will be created and pushed to the global registry. I also set up links between the images so if a base image is updated, our dependent images will be rebuilt. This is a fully automated process that ensures you get the latest available software.