Comment les utilisateurs gèrent-ils le stockage persistant de vos conteneurs Docker?
J'utilise actuellement cette approche: construire l'image, par exemple pour PostgreSQL, puis démarrer le conteneur avec
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
À mon humble avis, cela a l'inconvénient, que je ne dois jamais (par accident) supprimer le conteneur "c0dbc34fd631".
Une autre idée serait de monter les volumes d'hôte "-v" dans le conteneur, cependant, l' ID utilisateur dans le conteneur ne correspond pas nécessairement à l' ID utilisateur de l'hôte, puis les autorisations peuvent être gâchées.
Remarque: Au lieu de --volumes-from 'cryptic_id'
vous pouvez également utiliser --volumes-from my-data-container
où my-data-container
est un nom que vous avez attribué à un conteneur de données uniquement, par exemple docker run --name my-data-container ...
(voir la réponse acceptée)
la source
--name
. vous avez-name
Réponses:
Docker 1.9.0 et supérieur
Utiliser l' API de volume
Cela signifie que le modèle de conteneur de données uniquement doit être abandonné au profit des nouveaux volumes.
En fait, l'API de volume n'est qu'un meilleur moyen de réaliser ce qui était le modèle de conteneur de données.
Si vous créez un conteneur avec un
-v volume_name:/container/fs/path
Docker créera automatiquement un volume nommé pour vous qui peut:docker volume ls
docker volume inspect volume_name
--volumes-from
connexionLa nouvelle API de volume ajoute une commande utile qui vous permet d'identifier les volumes pendants:
Et puis supprimez-le par son nom:
Comme le souligne @mpugach dans les commentaires, vous pouvez vous débarrasser de tous les volumes suspendus avec un joli one-liner:
Docker 1.8.x et inférieur
L'approche qui semble fonctionner le mieux pour la production consiste à utiliser un conteneur de données uniquement .
Le conteneur de données uniquement est exécuté sur une image barebones et ne fait rien, sauf exposer un volume de données.
Ensuite, vous pouvez exécuter n'importe quel autre conteneur pour avoir accès aux volumes du conteneur de données:
Dans ce billet de blog, il y a une bonne description du soi-disant conteneur en tant que modèle de volume qui clarifie le point principal d'avoir uniquement des conteneurs de données .
La documentation Docker a maintenant la description DEFINITIVE du conteneur en tant que modèle de volume / s .
Voici la procédure de sauvegarde / restauration pour Docker 1.8.x et versions antérieures.
SAUVEGARDE:
RESTAURER:
Voici un bel article de l'excellent Brian Goff expliquant pourquoi il est bon d'utiliser la même image pour un conteneur et un conteneur de données.
la source
--volumes-from
vous permet de partager l'espace disque--link
vous permet de partager des services.docker volume create --name mydata
) est préférée à un conteneur de volume de données. Les gens de Docker eux-mêmes suggèrent que les conteneurs de volumes de données « ne sont plus considérés comme un modèle recommandé », «les volumes nommés devraient être en mesure de remplacer les volumes de données uniquement dans la plupart (sinon tous) les cas » et « aucune raison que je vois d'utiliser conteneurs de données uniquement . "Dans Docker version v1.0 , la liaison d'un montage d'un fichier ou d'un répertoire sur la machine hôte peut être effectuée par la commande donnée:
Le volume ci-dessus peut être utilisé comme stockage persistant sur l'hôte exécutant Docker.
la source
Depuis Docker Compose 1.6, la prise en charge des volumes de données dans Docker Compose est désormais améliorée. Le fichier de composition suivant créera une image de données qui persistera entre les redémarrages (ou même la suppression) des conteneurs parents:
Voici l'annonce du blog: Compose 1.6: Nouveau fichier Compose pour définir les réseaux et les volumes
Voici un exemple de fichier de composition:
Pour autant que je puisse comprendre: cela va créer un conteneur de volume de données (
db_data
) qui persistera entre les redémarrages.Si vous exécutez:
docker volume ls
vous devriez voir votre volume répertorié:Vous pouvez obtenir plus de détails sur le volume de données:
Quelques tests:
Remarques:
Vous pouvez également spécifier différents pilotes dans le
volumes
bloc. Par exemple, vous pouvez spécifier le pilote Flocker pour db_data:Avertissement: Cette approche est prometteuse et je l'utilise avec succès dans un environnement de développement. Je serais inquiet de l'utiliser pour le moment!
la source
Dans le cas où il ne ressort pas clairement de la mise à jour 5 de la réponse sélectionnée, à partir de Docker 1.9, vous pouvez créer des volumes qui peuvent exister sans être associés à un conteneur spécifique, rendant ainsi le modèle de "conteneur de données uniquement" obsolète.
Voir Conteneurs de données uniquement obsolètes avec Docker 1.9.0? # 17798 .
Je pense que les responsables de Docker ont réalisé que le modèle de conteneur de données uniquement était un peu une odeur de conception et ont décidé de faire des volumes une entité distincte qui peut exister sans conteneur associé.
la source
Bien que ce soit encore une partie de Docker qui nécessite un peu de travail , vous devez mettre le volume dans le Dockerfile avec l'instruction VOLUME afin que vous n'ayez pas besoin de copier les volumes d'un autre conteneur.
Cela rendra vos conteneurs moins interdépendants et vous n'aurez pas à vous soucier de la suppression d'un conteneur affectant un autre.
la source
docker rm
)Lorsque vous utilisez Docker Compose , attachez simplement un volume nommé, par exemple:
la source
La réponse de @ tommasop est bonne et explique certains des mécanismes d'utilisation des conteneurs de données uniquement. Mais comme quelqu'un qui pensait initialement que les conteneurs de données étaient idiots quand on pouvait simplement lier monter un volume à l'hôte (comme suggéré par plusieurs autres réponses), mais se rend maintenant compte qu'en fait, les conteneurs de données uniquement sont assez soignés, je peux suggérer le mien article de blog sur ce sujet: Pourquoi les conteneurs de données Docker (volumes!) sont bons
Voir aussi: ma réponse à la question " Quelle est la (meilleure) façon de gérer les autorisations pour les volumes partagés Docker? " Pour un exemple d'utilisation des conteneurs de données pour éviter des problèmes tels que les autorisations et le mappage uid / gid avec l'hôte.
Pour répondre à l'une des préoccupations originales du PO: le conteneur de données ne doit pas être supprimé. Même si le conteneur de données est supprimé, les données elles-mêmes ne seront pas perdues tant qu'un conteneur aura une référence à ce volume, c'est-à-dire tout conteneur qui a monté le volume via
--volumes-from
. Donc, à moins que tous les conteneurs associés ne soient arrêtés et supprimés (on pourrait considérer cela comme l'équivalent d'un accidentelrm -fr /
), les données sont en sécurité. Vous pouvez toujours recréer le conteneur de données en faisant--volumes-from
n'importe quel conteneur qui a une référence à ce volume.Comme toujours, faites des sauvegardes!
MISE À JOUR: Docker dispose désormais de volumes qui peuvent être gérés indépendamment des conteneurs, ce qui facilite encore la gestion.
la source
Il existe plusieurs niveaux de gestion des données persistantes, selon vos besoins:
-v host-path:container-path
pour conserver les données du répertoire du conteneur dans un répertoire hôte.--volumes-from
pour monter ces données dans votre conteneur d'application.la source
Si vous souhaitez déplacer vos volumes, vous devriez également regarder Flocker .
Du README:
la source
Cela dépend de votre scénario (ce n'est pas vraiment adapté à un environnement de production), mais voici une façon:
Création d'un conteneur MySQL Docker
L'essentiel est d'utiliser un répertoire sur votre hôte pour la persistance des données.
la source
J'ai récemment écrit sur une solution potentielle et une application démontrant la technique. Je le trouve assez efficace lors du développement et de la production. J'espère que cela aide ou suscite des idées.
Repo: https://github.com/LevInteractive/docker-nodejs-example
Article: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/
la source
J'utilise simplement un répertoire prédéfini sur l'hôte pour conserver les données pour PostgreSQL. De cette façon, il est possible de migrer facilement des installations PostgreSQL existantes vers des conteneurs Docker: https://crondev.com/persistent-postgresql-inside-docker/
la source
Ma solution consiste à utiliser le nouveau
docker cp
, qui est maintenant capable de copier des données à partir de conteneurs, peu importe s'il est en cours d'exécution ou non et de partager un volume hôte au même emplacement exact où l'application de base de données crée ses fichiers de base de données à l'intérieur du conteneur . Cette double solution fonctionne sans conteneur de données uniquement, directement à partir du conteneur de base de données d'origine.Mon script d'initialisation systemd prend donc le travail de sauvegarde de la base de données dans une archive sur l'hôte. J'ai placé un horodatage dans le nom de fichier pour ne jamais réécrire un fichier.
Il le fait sur l'ExecStartPre:
Et cela fait la même chose sur ExecStopPost aussi:
De plus, j'ai exposé un dossier de l'hôte en tant que volume au même emplacement exact où la base de données est stockée:
Cela fonctionne très bien sur ma machine virtuelle (je construis une pile LEMP pour moi): https://github.com/DJviolin/LEMP
Mais je ne sais tout simplement pas s'il s'agit d'une solution "à l'épreuve des balles" alors que votre vie en dépend réellement (par exemple, une boutique en ligne avec des transactions en quelques millisecondes possibles)?
À 20 min 20 secondes de cette vidéo officielle de Docker, le présentateur fait la même chose avec la base de données:
Premiers pas avec Docker
la source
Utilisez la revendication de volume persistante (PVC) de Kubernetes, qui est un outil de gestion et de planification de conteneurs Docker:
Volumes persistants
Les avantages de l'utilisation de Kubernetes à cette fin sont les suivants:
la source