TL; DR En gros, je cherche ceci:
docker Push myimage ssh://myvps01.vpsprovider.net/
Je n'arrive pas à comprendre la raison d'être de l'affaire Docker Hub/Registry. Je sais que je peux gérer un registre privé, mais pour cela, je dois configurer l’infrastructure d’un serveur.
J’ai jeté un coup d’œil à l’intérieur du fonctionnement interne de Docker (enfin, du système de fichiers au moins), et il semble que les couches d’image de Docker ne soient qu’un tas d’archives contenant plus ou moins des noms sophistiqués. Je pense naïvement qu'il ne serait pas impossible de créer un script Python simple pour faire du Push/Pull distribué, mais bien sûr, je n'ai pas essayé, c'est pourquoi je pose cette question.
Y a-t-il des raisons techniques pour lesquelles Docker ne pourrait pas simplement faire du Push/Pull distribué (sans serveur), comme Git ou Mercurial?
Je pense que cela serait une aide précieuse, car je pourrais simplement envoyer les images que j'ai construites sur mon ordinateur portable directement sur les serveurs d'applications, au lieu de les envoyer quelque part sur un serveur de dépôt, puis de les extraire des serveurs d'applications. Ou peut-être que je viens de mal comprendre le concept et le registre est une fonctionnalité vraiment essentielle dont j'ai absolument besoin?
EDITCertains contextes qui expliquent, espérons-le, pourquoi je veux cela, considérons le scénario suivant:
La meilleure solution actuelle consiste à utiliser la machine Docker pour pointer sur le serveur VPS et le reconstruire, mais cela ralentit le déploiement car je dois construire le conteneur à partir du source à chaque fois.
Si vous souhaitez transmettre des images du menu fixe à un hôte donné, tout ce que Docker permet déjà. L'exemple suivant montre comment pousser une image de menu fixe à travers ssh:
docker save <my_image> | ssh -C [email protected] docker load
-C
est pour ssh compresser le flux de donnéesNotez que la combinaison d'une commande docker registry + docker pull
présente l'avantage de ne télécharger que les couches manquantes. Ainsi, si vous mettez fréquemment à jour une image de menu fixe (en ajoutant de nouveaux calques ou en modifiant quelques derniers calques), la commande docker pull
génère moins de trafic réseau que de transmettre des images complètes du menu fixe via ssh.
Enregistrer/charger une image sur un hôte Docker et le placer dans un registre (privé ou Hub) sont deux choses différentes.
L'ancien @Thomasleveil a déjà abordé.
Ce dernier en fait ne a les "capacités" pour ne pousser que les couches requises.
Vous pouvez facilement le tester vous-même avec un registre privé et quelques images dérivées.
Si nous avons deux images et que l'une est dérivée de l'autre, alors:
docker tag baseimage myregistry:5000/baseimage
docker Push myregistry:5000/baseimage
va pousser toutes les couches qui ne sont pas déjà trouvées dans le registre. Cependant, lorsque vous appuyez ensuite sur l'image dérivée suivante:
docker tag derivedimage myregistry:5000/derivedimage
docker Push myregistry:5000/derivedimage
vous remarquerez peut-être que seule une couche est poussée - à condition que votre fichier Dockerfile soit construit de telle sorte qu'il ne nécessite qu'une couche (par exemple, l'enchaînement des paramètres RUN, conformément à Meilleures pratiques Dockerfile ).
Sur votre hôte Docker, vous pouvez également exécuter un registre privé dockerisé.
Voir Registre Docker conteneurisé
Au meilleur de ma connaissance et au moment de la rédaction de cet article, le mécanisme Push/pull/query du registre ne prend pas en charge SSH, mais uniquement HTTP/HTTPS. C'est différent de Git et de ses amis.
Voir Registre non sécurisé pour savoir comment exécuter un registre privé via HTTP, sachez qu'il est nécessaire de modifier les options du moteur Docker et de le redémarrer:
Ouvrez le fichier/etc/default/docker ou/etc/sysconfig/docker pour l'édition .
Selon votre système d'exploitation, les options de démarrage de votre moteur Engine daemon.
Modifiez (ou ajoutez) la ligne DOCKER_OPTS et ajoutez l'indicateur --insecure-registry .
Cet indicateur prend l'URL de votre registre, par exemple.
DOCKER_OPTS = "- Registre non sécurisé myregistrydomain.com:5000"
Fermez et enregistrez le fichier de configuration.
Redémarrez votre démon Docker
Vous trouverez également des instructions pour utiliser des certificats auto-signés, vous permettant d'utiliser HTTPS.
Utilisation de certificats auto-signés
[...]
Ceci est plus sécurisé que la solution de registre non sécurisée. Vous devez Configurer chaque démon docker qui souhaite accéder à votre registre
Generate your own certificate: mkdir -p certs && openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt Be sure to use the name myregistrydomain.com as a CN. Use the result to start your registry with TLS enabled Instruct every docker daemon to trust that certificate. This is done by copying the domain.crt file to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt. Don’t forget to restart the Engine daemon.
J'ai créé un utilitaire de ligne de commande uniquement pour ce scénario.
Il configure un registre privé temporaire de dockers sur le serveur, établit un tunnel SSH à partir de votre hôte local, pousse votre image, puis nettoie après.
L'avantage de cette approche par rapport à docker save
est que seules les nouvelles couches sont placées sur le serveur, ce qui permet un téléchargement plus rapide.
Souvent, utiliser un registre intermédiaire comme dockerhub est indésirable et fastidieux.
https://github.com/coherenceapi/docker-Push-ssh
Installer:
pip install docker-Push-ssh
Exemple:
docker-Push-ssh -i ~/my_ssh_key [email protected] my-docker-image
Le plus gros inconvénient est que vous devez ajouter manuellement votre adresse IP locale à la configuration insecure_registries
de docker.
https://stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry-flag-on-mac-os