Maintenant 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]