Dans l’article précédent, nous avons vu les bases de docker-compose en créant un service de base de données. Nous allons maintenant ajouter d’autres services à ce stack de containers.

Dans le cadre de mon stage à l’IMT Atlantique, je devais mettre en place un serveur MariaDB ainsi que des clients en ligne de commande et proposer des interfaces graphiques. Nous allons créer les clients en ligne de commande.

On utilise la commande mkdir <NOM DOSSIER> pour créer un nouveau dossier de travail dans lequel nous allons éditer un fichier docker-compose.yml.

version: '3.3'
services:

    #serveur de base de donnees
    database:
       image: 'mariadb:10.3'
       container_name: database
       restart: always
       environment:
          - MYSQL_USER: user
          - MYSQL_PASSWORD: mypassword
          - MYSQL_DATABASE: my_database
          - MYSQL_ROOT_PASSWORD: rootpassword
        
       ports:
           - '3306:3306'
       volumes:
           - ${PWD}/mariadb/:/var/lib/mysql/

Ici, nous avons le serveur de base de données auquel on peut se connecter en utilisant la commande ‘docker exec -it <NOM CONTAINER> /bin/sh’ . Mais ce que nous voulons c’est un service qui se connecte automatiquement au container qui contient le serveur.

Pour cela, nous allons à nouveau éditer le docker-compose.yml afin d’y ajouter un client:

# attention à l'alignement!!!!
    #client de la base de donnees
    userclient:
      image: 'mariadb:10.3'
      container_name: 'userclient'
      restart: 'no'
      command: 'mysql -hdatabase -uuser -pmypassword my_database'

Attention: cette commande n’est valable qui si l’utilisateur ‘user’ et la base de données ‘my_database’ existent. Pour voir comment les créer, c’est ici.

Explications:

  • userclient: c’est le nom que l’on donne au container pour pouvoir le retrouver dans le listing (docker ps -a)
  • image: utilisation de la même image que pour le serveur
  • restart: ‘no’ : on lance le container mais on le fait pas redémarrer. Il sera démarrer ultérieurement si besoin. Le ‘no’ est entre guillemets, contrairement au ‘always’ sinon le système ne le reconnaît pas
  • command: ‘mysql -hdatabase -uuser -pmypassword my_database’
    • mysql: mode de connexion au container
    • -hdatabase: le nom du container
    • -uuser: l’utilisateur avec lequel on souhaite se connecter
    • -pmypassword: le mot de passe associé à l’utilisateur
    • my_database: la base de données avec laquelle on travaille (qui est d’ailleurs la seule que l’utilisateur peut voir)

Une fois que l’on a modifié notre fichier yml, on relance les containers avec le docker-compose up, puis on tape:

docker-compose run userclient

Nous sommes bien connecté à la base de données avec l’utilisateur précédemment créé. Il ne reste plus qu’à modifier le yml afin d’y ajouter root et le usecase.

Commençons par root:

     rootclient:
        image: 'mariadb:10.3'
        container_name: 'rootclient'
        restart: 'no'
        command: 'mysql -hdatabase -uroot -prootpassword'

Dans le cas de root, nous ne spécifions pas la base de données à laquelle se connecter lors de l’appel de la commande. Cependant il est possible de faire comme pour l’utilisateur et d’indiquer la BDD.

Il reste ensuite à créer un container pour un cas d’usage. L’utilisateur entre son login /mot de passe, s’il est enregistré il sera connecté, s’il n’est pas enregistré, une erreur sera retournée.

       otherclient:
          image: 'mariadb:10.3'
          container_name: 'otherclient'
          restart: 'no'
          command: 
             - /bin/sh
             - -c
             - 'read -p "Entrez votre identifiant: " ID && read -p "Entrez votre mot de passe: " MDP && mysql -hdatabase -u$$ID -p$$MDP my_database'

Lorsque l’on se connecte au container avec la commande docker-compose run otherclient, il nous est demandé d’entrer l’identifiant ainsi que le mot de passe, puis nous sommes connecté à la base de données.

Dans un prochain article nous verrons la création des containers pour ajouter phpMyAdmin. Un autre article sera dédié à la sécurisation de notre fichier yml en mettant nos variables d’environnement dans un fichier à part.

Catégories : Docker