Comment partager mon Docker-Image sans utiliser le Docker-Hub?

257

Je me demande où les images de Docker sont stockées exactement sur ma machine hôte locale. Puis-je partager ma Docker-Image sans utiliser la Docker-Hubou une Dockerfilemais la «vraie» Docker-Image? Et que se passe-t-il exactement lorsque je «pousse» mon image Docker vers Docker-Hub?

yaquawa
la source
2
Pour référence future: un bon article sur le déplacement d'images de docker
Mifeet

Réponses:

243

Les images Docker sont stockées sous forme de couches de système de fichiers. Chaque commande du Dockerfile crée un calque. Vous pouvez également créer des calques à l'aide docker commitde la ligne de commande après avoir apporté quelques modifications (via docker runprobablement).

Ces couches sont stockées par défaut sous /var/lib/docker. Bien que vous puissiez (théoriquement) sélectionner des fichiers à partir de là et les installer sur un autre serveur Docker, c'est probablement une mauvaise idée de jouer avec la représentation interne utilisée par Docker.

Lorsque vous poussez votre image, ces couches sont envoyées au registre (le registre Docker Hub, par défaut… sauf si vous marquez votre image avec un autre préfixe de registre) et y sont stockées. Lorsque vous appuyez sur, l'ID de couche est utilisé pour vérifier si vous avez déjà la couche localement ou si elle doit être téléchargée. Vous pouvez utiliser docker historypour voir quels calques (autres images) sont utilisés (et, dans une certaine mesure, quelle commande a créé le calque).

En ce qui concerne les options pour partager une image sans pousser vers le registre Docker Hub, vos meilleures options sont:

  • docker saveune image ou docker exportun conteneur. Cela produira un fichier tar vers la sortie standard, vous aimerez donc faire quelque chose comme docker save 'dockerizeit/agent' > dk.agent.latest.tar. Ensuite, vous pouvez utiliser docker loadou docker importdans un hôte différent.

  • Hébergez votre propre registre privé. - Obsolète, voir les commentaires Voir l' image du registre docker . Nous avons construit un registre soutenu par s3 que vous pouvez démarrer et arrêter au besoin (tout état est conservé dans le compartiment s3 de votre choix), ce qui est trivial à configurer. C'est aussi une façon intéressante de voir ce qui se passe lorsque vous passez à un registre

  • Utilisez un autre registre comme quay.io (je ne l'ai pas personnellement essayé), bien que toutes les préoccupations que vous avez avec le hub docker s'appliquent probablement ici aussi.

Abel Muiño
la source
6
Pour référence future, le lien vers l'image de registre Docker est obsolète. Vous devriez maintenant utiliser Docker Registry 2.0 et le code sur github / docker / distribution
RoelAdriaans
1
Je ne suis pas sûr qu'il soit clair que Registry 2.0 est un remplacement prêt à l'emploi de l'original. Il semble manquer certaines fonctionnalités de base telles que la recherche stackoverflow.com/questions/30113726/docker-registry-2-0-api-v2
JoshRivers
1
Question sur docker save: lorsque je pousse une image qui dérive d'une autre image (disons python:2.7) vers un registre, l'image parent n'a pas besoin d'être téléchargée plus d'une fois, sauf si elle change. Puis-je enregistrer des images partielles pour obtenir une optimisation de taille de fichier similaire? Je saute à travers ces cerceaux parce que je suis un amateur avec plusieurs images et je ne veux pas payer pour un registre privé.
Pieter
4
Ne pourriez-vous pas simplement extraire des fichiers src d'un dépôt git, y compris un Dockerfile, et docker buildsur l'hôte?
jshxe
1
@Jishaxe partie de ma build est de npm install... Je ne peux pas construire sur mon hôte car il a très peu de mémoire et cette étape échoue toujours (voir: github.com/npm/npm/issues/5021 )
Soft Bullets
46

Sur la base de ce blog , on pourrait partager une image Docker sans registre Docker en exécutant:

docker save --output latestversion-1.0.0.tar dockerregistry/latestversion:1.0.0

Une fois cette commande terminée, on pourrait copier l'image sur un serveur et l'importer comme suit:

docker load --input latestversion-1.0.0.tar
030
la source
18

L'envoi d'une image Docker à un serveur distant peut se faire en 3 étapes simples:

  1. Localement, enregistrez l'image docker en tant que .tar :
docker save -o <path for created tar file> <image name>
  1. Localement, utilisez scp pour transférer .tar vers la télécommande

  2. Sur le serveur distant, chargez l'image dans le docker:

docker load -i <path to docker image tar file>
JSON C11
la source