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