Je suis nouveau dans le monde des dockers: j'en suis à un point où je peux déployer des conteneurs Docker et travailler.
Essayer de passer au niveau supérieur d'enregistrement de mes modifications et de déplacer mes conteneurs / images vers un autre ordinateur / serveur.
Actuellement, j'utilise docker sur Windows 10, mais j'ai accès au serveur Ubuntu 16.04 pour tester mon travail.
C'est là que je suis bloqué: j'ai Wordpress et des images MariaDB déployées sur Docker.
Mon WP fonctionne parfaitement bien, j'ai installé quelques thèmes et créé quelques pages avec des images.
À ce stade, j'aime sauvegarder mon travail et l'envoyer à mon ami qui déploiera mon image et travaillera plus loin sur ce même Wordpress.
Ce que j'ai lu en ligne est: Je devrais exécuter la commande docker commit
pour enregistrer et créer mon image docker au format .tar
, puis envoyer cette image fichier ( .tar
) à mon ami. Il exécutera docker load -i
sur mon fichier pour le charger en tant qu'image dans son docker, puis créera un conteneur à partir de celui-ci qui devrait lui donner tout mon travail sur Wordpress.
Juste pour clarifier, je valide les conteneurs Wordpress et Mariadb.
Je n'ai pas de volumes externes montés, donc tout le travail est enregistré dans des conteneurs.
Je me souviens d'avoir coché les lecteurs C et D dans les paramètres du docker mais je ne sais pas si cela contient quelque chose à voir avec les volumes.
Je n'obtiens aucune erreur dans mon processus de validation et de déplacement des fichiers .tar
. Une fois que mon ami a créé ses conteneurs à partir de mes images validées, il obtient Wordpress propre (comme une nouvelle installation de Wordpress à partir des pages de configuration de wp).
Une autre chose que j'ai remarquée est que l'image que je crée a la même taille de fichier que l'image originale que j'ai tirée. Lorsque j'exécute images docker
, je vois que mon image fait 420 Mo, et que l'image Wordpress fait 420 Mo.
Je pense que mon image devrait être un peu plus grande depuis que j'ai installé des thèmes , plugins et images téléchargées sur Wordpress. Au moins, il devrait ajouter 3 à 5 Mo de plus que les images originales. Veuillez aider. Merci.
L'exécution de docker system df
me donne ceci.
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 3 1.259GB 785.9MB (62%) Containers 3 3 58.96kB 0B (0%) Local Volumes 2 2 311.4MB 0B (0%) Build Cache 0 0 0B 0B
5 Réponses :
Assurez-vous, comme montré ici , pour valider un conteneur en cours d'exécution (pour éviter tout nettoyage des données)
docker commit CONTAINER_ID yourImage
Après le commande docker commit
, vous pouvez utiliser docker save
pour enregistrer votre image dans un tar et docker load
pour l'importer retournez-le, comme indiqué ici .
C'étaient exactement mes pas. je me suis engagé, l'ID du conteneur et le nom de mon image. Ensuite, j'ai enregistré pour enregistrer l'image dans un fichier .tar. Ensuite, j'ai déplacé le fichier vers un autre PC exécutant Docker. Utilisez Docker load pour charger le fichier .tar dans l'image. puis utilisé les ID d'image dans le fichier docker-compose.yml pour créer un conteneur à partir de conteneurs wordpress et mariadb. À la fin, ce que j'obtiens, c'est l'installation de wordpress à partir de zéro.
@smaqsood Le problème est qu'une image Wordpress typique déclare un volume: github.com/docker-library/wordpress/blob/… : vous devrez également exporter le volume ( docs.docker.com/v17.03/engine/tutorials/dockervolumes/... ). Idem pour MariaDB.
Le déploiement consistait en deux commandes d'exécution de Docker ..., je souhaite que deux commandes puissent également encapsuler mon travail en image à déplacer ...., c'est ce que j'avais à l'esprit avant de toucher docker.
@smaqsood Vous devrez créer un script pour l'exportation du volume de données, comme dans stackoverflow.com/a/26339869/6309 . Peut-être en utilisant un outil comme github.com/discordianfish/docker-backup
Article très instructif. Exactement ma situation. Sauvegarde du conteneur WordPress avec toutes les données. On dirait que le problème principal est celui des volumes en suspens ..., je n'arrive toujours pas à croire pourquoi docker a fait un besoin essentiel à une telle affaire et si compliquée.
Vous ne devez jamais exécuter docker commit
.
Pour répondre à votre question immédiate, les conteneurs qui exécutent des bases de données stockent généralement leurs données dans volumes ; ils sont configurés afin que les données soient stockées dans un volume anonyme même s'il n'y avait pas d'option docker run -v
donnée pour stocker explicitement les données dans un volume ou un répertoire hôte nommé. Cela signifie que docker commit
ne persiste jamais les données dans une base de données, et vous avez besoin d'un autre mécanisme pour copier les données réelles.
À un niveau plus pratique, votre collègue peut demander des questions telles que "d'où vient cette archive tar de 400 Mo, pourquoi devrais-je lui faire confiance et comment puis-je la recréer si elle est endommagée pendant le transport?" Il y a aussi de bonnes questions telles que "la base de données sous-jacente a un correctif de sécurité dont j'ai besoin, alors comment puis-je obtenir les modifications que j'ai apportées sur une image de base plus récente?" Si vous êtes diligent, vous pouvez écrire tout ce que vous faites dans un fichier texte. Si vous avez alors un fichier texte qui dit "J'ai commencé à partir de mysql: 5.6
, alors j'ai couru ..." qui est très proche d'être un Dockerfile
. La syntaxe est simple et Docker propose un tutoriel sur la création et l'exécution d'images personnalisées .
Lorsque vous avez besoin d'une image personnalisée, vous devez toujours décrire ce qu'il contient en utilisant un Dockerfile
, qui peut être archivé dans le contrôle de code source, et peut reconstruire une image en utilisant docker build
.
Pour votre cas d'utilisation, il ne semble pas que vous ayez réellement besoin d'une image personnalisée. Je suggérerais probablement de configurer un fichier YAML Docker Compose qui décrit votre configuration et stocke le fichier données dans les répertoires locaux. La moitié de la base de données pourrait ressembler à
version: '3' services: db: image: 'mysql:8.0' volumes: - './mysql:/var/lib/mysql/data' ports: - '3306:3306'
Les données seront stockées sur l'hôte , dans un sous-répertoire mysql
. Vous pouvez maintenant tarer cette arborescence de répertoires et envoyer ce fichier tar à votre collègue, qui peut ensuite le décompresser et recréer le même environnement avec ses données associées.
votre réponse semble prometteuse mais je n'ai pas pu obtenir le processus. J'ai examiné l'utilisation du fichier dockerfile et cela ressemble plus à la création d'images en utilisant des images existantes sur le hub docker. Je n'ai trouvé aucun article décrivant réellement ma situation. Toutes les aides en ligne indiquent l'utilisation de commit. J'ai un abattage que j'ai besoin d'utiliser Dockerfile mais il me faudra peut-être un certain temps pour que je comprenne son utilisation. Je n'ai jamais pensé que docker serait aussi compliqué. Je pense que l'objectif principal des conteneurs docker est de travailler et de se déplacer.
Utilisez docker build
(les modifications apportées aux images doivent être stockées dans le Dockerfile).
Maintenant, si vous avez plusieurs services, utilisez simplement le frère de docker docker-compose
. Une étape supplémentaire que vous devez faire est de créer docker-compose.yml
(n'ayez pas encore peur mon ami, ce n'est pas trivial). Tout ce que vous faites dans ce fichier est de lister vos images (avec la définition de l'emplacement de leur Dockerfile pour cette image, peut-être dans un sous-dossier pour chaque image). Vous pouvez également y définir d'autres propriétés si vous le souhaitez.
Je comprends docker-compose.yml mais je crois comprendre que vous utilisez le fichier docker-compose.yml pour créer des conteneurs à partir d'images. Je n'ai pas kwno, vous pouvez également utiliser docker-compose pour créer des images à partir de conteneurs (inversé).
Vous devez utiliser les volumes pour stocker vos données.
Vous trouverez ici la documentation: https://docs.docker.com/storage/volumes/ a> Par exemple, vous pouvez faire quelque chose comme ça dans votre docker-compose.yml. ou volumes:
- ./yourpath:/var/www/html
version: '3.1'
services:
wordpress:
image: wordpress:php7.2-apache
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: databasename
WORDPRESS_DB_USER: username
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: namedatabase
volumes:
- name_volume:/var/www/html
volumes:
- name_volume:
Fournissez quelques détails, la réponse doit contenir la plupart des informations pour résoudre le problème de la question.
j'espère faire mieux maintenant
Corrigez-moi si j'ai tort, s'il-vous plait. après avoir lu toutes les réponses, voici ma conclusion. je red plus sur les volumes et créé un dossier «wordpress» sur mon ordinateur Windows et ajouté «volumes: - ./wordpress:/var/www/html» dans mon docker compose le fichier yml. Une fois que wordpress est opérationnel, je suis allé dans mon dossier wordpress et je vois tous les fichiers wordpress là-dedans. Fondamentalement, ce dossier wordpress me donne accès aux fichiers wordpress dans le conteneur (corrigez-moi s'il vous plaît). Je peux sauvegarder des fichiers wordpress comme celui-ci et utiliser phpmyadmin pour sauvegarder db mais ce n'est pas la solution de portabilité que j'attendais de docker.
Lorsque vous utilisez un volume de docker comme ./folderA:/folderB, lorsque vous exécutez votre conteneur, tous les fichiers sont copiés du dossierA vers le dossierB et ils varieront ensemble: si vous modifiez quelque chose à l'intérieur du dossierA, il sera également modifié dans le dossierB, même vice-versa . Je vous suggère d'essayer avec un serveur apache et un dossier / volume et de mettre dans un index.html pour vous entraîner. Essayez de changer l'index pendant que le conteneur est toujours en cours d'exécution ou quelque chose comme ça.
que se passe-t-il quand je tue le conteneur. le dossier A restera-t-il sur mon PC avec tous les fichiers ..?
oui ça restera avec tous les fichiers
Notez que certains répertoires sont considérés comme des répertoires de volume par docker, ce qui signifie qu'ils sont spécifiques au conteneur et donc jamais enregistrés dans l'image. Le répertoire \ data
en est un exemple. Lorsque docker commit my_container my_image: my_tag
est exécuté, tout le système de fichiers des conteneurs est enregistré, à l'exception de / data
. Pour contourner ce problème, vous pouvez faire:
docker exec -d my_container /bin/bash -c "cp /data0/* /data"
Ensuite, en dehors du conteneur:
FROM my_image:my_tag CMD "cp /data0 /data && my_other_CMD"
Ensuite, vous voudrez peut-être copier les données sur / data0 retour à / data, auquel cas vous pourriez créer une nouvelle image:
Sur le Dockerfile:
docker commit my_container my_image:my_tag
Notez que vous essayez de copier du contenu à / data
dans une commande RUN
ne fonctionnera pas, car un nouveau conteneur est créé dans chaque couche et, dans chacun d'eux, le contenu de / data sont supprimés. Une fois le conteneur installé, vous pouvez également faire:
mkdir /data0 cp /data/* /data0
Suggère de mettre en paragraphes votre message. C'est assez difficile à lire pour le moment.
Est-ce mieux maintenant!...................................