Docker Tutorial 3: docker compose for multi-container

docker tutorial
docker tutorial

If you have missed the two previous articles, I suggest you go read them before you start with this tutorial docker 3 where we will learn how to manage several containers together with the help of the docker compose.

Article 1: Getting Started with Docker
Article 2: Master the Dockerfiles

This tutorial is independent of the two previous articles but it is very useful to have some knowledge of Docker to understand the power of docker composes.

What is docker composes?

Docker compose is a very interesting docker package management tool. This tool will launch your containers and their possible links from a configuration file written in yaml. We could compare this tool to apt-get or composer but for the purpose of packaging docker containers. This tool makes life easier for docker users.

Docker compose installation

“Under Ubuntu configured basic, you must put sudo in front of your orders or review the configuration of your users”

We will have to install this new tool that is not part of the basic tools when we install Docker

sudo curl -o /usr/local/bin/docker-compose -L "$(uname -s)-$(uname -m)"
sudo chmod +x /usr/local/bin/docker-compose

We will be able to verify that the installation worked well by testing a very simple docker-compose function that allows to display the version number of the installed tool:

docker-compose -v

Preparation of our images

To use our docker compose we will use two docker images: one that we will create with one Dockerfile and the other that we will recover on Docker Hub.

Image created from a Dockerfile

We will create our first image which will be an apache server with php that will have the ability to connect to an external MySql server.

Let’s start by creating a docker/ folder and put an index.php file like this:


 $dbh = new PDO('mysql:host=db;dbname=mysql', 'root', 'passe');
 foreach($dbh->query('SHOW DATABASES') as $row) {
   echo $row[0]. '<br/>';

We will also do a docker/host.conf file:

<VirtualHost *:80>
     ServerAdmin webmaster@localhost
     DocumentRoot /var/www/test

We will now write our Dockerfile which will use these two files during the build of the image:

FROM ubuntu:16.04
 MAINTAINER Judicael paquet
RUN apt-get update && \
     apt-get install -y apache2 php libapache2-mod-php mysql-client php7.0-mysql
 RUN sed -i 's/;extension=php_mysqli.dll/extension=php_mysqli.dll/' /etc/php/7.0/apache2/php.ini
 RUN sed -i 's/;extension=php_pdo_mysql.dll/extension=php_pdo_mysql.dll/' /etc/php/7.0/apache2/php.ini
 ADD docker/host.conf /etc/apache2/sites-enabled/000-default.conf
 ADD docker/index.php /var/www/test/index.php
 ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Everything is ready to build our image:

docker build -t monapache .

Image retrieved on Docker Hub

For our second image we will use another method: docker hub. We will retrieve an image of the Docker Hub locally with the following command:

docker pull mysql/mysql-server:5.7

Creating the docker-compose.yml file

Docker compose as I said above proposes to manage several containers at the same time with the possibility of making them communicate with one another through a single file: the docker-compose.yml.

I propose you to create ours:


     image: mysql/mysql-server:5.7
       - "3306:3306"
       - "MYSQL_ROOT_PASSWORD=passe"
       - "MYSQL_USER=your_user"
       - "MYSQL_PASSWORD=your_user_password"
       - "MYSQL_DATABASE=your_database_name"
     build: ./
       - "8010:80"
       - "db:db"
     working_dir: "/home/docker"

As you can see, we have voluntarily put “password” in “root” password. This is the one we already put in our PHP file. Be aware that the name “db” is important because it will automatically be the name of the container’s host; that’s why we put “db” in hostname on the SQL connection made in PHP.

Except the changement of syntax, if you are familiar with docker run and dockerfiles, you should not be confused with this file. The link binds the container to another as with the -v option of the docker run that we did not see.

Now we are going to launch our docker-compose like this:


docker-compose up -d

Now try to call your url http://localhost: 8010 in your browser. If you have a blank page, you will need to do the following manipulation. It will allow you to put the right rights to the user Mysql:

docker ps 
# remplacez ubuntu_db_1 par l'id de votre conteneur db
docker exec -it ubuntu_db_1 mysql -uroot -p -e "CREATE USER
*.* TO 'root'@'%';FLUSH PRIVILEGES;"

As a reminder, the password will be “pass”.

If everything is ok, you will have the list of the bases present in the Mysql database on your Internet browser.


Conclusion docker compose

You now have all the basics to be able to quickly master docker compose. It is really a useful tool. More and more projects on Github propose besides this file docker-compose.yml to quickly mount the project.

(Visited 486 times, 1 visits today)
About Judicaël Paquet 368 Articles
Judicaël Paquet (agile coach and senior devops) My Engagements in France and Switzerland: - Crafting Agile Transformation Strategies - Tailored Agile Training Programs - Raising Awareness and Coaching for Managers - Assessing Agile Maturity and Situational Analysis - Agile Coaching for Teams, Organizations, Product Owners, Scrum Masters, and Agile Coaches Areas of Expertise: Scrum, Kanban, Management 3.0, Scalability, Lean Startup, Agile Methodology.

1 Trackback / Pingback

  1. Tutoriel docker 3 : docker compose - Blog Myagile Partner

Leave a Reply

Your email address will not be published.