GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

Docker


Installation de docker sur serveur Windows ========================================== Install-Module -Name DockerMsftProvider -Repository PSGallery -Force Install-Package -Name Docker -ProviderName DockerMsftProvider -Verbose Restart-Computer -Force PS> Get-Service Docker Affiche l'état du service Docker Si le service est noté comme Stopped, vous pouvez le démarrer en faisant PS> Start-Service Docker PS> docker version Cela nous affiche la version des différents modules client et serveur de docker. Si nous obtenons une réponse cela veut bien dire que nous communiquons avec notre service docker. Le site https://docs.docker.com/engine/reference/commandline/dockerd/ nous donne une multitude d'informations sur le service docker et son démon dockerd. Nous pouvons y trouver bon nombre de paramètres pour contrôler son fonctionnement, et notamment la façon dont le service docker va démarrer ou bien la gestion de ses cartes réseau (bridge, ...) Le fichier de configuration par défaut de docker se situe dans c:\programdata\docker\config\daemon.json. Ce fichier n'existe pas. Il faut le créer par PS> New-item -ItemType file c:\programdata\docker\config\daemon.json Il faut ensuite préciser à docker que son port d'écoute sera le 2375 (par exemple) en ajoutant les informations suivantes PS> Add-Content 'c:\programdata\docker\config\daemon.json' '{"hosts":["tcp://0.0.0.0:2375","npipe://"]}' Redémarrez le service docker PS> Restart-service docker Un petit netstat -aon|findstr "2375" pour être sûr que le port a bien été généré. N'oublions pas de configurer le port du firewall pour la communication sur le nouveau port PS> netsh advfirewall firewall add rule name="Docker daemon" dir=in action=allow protocol=TCP localport=2375 Le container le plus simple à exécuter est hello-world. Il s'exécute comme suit : PS> docker run hello-world Le container va se télécharger pour s'exécuter et simplement écrire "hello from Docker!" A la fin le container s'arrête et se décharge de la mémoire du serveur. Nous pouvons le constater en faisant docker ps pour afficher les conteneurs en cours de fonctionnement. Si l'on lance la commande PS> docker run -it hello-world powershell cela va exécuter le conteneur hello-world en mode interactif et lancer un powershell dans ce conteneur. Il est ainsi possible de faire cat ./hello.txt pour afficher le message que nous avions reçu lorsque nous avons fait docker run hello-world. Accès docker depuis poste windows 10 ou autre serveur ===================================================== Nous allons procéder à l'installation de docker sur poste de travail en téléchargeant la version qui correspond à celle du serveur en cours d'exécution (la 17.06 actuellement). PS> $package = “https://download.docker.com/win/static/stable/x86_64/docker-17.06.0-ce.zip"; PS> Invoke-WebRequest $package -OutFile “$env:Temp\docker-17.06.0-ce.zip” -UseBasicParsing PS> Expand-Archive -Path “$env:TEMP\docker-17.06.0-ce.zip” -DestinationPath $env:ProgramFiles Pour s'assurer que tout a été désarchivé au bon endroit : PS> ii $env:ProgramFiles Cela devrait afficher un explorateur Windows montrant un dossier c:\ProgramFiles\Docker A l'intérieur devraient se trouver deux fichiers : docker et dockerd. A présent il faut ajouter le chemin de ce dossier à notre variable d'environnement PS> [Environment]::SetEnvironmentVariable(“Path”, $env:Path + “;$($env:ProgramFiles)\Docker”, [EnvironmentVariableTarget]::Machine) Fermez et ouvrez à nouveau l'interpréteur PowerShell et lancez la commande PS> docker -H tcp://192.168.1.51:2375 version en supposant que le serveur hébergeant le service docker soit sur l'IP 192.168.1.51 et que le port sur lequel écoute docker soit le 2375 (comme nous l'avons paramétré dans les lignes précédentes) La commande version devrait retourner les mêmes informations que si vous l'aviez exécutée directement depuis le serveur, à savoir les version du client et du serveur docker (17.06 dans notre exemple). Client: Version: 17.06.0-ce API version: 1.30 Go version: go1.8.3 Git commit: 02c1d87 Built: Fri Jun 23 21:30:30 2017 OS/Arch: windows/amd64 Server: Version: 17.06.2-ee-17 API version: 1.30 (minimum version 1.24) Go version: go1.8.7 Git commit: 66834de Built: Thu Oct 25 12:25:12 2018 OS/Arch: windows/amd64 Experimental: false Principe de Docker ================== La containerisation est réalisée par l'intermédiaire d'un processus qui isole les éléments de la plateforme matérielle et qui offre un moyen d'exécuter des programmes ou environnements complets en parfaite isolation les uns des autres. Il se base sur un daemon (sous linux) utilisant les namespaces et les cgroups de linux pour réaliser cette isolation et offrir le maximum de performances à l'ensemble des containers installés sur la machine. Les containers sont disponibles par défaut sur le hub public https://hub.docker.com avec un choix important sur l'ensemble des problématiques informatiques : serveurs web, serveurs linux, serveurs de bases de données et bien d'autres encore. Le lancement d'un container par la commande > docker container run -ti va provoquer son téléchargement et son installation s'il n'est pas déjà présent dans le repository local du serveur qui gère le host Docker. Exemples d'usage des containers : Pour démarrer le conteneur de python : docker container run -ti python:3 Cela va démarrer un container avec le tag 3 de Python à savoir donc la version 3 du langage Pour démarrer un container Ruby : docker container run -ti ruby:2.5.1 Même chose que précédemment avec cette fois un interpréteur Ruby en version 2.5.1 Pour démarrer un container NodeJS : docker container run -ti node:8.12-alpine Pour Node, la subtilité au niveau du tag indique également la distribution alpine linux pour cette gestion de conteneur Node car Alpine Linux est très impliqué dans la mise en place de Node sur Docker et reste le meilleur support pour NodeJS. Pour démarrer une base MongoDB : docker container run -p 27017:27017 -d mongo:4.0 Cela démarre un conteneur qui écoute sur le port 27017 et qui route le port externe sur le port interne 27017. Pour utiliser Mongo, le plus simple est de faire appel à Compass qui offre une interface Web d'administration. L'utilisation du flag -d pour détacher le processus demande à Docker de nous afficher clairement l'ID du processus. C'est une suite de chiffres et lettres qui identifie de manière unique le processus en écoute (pour le killer par exemple). Pour démarrer un container Redmine : docker container run -p 3000:3000 redmine:3 L'accès à Redmine s'effectue via le port 3000 et sur la version 3 (tag :3) Connexion par défaut par admin/admin.s Rappel des flags : -ti : démarrer un conteneur en mode intéractif -p : permet de rediriger un port externe vers un port interne d'un conteneur qui a vocation d'être accédé à travers le réseau local. -d : démarre le conteneur en mode daemon ou détaché Il n'y a pas que des éléments autonomes qui sont utilisables avec Docker. On peut également mettre en place une stack complète regroupant plusieurs services comme : Kibana pour l'interface de visualisation Elasticsearch pour le stockage et l'indexation des logs Logstash et Beats pour l'ingestion des logs. Qu'est un container Linux ? =========================== Un processus qui tourne sur le système isolé des autres processus. Il dispose de sa propre vision du système sur lequel il tourne (NameSpace) Il est limité dans les ressources qu'il peut utiliser avec les Control Groups (cgroups) Partage le kernel de la machine hôte avec les autres containers. Types de namespaces : pid : isolation de l'espace des processus net : donne une stack de réseau privé mount : système de fichiers privé uts : nom du host ipc : isole les communications inter processus user : mapping UID/GID entre hôte et containers Les control groups permettent de limiter les ressources utilisées par un processus : RAM, IO, Network, CPU Présentation de docker ====================== Le client docker (écrit en Go) communique avec le daemon dockerd via une API REST. Le daemon Dockerd est responsable de la gestion des images docker, du réseau, des volumes, du cluster... Il délègue la gestion des containers à containerd Il écoute par défaut sur la socket locale /var/run/docker.sock mais peut être configuré pour écouter sur une socket TCP. Le client Docker communique en local par défaut avec la socket du daemon sur /var/run/docker.sock mais peut être configuré pour utiliser une connexion TCP en modifiant la valeur de la variable d'environnement DOCKER_HOST. Le gros avantage de Docker est de masquer la complexité de l'usage des containers Linux. Les images Docker incorporent l'intégralité des éléments requis pour le fonctionnement de Docker et sont paramétrées par un fichier dockerfile. Par défaut le contrôleur de Docker communique avec le hub docker https://hub.docker.com Un cluster SWARM peut être utilisé pour faire communiquer plusieurs docker hosts entre-eux. Il reste plus simple que Kubernetes pour la gestion multi hosts. Installer Docker sous Windows ============================= Utiliser Docker Community Edition, qui est gratuite, et propose une release stable produite chaque semestre La version Docker Entreprise (EE) permettent de s'intégrer avec un environnement AD Windows. Sur Windows 10 Pro ou MacOS>10.12, utiliser Docker Desktop. Pour les versions plus anciennes, utiliser Docker Toolbox Il est possible d'installer Docker sur Linux (https://docs.docker.com/install/linux/docker-ce/ubuntu/) et AWS / Azure. Pour télécharger le kit d'installation : https://hub.docker.com. Cliquer sur Explore pour récupérer les bonnes versions d'OS que vous utilisez. Tester avec Docker : Play With Docker (https://labs.play-with-docker.com/) Permet, depuis un navigateur, d'avoir accès à un environnement Docker. Chaque session dure 4 heures et permet d'avoir DockerInDocker (DinD) Pour Linux, le demon docker est lancé par Systemd et est en écoute sur la socket locale /var/run/docker.sock. Il est toutefois possible d'accéder aux informations docker depuis un serveur en simple ssh par la commande > docker -H ssh://user_ubuntu@ip_serveur_ubuntu info Cela permet d'ouvrir une connexion en SSH sur le serveur spécifié avec l'utilisateur user_ubuntu. Il faudra bien évidemment saisir le mot de passe de connexion. Comme la commande est un peu compliquée, il est possible d'utiliser une variable d'environnement qui sera automatiquement lue par la commande docker locale : > export DOCKER_HOST="ssh://user_ubuntu@ip_serveur_ubuntu" La commande finale sera simplement > docker info Pour ne pas avoir à saisir à chaque fois le mot de passe de connexion SSH, il est possible de copier la clé SSH sur le serveur distant par > ssh-copy-id -i ~/.ssh/id_rsa.pub user_ubuntu@ip_serveur_ubuntu Cela va automatiquement copier les bonnes clés sur le profil de l'utilisateur user_ubuntu sur le serveur ip_serveur_ubuntu. Installer Docker sur Ubuntu Serveur =================================== Commencez par installer Ubuntu en mode serveur en ajoutant un utilisateur non root mais avec les privilèges sudo. > sudo usermod -aG docker Déconnectez votre session et reconnectez-vous pour valider l'appartenance au nouveau groupe. Si tout se passe bien, les prochaines commandes docker pourront s'exécuter sans les précéder de sudo (une fois l'installation réalisée bien évidemment). Prévoyez également de disposer d'un compte sur le Docker Hub pour pouvoir pousser vos propres images. Une fois Ubuntu installé, nous allons faire en sorte que les paquets soient extraits du docker repository plutôt que du dépôt Ubuntu. Mettez à jour votre liste de paquets > sudo apt update Comme nous allons devoir récupérer des paquets sur HTTPS, nous ajoutons quelques pré-requis > sudo apt install apt-transport-https ca-certificates curl software-properties-common On récupère la clé GPG du dépôt Docker et on l'joute au système > curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - On ajoute le référentiel Docker aux sources APT > sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" On remet à jour la liste du repository local > sudo apt update Pour être sûr que le repository utilisé est bien celui de Docker : > apt-cache policy docker-ce Cela devrait afficher la liste des paquets disponibles, notamment l'information 500 https qui reprend la source de l'installation attendue. Nous pouvons maintenant installer Docker > sudo apt install docker-ce A la fin de l'installation le démon Docker et son autorisation de démarrage au boot peuvent être vérifiées par > sudo systemctl status docker Sur la sortie, l'information active devrait être inscrite en vert. Transformer un containeur en une image Docker ============================================= Supposons que nous installations Node.JS dans un containeur Docker. > docker run -it ubuntu Cela change le prompt montrant que nous sommes bien dans le container, et en mode root (donc pas besoin de sudo non plus) id-conteneur:/# apt update id-conteneur:/# apt install nodejs id-conteneur:/# node -v Cela devrait afficher le numéro de version de Node Une fois les éléments mis en place, il faut faire un commit sur votre repository local > docker commit -m "modifications apport" -a "Author Name" container_id repository/new_image_name L'option -m indique les modifications apportées à l'image (simple texte) L'option -a indique l'auteur des modifications Le container_id est celui qui s'affiche lorsque le containeur est créé Le repository correspond à votre nom d'utilisateur dans Docker Hub. Pour lister les images locales > docker images Pour pousser une image dans un référentiel Docker il faut avoir un compte sur le site. Ensuite connectez-vous par > docker login -u docker-registry-username Attention : si le nom ayant servi pour générer l'image n'est pas celui utilisé pour la connexion au service Docker Hub, il faudra tagger votre image avec votre nom d'utilisateur du registre > docker tag / docker-registry-username/ Ensuite il faut pousser l'image par > docker push / Le username peut être votre username local car vous venez de le tagger lors de l'étape de génération de l'image. Le push peut prendre du temps car l'image est véritablement téléchargée sur le site distant. Maintenant que l'image est disponible, vous pouvez le récupérer par > docker pull