Docker à partir du sol Travailler avec des conteneurs, 1ère partie

Il s’agit de la première partie d’une série de travaux en deux parties sur les conteneurs Docker. Dans cette partie, nous allons nous concentrer sur les nombreuses façons et options permettant d'exécuter une image et sur la manière dont l'hôte peut interagir avec un conteneur Docker.. 

Dans la deuxième partie, nous aborderons la liste, le démarrage, l’arrêt et le redémarrage de conteneurs ainsi que l’exécution de commandes sur des conteneurs en cours d’exécution. Les images Docker sont les unités de déploiement. Lorsque vous exécutez une image, vous instanciez un conteneur Docker qui exécute un processus unique dans son propre environnement isolé pour le système de fichiers, la mise en réseau et les processus.. 

Les conteneurs Docker sont très flexibles et permettent de nombreux cas d'utilisation trop lourds, complexes et / ou coûteux avec d'autres technologies telles que les machines virtuelles et les serveurs sans système d'exploitation..

Avant de commencer, assurez-vous que Docker est correctement installé dans votre environnement. Selon son installation et votre utilisateur, vous devrez peut-être l'exécuter en tant que sudo. Je vais sauter le sudo. 

Exécuter une image

Vous lancez un conteneur Docker en exécutant une image. Il existe plusieurs manières d’exécuter un conteneur qui affectent la facilité de gestion de tous les conteneurs. Lorsque le conteneur démarre, il exécute généralement la commande définie dans le fichier Docker. Voici le fichier Docker pour le conteneur hello-world:

FROM scratch COPY hello / CMD ["/ hello"] 

La commande exécute simplement le binaire "hello" copié à la racine du conteneur lors de la création de l'image..

Premier plan vs détaché

Un conteneur peut être exécuté à l'avant-plan, où il est bloqué jusqu'à ce que le processus se termine et que le conteneur cesse de s'exécuter. En mode avant-plan, le conteneur imprime sa sortie sur la console et peut lire une entrée standard. En mode détaché (lorsque vous fournissez l'indicateur -d), le contrôle retourne immédiatement et le conteneur 

Exécuter un conteneur sans nom

Le moyen le plus simple d'exécuter un conteneur est: docker run .

Lorsque vous exécutez un conteneur à l'aide de cette commande, Docker lui attribue un nom composé de deux mots aléatoires. Par exemple: docker run bonjour-monde.

Si vous avez déjà l'image hello-world, Docker l'exécutera. Si vous ne le faites pas, il le tirera du DockerHub, le référentiel officiel de Docker, puis l'exécutera. La sortie devrait ressembler à:

Bonjour de Docker! Ce message indique que votre installation semble fonctionner correctement. Pour générer ce message, Docker a procédé comme suit: 1. Le client Docker a contacté le démon Docker. 2. Le démon Docker a extrait l'image "hello-world" du hub Docker. 3. Le démon Docker a créé un nouveau conteneur à partir de cette image, qui exécute le fichier exécutable qui produit la sortie que vous lisez actuellement. 4. Le démon Docker a transmis cette sortie au client Docker, qui l’a envoyé à votre terminal. Pour essayer quelque chose de plus ambitieux, vous pouvez exécuter un conteneur Ubuntu avec: $ docker run -it ubuntu bash Partagez des images, automatisez les flux de travail et bien plus encore avec un ID Docker gratuit: https://cloud.docker.com/ Pour plus d'exemples et des idées, visitez: https://docs.docker.com/engine/userguide/ 

Le programme hello se ferme après l'affichage du message, ce qui termine le processus en cours dans le conteneur et met fin à l'exécution du conteneur. Le conteneur reste en place au cas où vous souhaiteriez vous y connecter, examiner les journaux ou toute autre chose. Pour afficher le conteneur, vous pouvez exécuter la commande suivante:

docker ps -a --format "table .ID \ t . Status \ t . Names" IDENTIFIANT DES NOMS D'ETAT 8e2e491accb5 Exit (0) Il y a 2 minutes clever_liskov

J'expliquerai plus tard comment lister les conteneurs et toutes les options pertinentes. Pour l'instant, concentrons-nous sur la section Noms. Docker a généré le nom "clever_liskov" automatiquement et je dois l'utiliser ou l'identifiant du conteneur pour faire référence à ce conteneur à des fins telles que le redémarrer, le supprimer ou l'exécution d'une commande..

Exécuter un conteneur nommé

L'utilisation d'identifiants de conteneur ou de noms générés automatiquement est parfois gênante. Si vous interagissez fréquemment avec un conteneur que vous recréez fréquemment, un identifiant et un nom générés automatiquement seront alors obtenus. En outre, le nom sera aléatoire. 

Docker vous permet de nommer vos conteneurs lorsque vous les exécutez en fournissant un "--nom "argument de ligne de commande. Dans les cas simples, où vous n’avez qu’un conteneur par image, vous pouvez le nommer après votre image: docker run --name hello-world hello-world.

Maintenant, si on regarde le processus (j'ai enlevé clever_liskov plus tôt), nous verrons que le conteneur s'appelle hello-world:

docker ps -a --format "table .ID \ t . Names" NOMS D'IDENTIFIANT DE CONTENANT f6fe77b3b6e8 hello-world 

Un conteneur nommé présente plusieurs avantages:

  • Vous avez un nom stable pour vos conteneurs que vous utilisez de manière interactive et dans des scripts.
  • Vous pouvez choisir un nom significatif.
  • Vous pouvez choisir un nom court pour plus de commodité lorsque vous travaillez de manière interactive..
  • Cela vous évite d'avoir accidentellement plusieurs conteneurs de la même image (tant que vous fournissez toujours le même nom).

Regardons la dernière option. Si j'essaie d'exécuter à nouveau la même commande d'exécution avec le même nom "hello-world", j'obtiens un message d'erreur clair:

docker run --name hello-world docker hello-world: Réponse d'erreur du démon: Conflict. Le nom de conteneur "/ hello-world" est déjà utilisé par le conteneur f6fe77b3b6e8e77ccf346c32c599e67b2982893ca39f0415472c2949cacc4a51. Vous devez supprimer (ou renommer) ce conteneur pour pouvoir réutiliser ce nom. Voir 'docker run --help'. 

Exécution d'une image à suppression automatique

Les conteneurs collent par défaut. Parfois, vous n'en avez pas besoin. Au lieu de supprimer manuellement les conteneurs sortis, vous faites en sorte que le conteneur s'en aille tout seul. le --rm argument de ligne de commande fait le tour: docker run --rm hello-world.

Exécuter une commande différente

Par défaut, Docker exécute la commande spécifiée dans le fichier Docker utilisé pour construire l'image (ou directement le point d'entrée si aucune commande n'est trouvée). Vous pouvez toujours le remplacer en fournissant votre propre commande à la fin de la commande d'exécution. Courons ls -la sur le busybox image (le Bonjour le monde l'image n'a pas ls exécutable):

docker run busybox ls -la total 44 drwxr-xr-x 18 racine 4096 18 mars 17h06. drwxr-xr-x 18 racine 4096 18 mars 17h06… -rwxr-xr-x 1 racine racine 0 mars 18 17h06 .dockerenv drwxr-xr-x 2 racine racine 12288 9 mars 00 005 bin drwxr-xr -x 5 racine racine 340 mars 18 17h06 dev drwxr-xr-x 2 racine racine 4096 18 mars 17h06 etc drwxr-xr-x 2 personne nogroup 4096 9 mars 00:05 maison dr-xr-xr-x 85 racine racine 0 mars 18 17h06 proc drwxr-xr-x 2 racine racine 4096 9 mars 9 00h05 racine dr-xr-xr-x 13 racine racine 0 mars 18 17h06 sys drwxrwxrwt 2 racine racine 4096 mars 9 00: 05 tmp drwxr-xr-x 3 racine racine 4096 9 mars 00:05 usr drwxr-xr-x 4 racine racine 4096 9 mars 9 00:05 var 

Interagir avec l'hôte

Les conteneurs Docker exécutent des processus isolés dans leur propre petit monde. Mais il est souvent nécessaire et utile de donner accès à l'hôte.

Passage de variables d'environnement à un conteneur

Les conteneurs Docker n'héritent pas automatiquement de l'environnement du processus hôte qui les a exécutés. Vous devez explicitement fournir des variables d’environnement au conteneur lorsque vous l’exécutez à l’aide de la commande -e indicateur de ligne de commande. Vous pouvez transmettre plusieurs variables d'environnement. Voici un exemple: 

docker run --rm -it -e ENV_FROM_HOST = "123" busybox / # env HOSTNAME = 8e7672bce5a7 SHLVL = 1 HOME = / racine ENV_FROM_HOST = 123 TERM = xterm PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin PWD = / / # 

La première ligne exécute le conteneur busybox, en lui passant le ENV_FROM_HOST variable, puis à l'intérieur du conteneur en cours d'exécution env montre que le ENV_FROM_HOST est correctement réglé.

Vous pouvez également utiliser des variables d'environnement hôte. Ceci définit quelques variables d'environnement hôte et les utilise dans la commande d'exécution:

$ export VAR_1 = 1 $ export VAR_2 = 2 $ docker exécuté --rm -it -e VAR_1 = "$ VAR_1" -e VAR_2 = "$ VAR_2" busybox

À l'intérieur du conteneur, ils sont maintenant visibles:

/ # env | grep VAR VAR_1 = 1 VAR_2 = 2 

Monter des répertoires d'hôtes

L'une des interactions les plus utiles est le montage des répertoires hôtes. Cela permet plusieurs cas d'utilisation intéressants:

  • Stockage partagé entre des conteneurs s'exécutant sur le même hôte.
  • Affichage et édition de fichiers à l'aide de votre environnement hôte et de vos outils, ainsi que des fichiers du conteneur.
  • Persistance au niveau de l'hôte au-delà de la durée de vie d'un conteneur.

Ici, je crée un fichier sur l'hôte: $ echo "Ouais, ça marche!" > ~ / data / 1.txt

Puis je lance le busybox image de montage ~ / répertoire de données à /Les données dans le conteneur et en affichant le contenu du fichier à l'écran:

$ docker run --rm -v ~ / data: / data busybox cat /data/1.txt Ouais, ça marche! 

J'ai utilisé le cat /data/1.txt commander ici.

Exposer les ports à l'hôte

Si vous exposez un port dans votre fichier Docker à l’aide de EXPOSER, il ne sera accessible qu'aux autres conteneurs de docker. Pour le rendre accessible sur l'hôte, vous devez utiliser le -p argument de ligne de commande. La syntaxe est -p :.

Voici la course nginx image, qui expose le port 80 et utilise le -p argument de ligne de commande pour le rendre visible sur l'hôte sur le port 9000: 

exécution du menu fixe --nom nginx --rm -d -p 9000: 80 nginx

Notez que contrairement aux commandes précédentes qui ont exécuté certaines tâches et qui ont abouti, le conteneur nginx continuera à fonctionner et à écouter les demandes entrantes. Vérifions que nginx est vraiment opérationnel et qu'il répond aux requêtes sur le port 9000. Je préfère l'excellent client HTTP httpie à curl pour atteindre les serveurs Web et les services à partir de la ligne de commande:

http HEAD localhost: 9000 HTTP / 1.1 200 OK Accept-Ranges: octets Connexion: keep-alive Content-Length: 612 Content-Type: text / html Date: dim, 19 mars 2017 07:35:55 ​​GMT ETag: "58a323e4- 264 "Dernière mise à jour: mar., 14 févr. 2017 15:36:04 GMT Server: nginx / 1.11.10 

Conclusion

Il existe de nombreuses façons d’exécuter une image Docker pour créer un conteneur et de nombreuses options. Chaque combinaison prend en charge une utilisation particulière. Il est très utile, lorsque vous travaillez avec des conteneurs Docker, de bien saisir les détails et d'utiliser la meilleure méthode pour lancer vos conteneurs.. 

De plus, la connexion de volumes d’hôte ainsi que les ports d’exposition et de publication permettent une intégration étroite avec l’hôte et une pléthore de scénarios d’utilisation. Dans la deuxième partie, nous allons nous intéresser à la gestion d’une série de conteneurs et à l’exploitation optimale de la puissance fournie par Docker..