Créer un conteneur Docker

Logo DockerMaintenant que tu as installé docker sur ta bête de course tu vas pouvoir créer un conteneur Docker. Pour cela je vais te faire un petit exemple en déployant un serveur de jeux dans Docker. Le serveur est le DarkMultiPlayer pour Kerbal Space Program. Il a la particularité de ne pas avoir été compilé pour Linux :/, il faudra donc le faire fonctionner avec mono … Bref on va pouvoir tester les performances de docker au passage :)

Aller c’est parti!

1. Création de l’image docker

On commence par télécharger le serveur du jeu :

(un petit wget des familles)

$ wget https://d-mp.org/downloads/release/latest/DMPServer.zip

On extrait avec unzip et on oubliera pas de supprimer notre zip une fois que tout sera fonctionnel afin de garder un plan de travail toujours propre.

$ unzip DMPServer.zip 

Il est venu le temps, des rires et des chants, ha non c’est pas ça…

Il est venu le temps de créer notre image docker. Pour se faire rien de plus simple, on créer un fichier nommé Dockerfile.

$ touch Dockerfile

On l’ouvre avec notre éditeur de fichiers préféré :

$ vi Dockerfile

Là on commence les choses sérieuses :

On sait que le serveur à besoin de mono pour fonctionner. On va donc prendre un image de mono déjà construite dans les dépôts de docker, qui nous apportera au passage une l’image OS avec laquelle elle à été construite. pour cela dans notre docker file on va en écrire ceci en haut du fichier :

 FROM mono:latest 

(/!\ on lui indique toujours la dernière version plutôt qu'une version en dure, cela veux dire qu'il faudra tester notre image si on veux la reconstruire et que la version de l'image de base à changé.)

En dessous on doit indiquer un mainteneur (utile si on souhaite le publier sur les repo docker) sous la forme nom prénom <mail>

MAINTAINER tonton tux <tux@domaine.fr>

On va ensuite lui passer des commandes afin de se faire un endroit cosy dans cette image … ou pas

On commence par créer un utilisateur (ici kerman en faisant référence au jeu) avec son group, homedir,…
Cet utilisateur sera créé dans le docker, en aucun cas sur l’OS hôte.

RUN useradd -m -d /home/kerman

Le RUN de docker réalise en réalité appel au shell de l’image OS. Les commandes disponibles peuvent donc varier en fonction de votre image de base.

On lui ajout notre dossier précédemment « dé-zippé » dans le home de l’utilisateur kerman et on met ce dernier propriétaire de l’ensemble.

ADD DMPServer /home/kerman/DMPServer
RUN chown -R kerman:kerman /home/kerman

Ensuite on va définir le répertoire de travail et l’utilisateur owner qui sera utilisé lors du lancement du docker :

WORKDIR /home/kerman/DMPServer
USER kerman

On ouvre le port de sur lequel notre service écoute sur l’image. Ce port n’a pas besoin d’être libre sur votre machine, en effet Docker intègre une couche réseau avancé permettant de créer un nat ou proxy.

EXPOSE 6702

Et enfin avec l’instruction CMD on défini la commande que va exécuter notre serveur.

CMD mono /home/kerman/DMPServer/DMPServer.exe

Ce qui nous donne :

#Image de base
FROM mono:4.4

#Personne en charge
MAINTAINER tonton tux <tux@tontontux.fr>

#On créer notre utilisateur et groupe
RUN useradd -m -d /home/kerman

#On insère les binaires dans l'image 
ADD DMPServer /home/kerman/DMPServer  

#On attribut les bons droits 
RUN chown -R kerman:kerman /home/kerman  

#On définit l'utilisateur qui exécutera le binaire du serveur
USER kerman 

#On définit le port d'écoute de l'image
EXPOSE 6702

 #On définit la commande exécutée par l'image
CMD mono /home/kerman/DMPServer/DMPServer.exe

Puis il nous reste plus qu’a installer l’image pour pouvoir l’utiliser.

Pour se faire il suffit de taper :

$ docker build -t mon_serveur_ksp ./

(/!\ le ./ definit la position du fichier Dockerfile)

Et on vérifie que tout s’est bien passé avec un:

$ docker images

Cela devrait donner quelque chose dans ce genre la :

mon_serveur_ksp     latest              42f2966021b6        8 minutes ago       699.4 MB
mono                4.4                 4bcf669858be        3 weeks ago         698.3 MB

Si on veut être économe en place on vas pouvoir supprimer l’image mono qui nous a seulement servi pour la compilation.

$ docker rmi mono:4.4

/!\ Vous ne pourrez et ne devez pas la supprimer si elle est utilisée ailleurs pour pour un autre container.

Et … voila on a créé notre image docker !

Heu ouai … mais c’est pas finit !

 2. Création du conteneur

Le conteneur est une instance de notre image et à partir d’une image donnée on peut créer autant de conteneur qu’on veux. Aller c’est parti !

Pour créer le conteneur on lance :

$ docker  run -t mon_serveur_ksp &

On peux vérifier qu’il est bien lancé avec la commande :

$ docker ps

Ce qui devrait nous donner :

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a4235aadace9        mon_serveur_ksp     "/bin/sh -c 'mono /ho"   4 seconds ago       Up 3 seconds        6702/tcp                 elegant_lamport

Et voila le conteneur est lancé a+!

Ok,ok… on peux mieux faire.

Déjà docker est démarré en jobs et ça … c’est pas top, du coup on le passe en démon en ajoutant l’option « -d »

$ docker  run -t -d mon_serveur_ksp

Après on peu remarquer que notre container a été nommé par docker et il est pas vraiment simple à apprendre par coeur … on va donc lui donner un nom plus parlant avec l’option « --name serveur-ksp »

$ docker  run -t -d --name serveur-ksp mon_serveur_ksp

Ensuite afin que le conteneur puisse parler avec le monde (Hello world), on va utiliser la fonction proxy de docker afin de lui attribuer un port d’écoute de la machine physique. On utilise donc pour cela l’option « -p [port reel]:[port conteneur] »

$ docker run -t -d --name serveur-ksp -p 42:6702 mon_serveur_ksp

Et on finit en externalisant les logs avec l’option « -v » qui permet de monter un répertoire local dans le conteneur

$ docker run -t -d --name serveur-ksp -p 42:6702 -v /var/log:/home/kerman/DMPServer/logs mon_serveur_ksp

Et voila votre serveur est opérationnel.

Et en extra je rajoute quelques commandes pour la route :

- Pour ouvrir un shell sur le docker :

$ docker exec -it [nom du conteneur] /bin/bash

- Pour supprimer un conteneur :

$ docker rm [nom du conteneur]

- Pour arrêter un conteneur :

$ docker stop [nom du conteneur]

- Pour redémarrer un conteneur :

$ docker start [nom du conteneur]