C’est parti pour le premier article très technique de l’année 2017. On va franchir ensemble un nouveau palier dans Docker. Mais ne vous inquiétez pas, tout va très bien se passer. Si Docker ne vous dit strictement rien, ou si vous avez besoin de vous rafraîchir la mémoire, pas de problème. Je vous conseille de lire mon article Qu’est-ce que Docker, et comment ça fonctionne ?
Installation de Docker
Avant de commencer et pour éviter que vous soyez frustrés, je vous invite à installer Docker afin de tester les commandes que je vous propose de découvrir aujourd’hui.
Voici les liens de téléchargement :
|
|
|
|
Docker pour Windows 10 | Docker pour les Windows en dessous de Windows 10 | Docker pour macOS Yosemite ou supérieur | Documentation Docker Ubuntu |
C’est une installation classique, je ne me fais pas de souci pour vous. Pour ceux qui sont sur Linux, vous avez l’habitude des documentations donc je ne m’en fais pas non plus.
Après l’avoir installé, lancez une console Docker. Pour ceux qui sont sur Linux ou Mac, c’est directement dans le terminal. Quant à ceux qui sont sur Windows, il faut lancer PowerShell ou la console Docker.
Pour utiliser Docker, vous devez être en root, ou en Admin pour Windows.
Maintenant, vous êtes prêts. Si vous avez des soucis, les commentaires sont là pour ça…
Je vous propose de commencer tout en douceur avec les commandes Docker, et j’augmenterai le niveau au fur et à mesure.
Les meilleures commandes de Docker
On commence par appréhender Docker en tapant tout simplement “docker” dans votre console.
docker
Le rendu est le suivant :
Usage: docker [OPTIONS] COMMAND [arg...] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files -D, --debug Enable debug mode -H, --host=[] Daemon socket(s) to connect to -h, --help Print usage -l, --log-level=info Set the logging level --tls Use TLS; implied by --tlsverify --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA --tlscert=~/.docker/cert.pem Path to TLS certificate file --tlskey=~/.docker/key.pem Path to TLS key file --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Commands: attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container, image or task kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry. logout Log out from a Docker registry. logs Fetch the logs of a container network Manage Docker networks node Manage Docker Swarm nodes pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images service Manage Docker services start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers swarm Manage Docker Swarm tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code
Je vous ai surligné les commandes que nous allons utiliser dans cet article, et dans les suivants. Celles-ci vous permettront de bien comprendre la base de Docker.
On va commencer par un petit TP, qui consiste à démarrer un conteneur qui se nomme Hello-world. Pour ceux qui ne connaissent pas Hello-world, il s’agit de la première étape quand un développeur commence à apprendre un nouveau langage.
Bref, commençons par utiliser la commande suivante :
docker images
Cette fonction nous permet d’afficher la liste des images installées dans notre Docker. Si c’est la première fois que vous utilisez Docker, vous devriez obtenir ce résultat :
Maintenant, nous allons remplir notre liste d’images en téléchargeant un premier système. Pour cela, je vous conseille d’aller faire un tour dans le hub Docker pour vous rendre compte des possibilités. Voici le lien : Docker Hub.
C’est un peu comme un Play Store ou l’Apple Store. Vous y trouverez une liste d’images disponibles, leur note et le nombre de “pulls”. Vous devez certainement reconnaître certains logos, comme Ubuntu, MongoDB, MySql ou encore ElasticSearch. Tout ces systèmes, qui peuvent paraître longs à installer et à paramétrer, sont désormais simples à appeler. Prenons un exemple simple : le hello-world, fait pour ceux qui débutent. Si vous cliquez dessus, vous allez voir le détails et la description de ce que contient le repository (un stockage centralisé – sur le Docker Hub dans notre cas). Et à droite, on vous indique la commande pour télécharger l’image.
docker pull hello-world
Voici le résultat :
Docker vous dit qu’il va télécharger la version qui se nomme latest (la dernière postée par les développeurs). Ensuite, il vous spécifie qu’il a téléchargé l’image.
Si on lance un :
docker images
On voit apparaître notre jolie image :
On obtient plein d’informations en effectuant cette commande : on connaît le nom du repository, et le tag pour savoir sur quelle branche du projet nous sommes.
Pour ceux qui ne savent pas ce qu’est une branche, voici une petite explication. Quand on développe un projet correctement on utilise Git comme moyen “d’archivage de code“. Et très souvent on crée plusieurs branches pour un même projet. Cela permet de diviser le projet en plusieurs versions. Par exemple vous avez créé une version “dev”, qui est la dernière version en cours de développement, mais qui contient probablement des bugs. On peut avoir la branche “release stable” qui est la version publiée et accessible au public, c’est à dire la version stable. On peut aussi avoir une branche anglaise, etc. Je pense que vous avez compris le concept.
Ensuite, on a l’image ID qui est très utile pour lancer un conteneur, la date de création pour se rappeler si ça fait longtemps qu’on l’a téléchargée, et la taille qui peut être importante si vous exportez votre image – pour différentes raisons – sur clé USB par exemple. Si la taille est énorme, cela risque d’être compliqué.
Maintenant, voici la question qui doit vous brûler les lèvres : comment lancer un conteneur ?
Comment lancer un conteneur ?
Et bien c’est très simple. Bien évidemment il s’agit du premier TP, on corsera les choses au fur et à mesure.
docker run hello-world
Avant de vous montrer le résultat, je vais vous expliquer ce que fait la commande.
Elle veut dire : “lance moi l’image qui se nomme hello-world“. Et si vous avez bien suivi, il y a une autre manière de faire. On peut l’appeler par son ID (moi je préfère, c’est plus sûr si on a plusieurs versions d’images).
docker run c54a2cc56cbb
Et voici le résultat de la commande :
Donc cela signifie que l’on a bien lancé l’image hello-world. Pour vérifier que le boulot a bien été fait, on va voir du côté des conteneurs. On lance la commande suivante :
docker ps -l
Cette commande va afficher la liste des conteneurs créés récemment sur votre machine. Pour avoir la liste complète, il faut faire un ps -a.
On voit que le conteneur 71a… a été créé 9 minutes plus tôt et qu’il est arrêté (voir le statut). Dernière information importante, il se nomme fervent_turing. Oui, Docker aime bien générer des noms sympas. Mais moi ça ne me plaît pas, alors je décide de changer son nom grâce à la commande suivante :
docker rename 71a mon_test
Puis j’effectue un ps – l pour voir le résultat.
On observe que le nom s’est transformé en mon_test (voir en bas à droite).
Maintenant qu’on a fini de se servir de hello-world et que vous avez tout compris, je vous propose de le supprimer.
Pour supprimer l’image, il suffit d’écrire la ligne suivante :
docker rmi hello-world
Et le résultat est sans équivoque :
Si vous comprenez l’anglais, vous avez dû voir que Docker n’accepte pas la suppression d’une image tant qu’un des conteneurs l’utilise encore.
Nous allons donc supprimer mon conteneur “mon_test”.
docker rm mon_test
Voici le résultat, rien de special.
On vérifie avec un
docker ps -a
On voit bien que je n’ai plus aucun conteneur…
On va pouvoir s’attaquer a l’image, en réitérant la même commande que précédemment.
docker rmi hello-world
Docker nous indique qu’il a bien supprimé l’image. Je vous laisserai faire un docker image pour vous en assurez.
C’est donc fini pour ce premier TP. Si vous avez des soucis, vous pouvez me contacter par mail, sur les réseaux sociaux, ou encore mieux les commentaires. Et n’hésitez pas à partager l’article à votre entourage ;-).
Dans le prochain article prévu prochainement, nous créerons un site WordPress fonctionnel, entièrement grâce à Docker, et avec peu de lignes de commande. Elle est pas belle la vie ? A bientôt pour de nouvelle aventures !
Photo : “Overlooking the Harbour”, Chris Lawton.

