Série de webinaires: Premiers pas avec les conteneurs

[.Remarque]##

Cet article complète unwebinar series on deploying and managing containerized workloads in the cloud. La série couvre les éléments essentiels des conteneurs, y compris la gestion du cycle de vie des conteneurs, le déploiement d'applications multi-conteneurs, la mise à l'échelle des charges de travail et la compréhension de Kubernetes, ainsi que la mise en évidence des meilleures pratiques pour exécuter des applications avec état.

Ce didacticiel comprend les concepts et commandes abordés dans la première session de la série, Prise en main des conteneurs.

introduction

Docker est une plateforme pour déployer et gérer des applications conteneurisées. Les conteneurs sont populaires parmi les développeurs, les administrateurs et les ingénieurs de devops en raison de la flexibilité qu'ils offrent.

Docker a trois composants essentiels:

  • Moteur Docker

  • Outils Docker

  • Registre Docker

Docker Engine fournit les capacités principales de gestion des conteneurs. Il s'interface avec le système d'exploitation Linux sous-jacent pour exposer des API simples permettant de gérer le cycle de vie des conteneurs.

Les outils Docker sont un ensemble d’outils de ligne de commande qui communiquent avec l’API exposée par le moteur Docker. Ils sont utilisés pour exécuter les conteneurs, créer de nouvelles images, configurer le stockage et les réseaux et effectuer de nombreuses autres opérations ayant une incidence sur le cycle de vie d'un conteneur.

Le registre Docker est l'endroit où les images de conteneur sont stockées. Chaque image peut avoir plusieurs versions identifiées par des balises uniques. Les utilisateurs extraient des images existantes du registre et y poussent de nouvelles images. Docker Hub est un registre hébergé géré parDocker, Inc.. Il est également possible d’exécuter un registre dans vos propres environnements pour garder les images plus près du moteur.

À la fin de ce didacticiel, vous aurez installé Docker sur un droplet DigitalOcean, des conteneurs gérés, travaillé avec des images, ajouté de la persistance et créé un registre privé.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Par défaut, la commandedocker nécessite des privilèges root. Cependant, vous pouvez exécuter la commande sans le préfixesudo en exécutantdocker en tant qu'utilisateur dans le groupedocker.

Pour configurer votre Droplet de cette manière, exécutez la commandesudo usermod -aG docker ${USER}. Cela ajoutera l'utilisateur actuel au groupedocker. Ensuite, exécutez la commandesu - ${USER} pour appliquer la nouvelle appartenance au groupe.

Ce didacticiel s'attend à ce que votre serveur soit configuré pour exécuter la commandedocker sans le préfixesudo.

Étape 1 - Installation de Docker

Après SSHing dans le droplet, exécutez les commandes suivantes pour supprimer tous les packages existants liés à docker éventuellement installés, puis installez Docker à partir du référentiel officiel:

sudo apt-get remove docker docker-engine docker.io
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

Après avoir installé Docker, vérifiez l’installation à l’aide des commandes suivantes:

docker info

La commande ci-dessus affiche les détails de Docker Engine déployé dans l'environnement. La commande suivante vérifie que les outils Docker sont correctement installés et configurés. Il devrait imprimer la version de Docker Engine et de Tools.

docker version

Étape 2 - Lancement de conteneurs

Les conteneurs Docker sont lancés à partir d'images existantes stockées dans le registre. Les images dans Docker peuvent être stockées dans des référentiels privés ou publics. Les référentiels privés exigent que les utilisateurs s'authentifient avant d'extraire des images. Toute personne peut accéder aux images publiques.

Pour rechercher une image nomméehello-world, exécutez la commande:

docker search hello-world

Il peut y avoir plusieurs images correspondant au nomhello-world. Choisissez celui avec le nombre maximal d'étoiles, ce qui indique la popularité de l'image.

Vérifiez les images disponibles dans votre environnement local avec la commande suivante:

docker images

Comme nous n’avons encore lancé aucun conteneur, il n’y aura pas d’images. Nous pouvons maintenant télécharger l'image et l'exécuter localement:

docker pull hello-world
docker run hello-world

Si nous exécutons la commandedocker run sans extraire l'image, Docker Engine tirera d'abord l'image, puis l'exécutera. L'exécution de la commandedocker images montre à nouveau que nous avons l'image dehello-world disponible localement.

Lançons un conteneur plus significatif: un serveur Web Apache.

docker run -p 80:80 --name web -d httpd

Vous remarquerez peut-être des options supplémentaires passées à la commandedocker run. Voici une explication de ces commutateurs:

  • -p - Cela indique à Docker Engine d'exposer le port80 du conteneur sur le port80 de l'hôte. Comme Apache écoute sur le port80, nous devons l'exposer sur le port hôte.

  • --name - Ce commutateur attribue un nom à notre conteneur en cours d'exécution. Si nous l'omettons, Docker Engine attribuera un nom aléatoire.

  • -d - Cette option indique à Docker Engine d'exécuter le conteneur en mode détaché. Sans cela, le conteneur sera lancé au premier plan, bloquant l'accès au shell. En poussant le conteneur en arrière-plan, nous pouvons continuer à utiliser le shell tant que le conteneur est en cours d'exécution.

Pour vérifier que notre conteneur fonctionne bien en arrière-plan, essayez cette commande:

docker ps

La sortie montre que le conteneur nomméweb s'exécute avec le port80 mappé au port hôte80.

Maintenant, accédez au serveur Web:

curl localhost

Arrêtons et supprimons le conteneur en cours d’exécution avec les commandes suivantes:

docker stop web
docker rm web

L'exécution dedocker ps confirme à nouveau que le conteneur est terminé.

Étape 3 - Ajout de stockage aux conteneurs

Les conteneurs sont éphémères, ce qui signifie que tout ce qui est stocké dans un conteneur sera perdu lors de la fermeture du conteneur. Pour conserver des données au-delà de la durée de vie d'un conteneur, nous devons attacher un volume au conteneur. Les volumes sont des répertoires du système de fichiers hôte.

Commencez par créer un nouveau répertoire sur l'hôte:

mkdir htdocs

Lançons maintenant le conteneur avec un nouveau commutateur pour monter le répertoirehtdocs, en le pointant vers la racine du document du serveur Web Apache:

docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

Le commutateur-v pointe le répertoirehtdocs du conteneur vers le système de fichiers de l'hôte. Toute modification apportée à ce répertoire sera visible aux deux emplacements.

Accédez au répertoire à partir du conteneur en exécutant la commande:

docker exec -it web /bin/bash

Cette commande attache notre terminal à la coque des conteneurs en mode interactif. Vous devriez voir que vous êtes maintenant déposé dans le conteneur.

Accédez au dossierhtdocs et créez un fichier HTML simple. Enfin, quittez le shell pour revenir à l'hôte:

cd /usr/local/apache2/htdocs
echo '

Hello World from Container

' > index.html exit

L'exécution de la commandecurl localhost montre à nouveau que le serveur Web renvoie la page que nous avons créée.

Nous pouvons non seulement accéder à ce fichier à partir de l'hôte, mais nous pouvons également le modifier:

cd htdocs
cat index.html
echo '

Hello World from Host

' | sudo tee index.html >/dev/null

L'exécution decurl localhost confirme à nouveau que le serveur Web sert la dernière page créée à partir de l'hôte.

Terminez le conteneur avec la commande suivante. (Le-f force Docker à se terminer sans s'arrêter au préalable.)

docker rm -f web

Étape 4 - Création d'images

En plus d'exécuter des images existantes à partir du registre, nous pouvons créer nos propres images et les stocker dans le registre.

Vous pouvez créer de nouvelles images à partir de conteneurs existants. Les modifications apportées au conteneur sont d'abord validées, puis les images sont étiquetées et transmises au registre.

Lançons à nouveau le conteneurhttpd et modifions le document par défaut:

docker run -p 80:80 --name web -d httpd
docker exec -it web /bin/bash
cd htdocs
echo '

Welcome to my Web Application

' > index.html exit

Le conteneur s'exécute maintenant avec unindex.html personnalisé. Vous pouvez le vérifier aveccurl localhost.

Avant de valider le conteneur modifié, il est judicieux de l’arrêter. Après l’arrêt, nous lancerons la commande commit:

docker stop web
docker commit web doweb

Confirmez la création de l'image avec la commandedocker images. Il montre l'image dedowebque nous venons de créer.

Pour marquer et stocker cette image dans Docker Hub, exécutez les commandes suivantes pour transférer votre image dans le registre public:

docker login
docker tag your_docker_hub_username/doweb
docker push your_docker_hub_username/doweb

Vous pouvez vérifier la nouvelle image en effectuant une recherche dans Docker Hub à partir du navigateur ou de la ligne de commande.

Étape 5 - Lancement d'un registre privé

Il est possible d'exécuter le registre dans des environnements privés pour sécuriser davantage les images. Cela réduit également la latence entre le moteur Docker et le référentiel d'images.

Docker Registry est disponible en tant que conteneur pouvant être lancé comme n'importe quel autre conteneur. Dans la mesure où le registre contient plusieurs images, il est conseillé d’y attacher un volume de stockage.

docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

Notez que le conteneur est lancé en arrière-plan avec le port5000 exposé et le répertoireregistry mappé au système de fichiers hôte. Vous pouvez vérifier que le conteneur est en cours d'exécution en exécutant la commandedocker ps.

Nous pouvons maintenant marquer une image locale et la transférer dans le registre privé. Commençons par extraire le conteneurbusybox de Docker Hub et étiquetons-le.

docker pull busybox
docker tag busybox localhost:5000/busybox
docker images

La commande précédente confirme que le conteneurbusybox est désormais balisé aveclocalhost:5000, donc poussez l'image vers le registre privé.

docker push localhost:5000/busybox

Avec l’image transmise au registre local, essayons de la supprimer de l’environnement et de la retirer du registre.

docker rmi -f localhost:5000/busybox
docker images
docker pull localhost:5000/busybox
docker images

Nous avons parcouru le cercle complet en tirant l'image, en la marquant, en l'envoyant au registre local et, finalement, en la retirant.

Dans certains cas, vous voudrez peut-être exécuter le registre privé sur un hôte dédié. Docker Engine s'exécutant sur différentes machines communiquera avec le registre distant pour extraire et pousser les images.

Le registre n'étant pas sécurisé, nous devons modifier la configuration de Docker Engine pour permettre l'accès à un registre non sécurisé. Pour ce faire, éditez le fichierdaemon.json situé à/etc/docker/daemon.json. Créez le fichier s’il n’existe pas.

Ajoutez l'entrée suivante:

Modification de /etc/docker/daemon.json

{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

RemplacezREMOTE_REGISTRY_HOST par le nom d'hôte ou l'adresse IP du registre distant. Redémarrez Docker Engine pour vous assurer que les modifications de configuration sont appliquées.

Conclusion

Ce tutoriel vous a aidé à démarrer avec Docker. Il couvrait les concepts essentiels, notamment l'installation, la gestion des conteneurs, la gestion des images, le stockage et le registre privé. Les prochaines sessions et articlesin this series vous aideront à aller au-delà des bases de Docker.