La virtualisation avec Docker Introduction - e
Transcription
La virtualisation avec Docker Introduction - e
La virtualisation avec Docker Introduction Le système de conteneur ● Docker est un projet Open Source ● Projet démarré en mars 2013 ● Levée de fonds (septembre 2014) : 40 millions de $ ● Système de machine virtuelle Linux légère ● ● – Pas d'hyperviseur – Partage du noyau hôte (kernel) Basé sur le standard LXC (Linux Containers) Entreprise : Docker, Inc. Virtualisation sous Linux Le projet Docker ● ● Développeur principal : Solomon HYKES Contributeurs : Andrea Luzzardi, Francois-Xavier Bourlet, Jeff Lindsay ● Licence : APACHE LICENSE 2.0 ● Écrit avec le langage GO ● Version standard pour plateforme Linux 64bits ● Version Boot2Docker pour Windows et OSX ● Site web : www.docker.com Concepts de base ● ● ● Un conteneur Docker interagit avec le système hôte Linux. Les conteneurs d'un même hôte appartiennent à un réseau virtuel. – Par défaut 172.17.0.0 – Passerelle par défaut 172.17.42.1 – Par défaut adressage DHCP Un conteneur peut empaqueter une application et ses dépendances et il peut être exécuté sur n'importe quel serveur Linux. Architecture Docker Espace utilisateur Conteneur A Conteneur B Serveur WEB Base De Données Docker CLI Ligne de commande Docker Daemon SYSTÈME D'EXPLOITATION CPU MÉMOIRE Entrée/Sortie Interface réseau Stockage Périphériques Pourquoi Docker ? ● Constat : – Déployer des applications sur des serveurs est très fastidieux ● Très pratiqué avec les forges logicielles – – Les architectures logicielles sont aujourd'hui très complexes ● ● Intégration continue Multiplication des couches et des services Solution : – Isoler chaque service, chaque couche dans un conteneur léger Vision Docker ● Brique d'infrastructure – ● ● Comme pour les fermes de machines en lieu et place des super-calculateurs les conteneurs Docker distribuent horizontalement l'infrastructure Service – Chaque conteneur embarque un service ou très peu de services (concept de micro-service) – Les conteneurs peuvent être déployés dans le cloud comme solution PAAS. Cloud ● OpenStack, OpenShift, OpenSVC Solution Docker ● ● ● ● ● Docker est une solution logicielle pour les logiciels. Docker est une couche d'abstraction qui permet de dématérialiser la fonction serveur. Docker simplifie la logistique liée à l'exploitation des logiciels. Docker est un mini-cloud à lui seul dans lequel sont exécutés des conteneurs légers. Très adapté au cycle de vie itératif du logiciel – Intégration, déploiement, exécution, test Processus Docker (1) ● Tout commence par une image – Obtenue à partir du Docker Hub ● – Commandes pull, run Construite en local ● ● Commandes commit, build Fichier de configuration Dockerfile Processus Docker (2) ● Démarrage d'un conteneur à partir d'une image – Commandes : ● Mode terminal avec obtention d'un prompt : – ● En arrière plan : – ● docker run -i -t [image] /bin/bash docker run -d [image] Options : – – – – -P ou -p [port] --name [nom] --link [nom:nom] -v [volume local:volume docker] Gestion des conteneurs (1) ● Liste des conteneurs actifs – ● Liste des conteneurs actifs et arrêtés – ● docker ps -a Arrêt d'un conteneur – ● docker ps docker stop [nom] ou [conteneurID] Suppression d'un conteneur – docker rm [nom] ou [conteneurID] Gestion des conteneurs (2) ● Arrêt de tous les conteneurs – ● Suppression de tous les conteneurs – ● docker stop $(docker ps -a -q) docker rm $(docker ps -a -q) Inspection d'un conteneur – docker inspect [conteneurID ou nom] – Résultat sous une forme JSON ● Adresse TCP/IP Gestion des images (2) ● Liste des images – ● ● Obtention d'une image – docker run [option] [image] – docker pull [image] Suppression d'une image – ● docker images docker rmi [imageID] Suppression de toutes les images – docker rmi $(docker images -a -q) Création d'une image (1) ● Obtention d'une image de base – ● ● docker run -i -t [image] /bin/bash Installation des services et applications – # yum install – # scp – # wget Sortie du mode terminal par exit Création d'une image (2) ● Sauvegarde du conteneur créé dans une image intermédiaire – ● ● Configuration du ficher Dockerfile Construction de l'image finale à l'aide du fichier Dockerfile – ● docker commit [containeurID] [nom image] docker build -t=''[nom image]'' . Transfert d'une image locale dans le Docker Hub – docker push [nom image] Exemples de fichier Dockerfile # dockerfile pour la creation d'une image fedora avec le service SSH FROM fedora:latest RUN yum -y install openssh openssh-server RUN mkdir /var/run/sshd RUN echo 'root:dockeradmin' | chpasswd RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key EXPOSE 22 CMD ["/usr/sbin/sshd","-D"] # dockerfile pour la creation d'une image wildfly avec ssh FROM lecoz/wildflysshsiolapie:prefinal EXPOSE 22 8080 9990 CMD /run.sh && tail -F /var/log/wildflylog Récupération d'espace disque(1) ● ● Constat – Les conteneurs Docker ne sont pas supprimés après leur arrêt – Les images téléchargées sur une machine y restent stockées même si inutilisées – Les volumes associés aux conteneurs ne sont pas toujours supprimés Solution – Par des commandes et une image Docker Récupération d'espace disque(2) ● Suppression des conteneurs arrêtés – ● Suppression des images non utilisées – ● docker rm -v $(docker ps -a -q -f status=exited) docker rmi $(docker images -f "dangling=true" -q) Suppression des volumes restants – Utilisation de l'image Docker (Docker Hub): ● martin/docker-cleanup-volumes docker run -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker –rm martin/docker-cleanup-volumes Lien Docker ● Possibilité de lier les conteneurs entre eux. ● Permet de faire abstraction des adresses TCP/IP. ● ● Un conteneur lié à un autre voit son fichier /etc/hosts modifié (adresse TCP/IP nom du conteneur). Commandes : – docker run -d --name nom [imageA] – docker run -d --link nom:nom [imageB] Correspond au nom donné à la commande précédente Le lien peut avoir un nom (alias) interne au conteneur différent Volumes Docker ● ● ● Possibilité de monter un volume ou un fichier local dans un conteneur. Tout ce qui est modifié par le conteneur est visible au niveau local et persistant. Volume local Commande : – Volume Docker docker run -d -v [/.../répertoire]:[/.../répertoire] [image] Conteneur Système d'exploitation volume volume Docker et la problématique réseau ● ● Un conteneur Docker peut être accédé depuis d'autres machines que celle qui l'héberge Plusieurs solutions – Exposition publique des ports de service ● A la condition d'avoir des services exposés par la commande EXPOSE dans le Dockerfile – Bind de la passerelle Docker sur l'interface réseau du host – Adressage fixe des conteneurs dans le réseau du host ou un réseau virtuel inter-hosts ● Outils pipework, weave Solution ports publics (1) ● Commande pour rendre tous les services d'un conteneur publics – docker run -d -P [image] – Docker crée des ports dans l'intervalle 49153 à 65535 sur le host et les mappe vers les ports du conteneur ● Tous les réseaux peuvent accéder 0.0.0.0:49153-->1530/tcp port sur le host Linux port du conteneur Docker Solution ports publics (2) ● Commande pour rendre le service d'un conteneur public avec choix du numéro de port – docker run -d -p [port:port] [image] – Exemple : ● docker run -d -p 1530:1530 lecoz/derby port sur le host Linux port du conteneur Docker Solution ports publics (3) ● Accès au(x) service(s) depuis une machine sur le réseau – Avec l'adresse TCP/IP du host qui héberge le conteneur Docker ● ● docker run -d -p 8080:8080 lecoz/tomcat Accès par http://192.168.0.20:8080 adresse du host Linux ● docker run -d -p 8080:8080 -p 9990:9990 lecoz/wildfly plusieurs ports possibles Composition de services ● Docker propose un outil de composition de services – ● Docker Compose Cet outil permet de composer une unité de service à partir de plusieurs conteneurs – Chaque composition masque la complexité du réseau de conteneurs – Chaque composition devient l'interface d'administration (surveillance des statuts, commandes, journalisation) – Chaque composition peut être gérée par une seule commande (start, stop, up, etc) Clusters Docker ● ● Des conteneurs Docker peuvent fonctionner sur plusieurs machines physiques et constituer une seule infrastructure Il existe deux solutions – ● Docker Swarm – ● Docker Swarm et Kubernetes C'est la solution native de clustering Docker. Elle permet de constituer un virtual host à partir de plusieurs machines physiques hébergeant des conteneurs Docker. Kubernetes – C'est la solution Google pour le clustering Docker (regroupement de conteneurs, load balancing, etc). – Orientation système distribué Les bénéfices apportés par Docker ● Déploiement et test continuel. – Même environnement en développement et en production. ● ● Environnement standardisé et contrôle de version. – Les conteneurs se comportent comme des dépôts GIT. ● ● Changement d'images et contrôle de version. Isolation. – ● Chaque conteneur possède ses propres dépendances. Les conteneurs sont isolés les uns des autres car autonomes en terme de dépendances et de ressources Sécurité. – Aucun accès aux processus des autres conteneurs (CPU, réseau). Montage de /proc et /sys en read only. Conclusion ● Docker est d'un usage très simple. ● Docker est bien adapté au développement logiciel – ● ● ● ● Installation, suppression, mise à jour, déploiement, test, supervision. Docker est donc une plateforme de choix pour l'approche DevOps. Il permet de facilement créer des images de conteneur à partir d'autres images (décoration). Docker s'intègre dans le Cloud (Amazon EC2, Google CE, OpenStack, IBM BlueMix, MicroSoft Azure, etc). Docker est un vecteur d'intégration.