Docker à partir du sol Travailler avec des conteneurs, 2e partie

Ceci est la deuxième partie d'une série en deux parties sur le travail avec les conteneurs Docker. Dans la première partie, nous nous sommes concentrés sur les nombreuses façons et options d'exécuter une image et sur la manière dont l'hôte peut interagir avec un conteneur Docker.. 

Dans cette 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. En particulier, vous apprendrez la différence entre les conteneurs en cours d’exécution et les conteneurs arrêtés et comment contrôler avec précision les informations à afficher lorsque vous répertoriez vos conteneurs en les filtrant et les formatant.. 

Vous obtiendrez ensuite une expérience pratique en arrêtant, en démarrant, en redémarrant et en fixant vos conteneurs. Enfin, vous allez exécuter des commandes uniques et obtenir un accès shell interactif à un conteneur en cours d'exécution.. 

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. 

Liste des conteneurs

Lorsque vous travaillez avec des conteneurs, vous souhaitez souvent répertorier, afficher et filtrer vos conteneurs. le docker ps la commande est la clé, et il a plusieurs options intéressantes.

Conteneurs en cours d'exécution

La commande la plus élémentaire est simple docker ps sans argument, qui montre tous les conteneurs en cours d'exécution.

$ docker ps COMMANDE D'IMAGE D'IDENTIFIANT CRÉÉE STATUT PORTS NOMS 2f542e1cb88b nginx "nginx -g 'daemon…" Il y a 12 heures Up 12 heures 443 / tcp, 0.0.0.0:9000->80/tcp nginx 

Vous obtenez de nombreuses informations sur chaque conteneur, notamment son identifiant, son image, sa commande, sa date de création, son statut actuel, ses ports et ses noms. C'est un peu difficile à analyser à cause de l'emballage. Nous verrons plus tard comment filtrer et formater la sortie. Notez que la commande est tronquée (ainsi que l'identifiant du conteneur). Pour afficher la commande complète, ajoutez --pas de tronc:

$ docker ps --no-trunc COMMANDE IMAGE nginx "nginx -g 'daemon off;'" 

Maintenant, la commande complète est visible: nginx -g 'daemon off;'

Tous les conteneurs

Comme vous vous en souvenez, Docker conserve les conteneurs arrêtés (sauf si vous les avez exécutés avec --rm). Ajouter -une montre tous les conteneurs:

$ docker ps -a CONTAINER ID IMAGE STATUS NOM cc797c61dc21 busybox Exigé busybox 67f3cb5a9647 busybox Exit ecstatic_jones 898fb562e535 hello-world Sorti du disque

Mise en forme

La sortie de docker ps peut être trop verbeux et montre souvent beaucoup de champs qui ne sont pas intéressants. Vous pouvez utiliser le formatage Go-template pour afficher uniquement les champs qui vous intéressent. Voici simplement le nom et la commande:

$ docker ps --no-trunc --format '.Names \ t . Command' nginx "nginx -g 'démon inactif;'" 

Cela fonctionne, mais pour le présenter avec les noms de champs, ajoutez "table" au début de la chaîne de format:

$ docker ps -a --no-trunc --format 'table .Names \ t Command' COMMANDES DE NOMS busybox "cat /data/1.txt" ecstatic_jones "cat / data / 1. txt "hopeful_spence" / bonjour "infallible_curie" ls -la "nginx" nginx -g 'daemon off;' " 

Le nom de format de l'ID de conteneur (non sélectionné ici) est .ID (toutes en majuscules).

Filtration

le docker ps La commande prend en charge de nombreux filtres. Ils sont assez simples à utiliser. La syntaxe est -F "=". Les filtres pris en charge sont id, label, nom, exit, status, ancêtre, avant, depuis, isolation, réseau et santé..

Voici un filtrage par nom de conteneur et en affichant uniquement le conteneur busybox:

$ docker ps -a -f "name = busybox" \ --format 'table .ID \ t . Status \ t . Names' NOMS D'ETAT DU CONTAINER ID cc797c61dc21 Exited (0) Il y a 11 minutes busybox

Le drapeau -q

Si tout ce que vous voulez, c'est l'identifiant du conteneur, utilisez la commande -q drapeau (drapeau calme). C'est plus simple que --format 'table .ID'. Cela est souvent nécessaire lorsque vous souhaitez effectuer des opérations sur plusieurs conteneurs (vous en verrez un exemple plus tard)..

$ docker ps -aq cc797c61dc21 67f3cb5a9647 898fb562e535 6dd210fda2d8 2f542e1cb88b 

Arrêt, démarrage et redémarrage de conteneurs

Vous pouvez arrêter les conteneurs en cours d'exécution et démarrer un conteneur arrêté. Il existe plusieurs différences entre le démarrage d'un conteneur arrêté et l'exécution d'une nouvelle instance de la même image:

  • Vous utilisez les mêmes variables d'environnement, volumes, ports et autres arguments de la commande d'exécution d'origine.
  • Vous n'êtes pas obligé de créer encore un autre conteneur.
  • Si l'instance arrêtée a modifié son système de fichiers, le conteneur démarré utilisera le même.

Arrêtons le nginx conteneur et ensuite le démarrer. Lorsque vous faites référence à un conteneur, vous pouvez utiliser son nom ou un préfixe non ambigu de son identifiant. Je nomme généralement mes conteneurs de longue durée, j'ai donc un descriptif significatif et je n'ai pas à gérer les noms générés automatiquement par Docker ni les préfixes d'identifiant de conteneurs..

$ docker stop nginx nginx $ docker ps -a -f "nom = nginx" --format 'table .Names \ t . Status' NOMS STATUS nginx exilés (0) il y a 2 minutes 

D'ACCORD. Nginx est arrêté (statut "Exited"). Commençons le:

$ docker start nginx nginx $ docker ps -a -f "nom = nginx" --format 'table .Names \ t . Status' NOMS STATUS nginx Jusqu'à 33 secondes 

Le redémarrage d'un conteneur en cours d'exécution est une autre option, équivalente à arrêt du docker suivi par début de docker.

$ docker redémarrer nginx

nginx $ docker ps -a -f "nom = nginx" --format 'table .Names \ t . Status' NOMS STATUS nginx Jusqu'à 2 secondes 

Attachement à un conteneur en cours d'exécution

Lorsque vous démarrez un conteneur arrêté ou si vous avez exécuté votre conteneur en mode détaché (-ré argument de ligne de commande), vous ne pouvez pas voir la sortie. Mais vous pouvez y attacher.

$ docker attach nginx 172.17.0.1 - - [19 mars / 2017: 08: 40: 03 +0000] "HEAD / HTTP / 1.1" 200 0 "-" "HTTPie / 0.8.0" "-" 

Retrait des conteneurs

Vous pouvez supprimer les conteneurs arrêtés avec la commande:  docker rm

$ docker rm ecstatic_jones ecstatic_jones 

Si vous souhaitez supprimer un conteneur en cours d'exécution, vous pouvez soit l'arrêter d'abord, soit utiliser le -F (force) argument de ligne de commande:

$ docker rm -nginx Réponse d'erreur du démon: Vous ne pouvez pas supprimer un conteneur en cours d'exécution 3dbffa955f906e427298fbeb3eadfd229d64365dd880c9771a31b0aedb879d6d. Arrêtez le conteneur avant d’essayer de le supprimer ou utilisez -f $ docker rm -f -nginx nginx 

Si vous souhaitez supprimer tous les conteneurs, voici un bel extrait:

docker rm -f $ (docker ps -aq)

Si vous souhaitez supprimer uniquement le conteneur arrêté, supprimez le -F (force) drapeau.

Exécution d'une commande dans un conteneur en cours d'exécution

Docker exécute un seul processus dans un conteneur, mais vous pouvez exécuter des commandes supplémentaires sur un conteneur en cours d'exécution. Cela ressemble beaucoup à fournir une commande personnalisée à docker run commande, sauf que dans ce cas, il est exécuté côte à côte avec la commande run.

Commandes simples

Exécuter une commande simple se fait via docker exec. Vous fournissez un identifiant ou un nom de conteneur en cours d'exécution et la commande que vous souhaitez exécuter. Voyons la nginx.conf déposer à l'intérieur du nginx conteneur et voir combien de processus de travail sont configurés.

$ docker exec nginx cat /etc/nginx/nginx.conf | grep worker_processes worker_processes 1; 

Shell interactif

L'une des meilleures techniques de dépannage avec les conteneurs Docker consiste à se connecter à un shell interactif et à simplement explorer le système de fichiers interne. Pour attacher stdin et avoir un tty, vous devez fournir le -il arguments de ligne de commande (peuvent être regroupés comme -il) puis le nom d'un exécutable shell (généralement frapper). 

Vous vous retrouvez avec un accès shell à votre conteneur. Voici un exemple de vérification interactive des processus de travail depuis "l'intérieur" du conteneur..

$ docker exec -it nginx bash root @ b010e854bb98: / # cat /etc/nginx/nginx.conf | grep worker_processes worker_processes 1; root @ b010e854bb98: / # 

Conclusion

Docker est une plate-forme puissante, et comme le conteneur est son unité de travail, il fournit de nombreux outils pour gérer et travailler avec des conteneurs. J'ai décrit la plupart des aspects importants de l'utilisation de conteneurs, mais il existe de nombreuses fonctionnalités, options et nuances plus avancées dans les commandes que j'ai décrites, ainsi que des commandes supplémentaires.. 

Si vous travaillez en étroite collaboration avec les conteneurs Docker, prenez le temps de plonger et d'apprendre tout sur eux. Il va payer élégamment.