Comment partager des données entre le conteneur Docker et l’hôte

introduction

En général, les conteneurs Docker sont éphémères et s’exécutent aussi longtemps que nécessaire pour que la commande émise dans le conteneur s’achève. Par défaut, toutes les données créées dans le conteneur ne sont disponibles que depuis le conteneur et uniquement pendant son exécution.

Les volumes Docker peuvent être utilisés pour partager des fichiers entre un système hôte et le conteneur Docker. Par exemple, supposons que vous souhaitiez utiliser l’image officielle de Docker Nginx et conserver une copie permanente des fichiers journaux de Nginx pour l’analyser ultérieurement. Par défaut, l'image Docker denginx sera journalisée dans le répertoire/var/log/nginxinside le conteneur Docker Nginx. Normalement, il n’est pas accessible depuis le système de fichiers hôte.

Dans ce didacticiel, nous verrons comment rendre les données de l’intérieur du conteneur accessibles sur la machine hôte.

Conditions préalables

Pour suivre cet article, vous aurez besoin d’un serveur Ubuntu 18.04 avec les éléments suivants:

Si vous êtes nouveau dans Docker, la sérieThe Docker Ecosystem fournit un aperçu détaillé des concepts clés.

[.note] #Note: Même si les prérequis donnent des instructions pour installer Docker sur Ubuntu 18.04, les commandesdocker pour les volumes de données Docker dans cet article devraient fonctionner sur d'autres systèmes d'exploitation tant que Docker est installé.
#

[[step-1 -—- bindmounting-a-volume]] == Étape 1 - Bindmounting a Volume

La commande suivante crée un répertoire appelénginxlogs dans le répertoire personnel de votre utilisateur actuel et le lie à/var/log/nginx dans le conteneur:

docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx

Prenons un moment pour examiner cette commande en détail:

  • --name=nginx nomme le conteneur afin que nous puissions y faire référence plus facilement.

  • -d détache le processus et l'exécute en arrière-plan. Sinon, nous ne ferions que regarder une invite Nginx vide et ne pourrions utiliser ce terminal tant que nous n’aurons pas tué Nginx.

  • -v ~/nginxlogs:/var/log/nginx configure un volume bindmount qui relie le répertoire/var/log/nginx depuis l'intérieur du conteneur Nginx au répertoire~/nginxlogs sur la machine hôte. Docker utilise un: pour séparer le chemin de l'hôte du chemin du conteneur, et le chemin de l'hôte vient toujours en premier.

  • -p 5000:80 configure une redirection de port. Le conteneur Nginx écoute par défaut sur le port80. Cet indicateur mappe le port80 du conteneur au port5000 sur le système hôte.

  • nginx spécifie que le conteneur doit être construit à partir de l'image Nginx, qui émet la commandenginx -g "daemon off" pour démarrer Nginx.

[.Remarque]##

Note: L'indicateur-v est très flexible. Il peut lier ou nommer un volume avec juste un léger ajustement de syntaxe. Si le premier argument commence par un/ ou~/, vous créez un bindmount. Supprimez cela et vous nommez le volume.

  • -v /path:/path/in/container monte le répertoire hôte,/path au/path/in/container

  • -v path:/path/in/container crée un volume nommépath sans relation avec l'hôte.

Pour plus d'informations sur les volumes nommés, voirHow to Share Data Between Docker Containers

[[step-2 -—- access-data-on-the-host]] == Étape 2 - Accès aux données sur l'hôte

Nous avons maintenant une copie de Nginx fonctionnant dans un conteneur Docker sur notre machine, et le port5000 de notre machine hôte est directement mappé à cette copie du port80 de Nginx.

Chargez l'adresse dans un navigateur Web, en utilisant l'adresse IP ou le nom d'hôte de votre serveur et le numéro de port:http://your_server_ip:5000. Tu devrais voir:

Nginx Start Page

Plus intéressant encore, si nous regardons dans le répertoire~/nginxlogs sur l'hôte, nous verrons lesaccess.log créés par lesnginx du conteneur qui afficheront notre requête:

cat ~/nginxlogs/access.log

Cela devrait afficher quelque chose comme:

Output203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-"
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"

Si vous apportez des modifications au dossier~/nginxlogs, vous pourrez également les voir de l'intérieur du conteneur Docker en temps réel.

Conclusion

Dans ce didacticiel, nous avons montré comment créer un volume de données Docker pour partager des informations entre un conteneur et le système de fichiers hôte. Cela est utile dans les environnements de développement, où il est nécessaire d'avoir accès aux journaux pour le débogage. Pour en savoir plus sur le partage de données persistantes entre conteneurs, jetez un œil àHow To Share Data between Docker Containers.