Docker – Les Conteneurs

Par défaut
  • Les Images vs Les Conteneurs
  • Démarrer, arreter, enlever les conteneurs
  • Vérifier les logs et les process des conteneurs

Les Images vs Les Conteneurs

Une image est l’application que nous voulons lancer.

Un conteneur est un processus qui est une instance de cette image.

On peut avoir plusieurs conteneurs qui tournent sous la meme image.

On va utiliser le serveur web Nginx comme image

Le registre par défaut de Docker est appelé le Docker Hub ( hub.docker.com). On peut considérer que les registres sont l’équivalent de Github, mais pas pour le code mais pour les images.

docker container run –publish 80:80 nginx

Explication

  1. Téléchargement de l’image ’nginx’ depuis DockerHub
  2. Démarre un nouveau conteneur depuis cette image
  3. Activation du port 80 sur le hote
  4. Dirige le traffic vers ce conteneur IP, port 80

On peut ensuite faire la commande suivante, qui va permettre au serveur Nginx de continuer de s’éxécuter mais dans l’arrière plan

docker container run –publish 80:80 –detach nginx

Si vous avez une erreur de ce type,

docker: Error response from daemon: driver failed programming external connectivity on endpoint infallible_hofstadter (0c100b5e21cc9f4db69491134180e23fa402a200c359c6a238842c516cded7d4): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE).

C’est du au fait que le port 80 est utilisé par un autre process, très certainement apache.

Vous pouvez essayer de lancer la commande suivante pour vérifier

sudo lsof -nP | grep LISTEN

Essayez de faire ca si vous n’utilisez pas Apache pour le moment

sudo apachectl stop

Ensuite relancez

docker container run –publish 80:80 –detach nginx

docker container ls

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   7 seconds ago       Up 6 seconds        80/tcp, 0.0.0.0:80->90/tcp   practical_keller

practical_keller est un nom choisi aléatoirement par Docker.

docker container run –publish 80:90 –detach –name TestDockerAjmal nginx

86902e9a10357286a0e27c89e8b7235f7f3353dbeb124763c70201cd89dcd847

docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES

86902e9a1035        nginx               « nginx -g ‘daemon of… »   54 seconds ago      Created                                          TestDockerAjmal

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   8 minutes ago       Up 8 minutes        80/tcp, 0.0.0.0:80->90/tcp   practical_keller

Up 8 minutes signifie que le conteneur a bien été lancé.

J’ai ensuite remarqué que Docker n’aime pas que les noms des conteneurs soient en majuscules. J’ai donc renommé le conteneur

docker container rename TestDockerAjmal test_docker_ajmal

sudo lsof -nP | grep LISTEN

Adobe\x20   589                  ajmal   32u     IPv4 0xd33f2473fd1896e9         0t0        TCP 127.0.0.1:15393 (LISTEN)

node        628                  ajmal   15u     IPv4 0xd33f2473fdda36e9         0t0        TCP 127.0.0.1:49270 (LISTEN)

node        628                  ajmal   21u     IPv4 0xd33f2473fdda23e9         0t0        TCP 127.0.0.1:49274 (LISTEN)

com.docke  1874                  ajmal   23u     IPv4 0xd33f2473f5a0a069         0t0        TCP *:80 (LISTEN)

Faites cette commande pour supprimer tout conteneur qui n’est pas démarré.

docker rm $(docker ps -a -q)  ou

docker container rm -f 896

Relancez la commande pour recréer le conteneur en spécifiant un port différent

docker container run –publish 90:90 –detach –name test_docker_ajmal nginx

Ajmals-MacBook-Pro:~ ajmal$ docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES

c87f189f8fb4        nginx               « nginx -g ‘daemon of… »   4 seconds ago       Up 3 seconds        80/tcp, 0.0.0.0:90->90/tcp   test_docker_ajmal

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   34 minutes ago      Up 34 minutes       80/tcp, 0.0.0.0:80->90/tcp   practical_keller

Les 2 conteneurs sont UP, c’est à dire qu’ils sont bien démarrés.

Pour stopper les conteneurs, faites ensuite

docker container stop practical_keller

docker container stop test_docker_ajmal

docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES

c87f189f8fb4        nginx               « nginx -g ‘daemon of… »   23 minutes ago      Exited (0) 3 seconds ago                        test_docker_ajmal

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   About an hour ago   Exited (0) 31 seconds ago                       practical_keller

Les statuts ont changé à ’’Exited’’.

Rappel: Lancement d’un conteneur

  1. Recherche l’image localement dans l’Image Cache, s’il le trouve pas, etape 2
  2. Recherche l’image dans le repo image ( Docker Hub )
  3. Télecharge l’image et le sauvegarde
  4. Crée un nouveau conteneur basé sur cette image et le prépare au démarrage
  5. L’assigne un addresse IP virtuel sur le réseau privé à l’intérieur du moteur Docker
  6. Ouvre le port 80 sur l’hote et redirige vers le port 80 dans le conteneur
  7. Démarre le conteneur en utilisant le CMD dans l’image Dockerfile

Docker – Mise en route sur Mac

Par défaut

Docker est une plateforme permettant aux développeurs, et aux administrateurs système de développer, déployer et d’exécuter des applications avec des conteneurs. L’utilisation de conteneurs pour déployer des applications s’appelle la conteneurisation. Les conteneurs ne sont pas nouveaux, mais leur utilisation pour déployer facilement des applications l’est.

La conteneurisation est de plus en plus populaire car les conteneurs sont:

Flexible: Même les applications les plus complexes peuvent être conteneurisées.
Léger: les conteneurs exploitent et partagent le noyau hôte.
Interchangeable: vous pouvez déployer des mises à jour et des mises à niveau à la volée.
Portable: vous pouvez créer localement, déployer sur le cloud et exécuter n’importe où.
Évolutif: vous pouvez augmenter et distribuer automatiquement les réplicas de conteneur.
Empilable: Vous pouvez empiler des services verticalement et à la volée.

Dans ce petit tuto, on va voir comment mettre en place un environment de développement sur Mac pour commencer avec Docker

Il faut tout d’abord télécharger l’application qui se trouve à l’adresse suivante

https://www.docker.com/products/docker-desktop

Téléchargez la version pour Mac et l’installer ( la version CE ou Edge)

Une fois que c’est fait, vous devriez voir l’icone Docker comme ici.

Docker

Ouvrez un terminal en ligne de commande et essayez quelques commandes de Docker.

Exécutez

docker version

pour vérifier que la dernière version est installée.

Ensuite exécutez

docker hello-world

pour vérifier que Docker extrait les images et s’exécute comme prévu.

Docker requiert au moins Yosemite 10.10.3 ( 2014 )

Il n’est pas nécessaire d’avoir un mac très récent car Docker supporte Yosemite.

Idéalement il est bien sur nécessaire d’avoir un mac plus récent pour bénéficier des atouts de Docker Toolbox et aussi d’etre à l’aise avec la performance.

Il ne pas faut utiliser HomeBrew pour installer Docker, car en le faisant de cette facon, seules les utilitaires en lignes de commandes seront installés.

Docker pour Mac : les étapes de Installation

-Installez Docker ( l’étape précédente )

-Adaptez Docker en fonction des paramètres du Mac

-Récupérer un éditeur de code

-Adaptez le terminal

Installez Visual studio code pour Mac

https://code.visualstudio.com/docs/?dv=osx

Installez l’extension Docker sur Visual Studio Code

Screenshot 2018-12-06 at 11.09.25

Installez le bash-completion à l’aide de Homebrew ( ca permet de faire l’auto-complétion des commandes sur le terminal )

Pour bien vérifier que cela a été fait, vous devrez voir

Bash completion has been installed to:

  /usr/local/etc/bash_completion.d

==> Summary

Maintenant il faut lier le bash completion aux ressources suivantes

ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion /usr/local/etc/bash_completion.d/docker

ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion /usr/local/etc/bash_completion.d/docker-machine

 ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion /usr/local/etc/bash_completion.d/docker-compose

Ensuite modifiez le bash profile

Dans le terminal faites

touch ~/.bash_profile

open ~/.bash_profile

Rajoutez ce bout de code

if [ -f $(brew –prefix)/etc/bash_completion ]; then
. $(brew –prefix)/etc/bash_completion
fi

Sauvegardez et relancer le terminal

Essayez

docker container run —

et appuyez 2 fois sur la tabulation

Vous devrez voir une liste de commandes qui s’affichent automatiquement. Si c’est ok, le bash completion est correctement configuré.

Vous etes donc pret pour commencer à utiliser Docker sur votre Mac !