Comment gérer la persistance et le stockage des conteneurs Docker
Docker est un service de conteneurisation, conçu pour exécuter des applications dans leur propre environnement sur n'importe quel système. Il est conçu pour être indépendant de la plate-forme, mais si vous avez besoin de stocker des données sur un disque, cela peut être fait avec des montages de volume et de liaison.
Sommaire
Utiliser une base de données externe ou un magasin d'objets
C'est la méthode que la plupart des gens recommanderont. Le stockage de l’état sous forme de fichier sur disque n’est pas conforme au modèle de Docker, et même s’il est possible de le faire, il est toujours préférable d’en tenir compte. En avez-vous vraiment besoin?
Par exemple, supposons que vous exécutiez une application Web dans Docker qui a besoin de stocker des données dans une base de données. Cela n’a pas beaucoup de sens d’exécuter MySQL dans un conteneur Docker, vous devez donc déployer MySQL sur RDS ou EC2 et que le conteneur Docker s'y connecte directement. Le conteneur Docker est entièrement sans état comme il est censé l'être; il peut être arrêté, démarré ou frappé avec un marteau, et un nouveau peut être tourné à sa place, le tout sans perte de données. À l'aide des autorisations IAM, cela peut être accompli en toute sécurité, entièrement dans votre VPC.
Si vous avez vraiment besoin de stocker des fichiers, tels que des photos et des vidéos téléchargées par l'utilisateur, vous devriez vraiment utiliser le service de stockage simple (S3) d'AWS. C'est beaucoup moins cher que le stockage basé sur EBS, et loin moins cher que le stockage EFS, qui est votre premier choix pour un système de fichiers partagé pour les conteneurs ECS. Plutôt que de stocker un fichier sur disque, vous téléchargez directement sur S3. Cette méthode vous permet également d'exécuter un traitement supplémentaire à l'aide des fonctions Lambda sur le contenu téléchargé, comme la compression d'images ou de vidéos, ce qui peut vous faire économiser beaucoup sur les coûts de bande passante.
Solution simple: monter un lecteur sur un conteneur
Docker propose deux méthodes pour obtenir la persistance: les montages de volume et les montages de liaison. Les montages de liaison vous permettent de monter un emplacement particulier sur le système de fichiers de votre serveur vers un emplacement à l'intérieur du conteneur Docker. Ce lien peut être en lecture seule, mais également en lecture / écriture, où les fichiers écrits par le conteneur Docker persisteront sur le disque.
Vous pouvez lier des répertoires hôtes individuels à des répertoires cibles dans le conteneur Docker, ce qui est utile, mais la méthode recommandée consiste à créer un nouveau «volume», géré par Docker. Cela facilite la sauvegarde, le transfert et le partage de volumes entre différentes instances de conteneurs.
Un mot d'avertissement: Si vous ne disposez pas d'un accès direct au serveur sur lequel vous exécutez Docker, comme c'est le cas avec les déploiements gérés comme Elastic Container Service (ECS) d'AWS et Kubernetes, vous devez faire attention à cela. Il est lié à l’espace disque du serveur, qui est généralement éphémère. Vous souhaiterez utiliser un magasin de fichiers externe comme EFS pour obtenir une réelle persistance avec ECS (nous en reparlerons plus tard).
Cependant, les montages de liaison et de volume fonctionnent bien si vous utilisez simplement Docker pour exécuter une installation facile d'une application sur votre serveur, ou si vous souhaitez simplement une persistance rapide à des fins de test. Dans tous les cas, la méthode de création de volumes sera la même quel que soit l’endroit où vous les stockez.
Vous pouvez créer un nouveau volume à partir de la ligne de commande avec:
docker volume create nginx-config
Et puis, lorsque vous allez exécuter votre conteneur Docker, liez-le à la cible dans le conteneur avec le --mount
drapeau:
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
Si vous courez docker inspect
, vous verrez le volume répertorié sous Mounts
section.
Si vous utilisez Docker Compose, la configuration est également simple. Ajoutez simplement un volumes
pour chaque service de conteneur dont vous disposez, puis mappez un nom de volume à un emplacement dans l'invité. Vous devrez également fournir une liste de volumes dans un niveau supérieur volumes
clé pour Compose à provisionner.
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-config:/etc/nginx/ volumes: nginx-config:
Cela créera automatiquement le volume pour ce Compose. Si vous souhaitez utiliser un volume prédéfini en dehors de Compose, spécifiez external: true
dans la configuration du volume:
volumes: cms-content: external: true
Si vous souhaitez simplement effectuer un montage en liaison et ne pas vous soucier des volumes, entrez simplement un nom de chemin à la place du nom de volume et ne définissez pas les noms de volume.
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - /docker/nginx-config/:/etc/nginx/
Vous pouvez lire la documentation complète de Docker sur l’utilisation des volumes avec Compose si votre cas d’utilisation nécessite quelque chose de plus spécifique que celui-ci.
Pour les déploiements gérés, utilisez un système de fichiers partagé (AWS EFS)
Si vous déployez sur AWS ECS, vous ne pourrez pas utiliser une liaison normale ou un montage de volume, car une fois que vous avez arrêté le conteneur, vous ne serez probablement pas exécuté sur la même machine la prochaine fois que vous le redémarrerez. , ce qui va à l'encontre du but de la persévérance.
Cependant, vous pouvez toujours obtenir la persistance à l'aide d'un autre service AWS: Elastic File System (EFS). EFS est un système de fichiers réseau partagé. Vous pouvez le monter sur plusieurs serveurs EC2 et les données accédées seront synchronisées sur tous. Par exemple, vous pouvez l'utiliser pour héberger le contenu statique et le code de votre site Web, puis exécuter tous vos nœuds de travail sur ECS pour gérer la diffusion réelle de votre contenu. Cela contourne la restriction de ne pas stocker de données sur disque, car le montage du volume est lié à un lecteur externe qui persiste dans les déploiements ECS.
Pour configurer cela, vous devez créer un système de fichiers EFS. Cette opération est assez simple et peut être effectuée à partir de la console de gestion EFS, mais vous souhaiterez noter l’ID de volume, car vous en aurez besoin pour fonctionner avec le volume.
Si vous devez ajouter ou modifier manuellement des fichiers dans votre volume EFS, vous pouvez le monter sur n'importe quelle instance EC2. Vous devrez installer amazon-efs-utils
:
sudo yum install -y amazon-efs-utils
Et puis montez-le avec la commande suivante, en utilisant l'ID:
sudo mount -t efs fs-12345678:/ /mnt/efs
De cette façon, vous pouvez directement afficher et modifier le contenu de votre volume EFS comme s'il s'agissait d'un autre disque dur sur votre serveur. Vous voudrez vous assurer que nfs-utils est installé pour que tout fonctionne correctement.
Ensuite, vous devrez connecter ECS à ce volume. Créez une nouvelle définition de tâche dans la console de gestion ECS. Faites défiler vers le bas et sélectionnez «Configurer via JSON». Ensuite, remplacez la clé «volumes» vide par le JSON suivant, en ajoutant la clé «famille» à la fin:
"volumes": ( { "name": "efs-demo", "host": null, "dockerVolumeConfiguration": { "autoprovision": true, "labels": null, "scope": "shared", "driver": "local", "driverOpts": { "type": "nfs", "device": ":/", "o": "addr=fs-XXXXXX.efs.us-east-1.amazonaws.com,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport" } } } ), "family":"nginx",
Remplacer fs-XXXXXX.efs.us-east-1.amazonaws.com
avec l'adresse réelle de votre volume EFS. Vous devriez voir un nouveau volume:
Vous pouvez l'utiliser dans votre définition de conteneur en tant que point de montage. Sélectionnez «Ajouter un conteneur» (ou modifiez-en un existant), et sous «Stockage et journalisation», sélectionnez le volume nouvellement créé et spécifiez un chemin de conteneur.
Enregistrez la définition de la tâche et lorsque vous lancez un cluster avec cette nouvelle définition, tous les conteneurs pourront accéder à votre système de fichiers partagé.