Après avoir évalué les réponses et étudié le sujet, je voudrais résumer.
La façon Docker de mettre à niveau les conteneurs semble être la suivante:
Les conteneurs d'applications ne doivent pas stocker de données d'application . De cette façon, vous pouvez remplacer le conteneur d'application par sa version la plus récente à tout moment en exécutant quelque chose comme ceci:
docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
-e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql
Vous pouvez stocker les données sur l'hôte (dans un répertoire monté en tant que volume) ou dans des conteneurs spéciaux uniquement pour les données . En savoir plus
La mise à niveau des applications (par exemple avec la mise à niveau yum / apt-get) dans les conteneurs est considérée comme un anti-modèle . Les conteneurs d'application sont censés être immuables , ce qui garantit un comportement reproductible. Certaines images d'application officielles (mysql: 5.6 en particulier) ne sont même pas conçues pour s'auto-mettre à jour (la mise à niveau apt-get ne fonctionnera pas).
Je remercie tous ceux qui ont donné leurs réponses, afin que nous puissions voir toutes les différentes approches.
Yaroslav Stavnichiy
la source
docker rename my-mysql-container trash-container
avant de créer le nouveau?Je n'aime pas monter des volumes comme lien vers un répertoire hôte, j'ai donc proposé un modèle pour mettre à niveau les conteneurs Docker avec des conteneurs entièrement gérés par Docker. La création d'un nouveau conteneur Docker avec
--volumes-from <container>
donnera au nouveau conteneur avec les images mises à jour la propriété partagée des volumes gérés Docker.En ne supprimant pas encore immédiatement l'original
my_mysql_container
, vous avez la possibilité de revenir au conteneur de travail connu si le conteneur mis à niveau n'a pas les bonnes données ou échoue à un test d'intégrité.À ce stade, je vais généralement exécuter les scripts de sauvegarde que j'ai pour le conteneur afin de me donner un filet de sécurité en cas de problème
Vous avez maintenant la possibilité de vous assurer que les données que vous attendez dans le nouveau conteneur sont là et d'effectuer un contrôle de cohérence.
Les volumes de docker resteront en place tant que n'importe quel conteneur les utilisera, vous pouvez donc supprimer le conteneur d'origine en toute sécurité. Une fois le conteneur d'origine supprimé, le nouveau conteneur peut prendre le nom de l'original pour que tout soit aussi joli qu'il était au début.
Il existe deux avantages majeurs à utiliser ce modèle pour mettre à niveau les conteneurs Docker. Premièrement, il élimine la nécessité de monter des volumes sur des répertoires hôtes en permettant aux volumes d'être directement transférés vers des conteneurs mis à niveau. Deuxièmement, vous n'êtes jamais dans une position où il n'y a pas de conteneur docker fonctionnel; donc si la mise à niveau échoue, vous pouvez facilement revenir à la façon dont elle fonctionnait auparavant en faisant tourner à nouveau le conteneur Docker d'origine.
la source
./postgres-data/:/var/lib/postgres/data
- c'est-à-dire monté le./postgres-data/
Juste pour fournir une réponse plus générale (non spécifique à mysql) ...
Synchronisez avec le registre d'images de service ( https://docs.docker.com/compose/compose-file/#image ):
Recréez le conteneur si le fichier ou l'image de composition de docker a changé:
La gestion des images de conteneurs est l'une des raisons de l'utilisation de docker-compose (voir https://docs.docker.com/compose/reference/up/ )
L'aspect de la gestion des données est également couvert par docker-compose via des "volumes" externes montés (voir https://docs.docker.com/compose/compose-file/#volumes ) ou un conteneur de données.
Cela laisse les problèmes potentiels de rétrocompatibilité et de migration des données intacts, mais ce sont des problèmes "applicatifs", non spécifiques à Docker, qui doivent être vérifiés par rapport aux notes de publication et aux tests ...
la source
Je voudrais ajouter que si vous souhaitez effectuer ce processus automatiquement (télécharger, arrêter et redémarrer un nouveau conteneur avec les mêmes paramètres que ceux décrits par @Yaroslav), vous pouvez utiliser WatchTower. Un programme qui met automatiquement à jour vos conteneurs lorsqu'ils sont modifiés https://github.com/v2tec/watchtower
la source
Considérez pour ces réponses:
app_schema
app_db
root123
Comment mettre à jour MySQL lors du stockage des données d'application dans le conteneur
Ceci est considéré comme une mauvaise pratique , car si vous perdez le conteneur, vous perdrez les données. Bien que ce soit une mauvaise pratique, voici une façon possible de le faire:
1) Faites un vidage de base de données en SQL:
2) Mettez à jour l'image:
3) Mettez à jour le conteneur:
4) Restaurez le vidage de la base de données:
Comment mettre à jour le conteneur MySQL à l'aide d'un volume externe
L'utilisation d'un volume externe est une meilleure façon de gérer les données et facilite la mise à jour de MySQL. La perte du conteneur ne perdra aucune donnée. Vous pouvez utiliser docker-compose pour faciliter la gestion des applications Docker multi-conteneurs dans un seul hôte:
1) Créez le
docker-compose.yml
fichier afin de gérer vos applications:2) Mettre à jour MySQL (depuis le même dossier que le
docker-compose.yml
fichier):Remarque: la dernière commande ci-dessus mettra à jour l'image MySQL, recréera et démarrera le conteneur avec la nouvelle image.
la source
docker-compose
, cela fonctionnera-t-il? stackoverflow.com/a/31485685/65313volumes_from
la clé est désormais obsolète (même supprimée dans la version 3 du fichier compose) au profit de la nouvellevolumes
clé.docker pull image_uri:tag && docker restart container_running_that_image
travaillé pour moi. Pas besoin dedocker-compose pull && docker-compose up -d
.Réponse similaire à ci-dessus
la source
Voici à quoi cela ressemble
docker-compose
lors de la création d'une personnalisationDockerfile
.docker build -t imagename:version .
Cela stockera votre nouvelle version localement.docker-compose down
docker-compose.yml
fichier pour refléter le nouveau nom d'image que vous avez défini à l'étape 1.docker-compose up -d
. Il recherchera l'image localement et utilisera votre image mise à niveau.-ÉDITER-
Mes étapes ci-dessus sont plus verbeuses qu'elles ne devraient l'être. J'ai optimisé mon flux de travail en incluant le
build: .
paramètre dans mon fichier docker-compose. Les étapes se présentent maintenant:docker-compose build
docker-compose up -d
Je ne m'en rendais pas compte à l'époque, mais docker-compose est assez intelligent pour simplement mettre à jour mon conteneur vers la nouvelle image avec la seule commande, au lieu d'avoir à le réduire en premier.
la source
docker-compose up -d
sans avoir à tout arrêter en premier.Si vous ne souhaitez pas utiliser Docker Compose, je peux recommander portainer . Il a une fonction de recréation qui vous permet de recréer un conteneur tout en tirant la dernière image.
la source
Vous devez soit reconstruire toutes les images et redémarrer tous les conteneurs, soit mettre à jour le logiciel et redémarrer la base de données. Il n'y a pas de chemin de mise à niveau mais que vous concevez vous-même.
la source
docker restart
commande, mais je ne suis pas sûr qu'elle détectera les changements d'image. Et qu'advient-il de mes données à l'intérieur des conteneurs?Extrait de http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/
Vous pouvez mettre à jour toutes vos images existantes à l'aide du pipeline de commandes suivant:
la source
Assurez-vous que vous utilisez des volumes pour toutes les données persistantes (configuration, journaux ou données d'application) que vous stockez sur les conteneurs liés à l'état des processus à l'intérieur de ce conteneur. Mettez à jour votre Dockerfile et reconstruisez l'image avec les modifications souhaitées, puis redémarrez les conteneurs avec vos volumes montés à leur emplacement approprié.
la source
C'est quelque chose avec lequel je me bats également pour mes propres images. J'ai un environnement de serveur à partir duquel je crée une image Docker. Lorsque je mets à jour le serveur, j'aimerais que tous les utilisateurs qui exécutent des conteneurs basés sur mon image Docker puissent mettre à niveau vers le dernier serveur.
Idéalement, je préfère générer une nouvelle version de l'image Docker et que tous les conteneurs basés sur une version précédente de cette image soient automatiquement mis à jour vers la nouvelle image «en place». Mais ce mécanisme ne semble pas exister.
Donc, la meilleure conception suivante que j'ai pu trouver jusqu'à présent est de fournir un moyen de mettre le conteneur à jour lui-même - de la même manière qu'une application de bureau vérifie les mises à jour puis se met à niveau. Dans mon cas, cela signifiera probablement la création d'un script impliquant des pulls Git à partir d'une balise bien connue.
L'image / le conteneur ne change pas réellement, mais les "internes" de ce conteneur changent. Vous pourriez imaginer faire la même chose avec apt-get, yum ou tout ce qui est approprié pour votre environnement. Parallèlement à cela, je mettrais à jour l'image myserver: latest dans le registre afin que tout nouveau conteneur soit basé sur la dernière image.
J'aimerais savoir s'il existe un état de la technique qui traite de ce scénario.
la source
Mise à jour
Il s'agit principalement d'interroger le conteneur pour ne pas le mettre à jour car la construction d'images est la façon de procéder
J'ai eu le même problème, j'ai donc créé docker-run , un outil de ligne de commande très simple qui s'exécute à l'intérieur d'un conteneur docker pour mettre à jour les packages dans d'autres conteneurs en cours d'exécution.
Il utilise docker-py pour communiquer avec les conteneurs docker en cours d'exécution et mettre à jour les packages ou exécuter n'importe quelle commande unique arbitraire
Exemples:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
par défaut, cela exécutera la
date
commande dans tous les conteneurs en cours d'exécution et renverra les résultats, mais vous pouvez exécuter n'importe quelle commande, par exempledocker-run exec "uname -a"
Pour mettre à jour des packages (actuellement en utilisant uniquement apt-get):
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run update
Vous pouvez créer et alias et l'utiliser comme une ligne de commande régulière, par exemple
alias docker-run='docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run'
la source
apt update; apt upgrade
, l'image grandira.)