Affectation au groupe Docker
Pour éviter de devoir préciser le mode « sudo » à chacune de vos commandes, vérifiez que le groupe « docker » existe sur votre machine :
cat /etc/group | grep docker
Si le groupe n’existe pas lancez la commande suivante :
sudo groupadd docker
Ensuite mettez votre utilisateur dans ce groupe :
sudo gpasswd -a <nom_utilisateur> docker
Il vous suffit de redémarrer docker et de rafraîchir les infos du groupe :
sudo service docker restart newgrp docker
Téléchargement d’images
Docker.io met à votre disposition un tas d’images très variées selon vos besoins.
Vous les trouverez sur le Hub de docker.
Dans ce tutorial nous utiliserons une image Ubuntu 14.04.
Pour mettre en place une image de base, lancez la commande suivante :
docker pull ubuntu:trusty
L’image n’est pas très lourde, c’est ici l’avantage de Docker, mais la commande peut prendre plusieurs minutes selon votre connexion.
Une fois l’image de base téléchargée, lancez la commande
docker images
Vous aurez un résultat de ce type :
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu trusty a5a467fddcb8 2 days ago 187.9 MB
Comme vous pouvez le constater, la taille de notre image est faible comparée a une VM ubuntu classique.
Si vous désirez supprimer une image, vous pouvez lancer la commande suivante :
docker rmi <IMAGE_ID>
Notez que vous pouvez utiliser la touche TAB pour autocompléter l’ID !
Au lieu de renseigner l’IMAGE ID vous pouvez écrire <REPOSITORY>:<TAG>, ce qui donne avec notre exemple « ubuntu:trusty »
Le but de cet article sera d’utiliser cette image pour installer les mises à jour du système et l’enregistrer sous une nouvelle image.
Nous allons utiliser deux méthodes pour cela.
Création d’une image via shell
Nous allons lancer notre image précédemment téléchargée et accéder à son shell :
docker run -it <IMAGE_ID> bash
– Le paramètre -i permet l’accès à stdin/stdout
– Le paramètre -t permet l’accès à tty
Nous avons créé un conteneur, et il est possible d’afficher les conteneurs en cours d’exécution sur votre machine avec la commande :
docker ps
Bien sur cette commande doit être lancée sur le shell de votre machine, et non celui du conteneur ! Vous aurez un affichage de ce type :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ebbe6ea61aa ubuntu:trusty bash 4 minutes ago Up 4 minutes jolly_yonath
Nous pouvons désormais lancer les commandes que le souhaite dans le conteneur. Remarquez que l’utilisateur est « root », mais aucun risque pour votre système car nous sommes dans un context isolé et virtuel.
Le but de notre article et de mettre le système à jour, lancez donc la commande :
apt-get update
Une fois la mise à jour terminée, faites CTRL + D pour quitter le conteneur.
Si nous lançons la commande de tout à l’heure, docker ps
vous remarquerez que la liste est vide.
Pour afficher le conteneur que l’on vient de fermer, ajoutez un paramètre :
docker ps -a
Notre conteneur précédemment quitté s’affiche :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ebbe6ea61aa ubuntu:trusty bash 8 minutes ago Exited (0) About a minute ago jolly_yonath
Sachez que plusieurs opérations sont disponibles sur les conteneurs, en voici une liste des plus utilisées :
docker stop <CONTAINER_ID> # Arrête le conteneur docker start <CONTAINER_ID> # Démarrer le conteneur docker restart <CONTAINER_ID> # Equivalent d'un stop/start docker kill <CONTAINER_ID> # Tue le conteneur docker rm <CONTAINER_ID> # Supprime le conteneur (lancer un stop avant)
Au lieu d’utiliser le CONTAINER_ID vous pouvez utiliser le champ NAMES, autogénéré dans notre cas. Si vous désirez mettre votre propre nom, notre commande run deviendra :
docker run -it --name test_nom ubuntu:trusty
Ce nom peut maintenant être utiliser au lieu du CONTAINER_ID, il doit être unique sinon Docker vous renverra une erreur.
Revenons à nos moutons, nous allons enregistrer nos modifications sous une nouvelle image :
docker commit <CONTAINER_ID> <NEW_IMAGE_NAME>
Je l’ai appelé « test_shell » et voici le retour que j’ai avec un docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test_shell latest 80d3effbbe3e 8 seconds ago 209.2 MB ubuntu trusty a5a467fddcb8 2 days ago 187.9 MB
Création d’une image via un Dockerfile
Les Dockerfile permettent de faire de façon automatisée ce que nous avons fait précédemment. Dans notre exemple, nous n’effectuons une seule commande, mais pour des images plus complexes on peut avoir beaucoup plus de choses à faire.
Nous en parlerons lors d’un prochain article, pour le moment nous allons rester sur notre simple mise à jour.
Pour ma part j’ai créé un dossier Docker dans mon espace personnel, et un dossier test pour y mettre mon fichier :
mkdir ~/Docker/test vi ~/Docker/test/Dockerfile
Le contenu du fichier est le suivant :
# We use ubuntu image FROM ubuntu:trusty # And make updates RUN apt-get update
Ici nous avons deux instructions :
– FROM, qui n’apparaît qu’une seule fois dans un dockerfile, et specifie l’image à utiliser.
– RUN, suivi d’une commande shell à lancer. Si vous avez plusieurs commandes à lancer. Chacun d’elle sera précedée de cette instruction.
Sauvegardez le fichier, puis rendez-vous dans le dossier qui contient votre Dockerfile, pour ma part :
cd ~/Dockerfile/test
Et lancez la commande suivante :
docker build -t test_dockerfile .
Vous allez voir Docker lancer une par une les étapes de votre Dockerfile, ici nous n’avons que deux étapes.
Une fois la construction de votre image terminée, refaites un docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test_dockerfile latest 4d9f3e8836ab About a minute ago 209.2 MB test_shell latest 80d3effbbe3e 20 minutes ago 209.2 MB ubuntu trusty a5a467fddcb8 2 days ago 187.9 MB
Nos deux images ont la même tailles car elles ont le même contenu.
Transporter son image Docker
L’avantage de docker, c’est que vous pouvez utiliser les images créées sur toutes les machines possédant le logiciel.
Reprenons notre image « test_dockerfile », nous allons créer une archive pour pouvoir la transférer :
docker save -o test_dockerfile.tar test_dockerfile:latest
L’archive sera présente dans le dossier dans lequel vous vous trouvez, vous pouvez préciser un autre chemin.
Sur la machine devant récupérer l’image, lancez la commande :
docker load --input test_dockerfile.tar
En faisant un docker images
il n’y a pas de REPOSITORY ni de TAG, donc on va « nommer » notre image
docker tag <IMAGE_ID> test_dockerfile:latest
Les opérations que nous avons effectuées sont plutôt simples, mais elles permettent de comprendre le fonctionnement de base de Docker.