No Docker Compose. Now what?

published on | edited on

I have had used Docker Compose from the begging of my Docker journey. I had a great time to simplify what I create with containers. I’m sad to say this but it left some bad taste in mouth.

Actually, it’s tasteless anymore. I see no point of installing and running Docker Compose just for a PostgreSQL or a Redis servers1.

I’ve had a chance to run CentOS 8 as workstation for a month. To be real, it was a real challenge to obey the rules of SELinux. Podman was really helpful tool to run in rootless mode2 inside that craziness. The second minute I thought I can work without Docker Compose. I just couldn’t I have looked around for Docker Compose for Podman which webloggers introduction Podman as simple as alias docker=podman. No, it is not!

You might ask somebody should have done something. Indeed, they did but I really didn’t want to spend so much time to run Compose-ish containers. I admitted not have a docker-compose.yaml anymore.

Kernel Virtual Machine and libvirt

I know so many people who will start to write “why would you replace a container with a virtual machine? (all in caps)” I have reasons of mine. Give me some of your valuable time to explain.

The experience of managing racks of servers thought me something: keeping things simple. To be honest, you can replace that sentence with anything you want. Like any other fields, we need to keep mental overhead low. I already moved development tools (compilers, make) from the host to Vagrant machines. The last things was Docker.

I came a cross with the provisioner for Docker in Vagrant. In my mind, I was asking can I make Vagrant…

Where this idea come from? Actually it was from cloud IDE/development tools. I found I feel confident when somebody, an administrator in this case, gives everything a developer needs in a toolbox. Vagrant has been used just for this reason but had forgotten. I am not here to rescue it from that status but I’m happy to use the tool where I can run it whenever I need.

Vagrant.configure('2') do |config|
  # ...

  config.vm.provision :docker do |container|
    container.run 'postgres', image: 'postgres:11', args: %w[
      --env POSTGRES_USER=potato
      --env POSTGRES_PASSWORD=potato
      --env POSTGRES_DB=potato_development
      --publish 5432:5432
    ].join(' ')
  end
end

To long; didn’t read but curious about the content

We often skip this part for the simplicity of running a simple, single snippet or a command. Knowing the internals of development environment is also important. However, more important then that is reproducibility. If a new developer spends an hour to figure out how to install Docker engine, then there is a problem.

I use Vagrant to provision my development environment. As a developer, I don’t want to follow a Markdown document to prepare an environment. As an administrator, I really don’t want to write script to do the black magic.

I might need to add additional posts to give examples of how I work make this post more clearer.

To long; didn’t read

Use Vagrant with Docker provisioner.


  1. Fun to watch initiating docker kill to a Redis server ↩︎

  2. It is not that easy as I said. The challenge is in the name: rootless ↩︎