Docker image push over SSH (distribué)

<!-- 2 - - - TL; DR en gros, je suis à la recherche de:

docker push myimage ssh://myvps01.vpsprovider.net/

Je n'arrive pas à comprendre la raison d'être de toute cette histoire de Hub / Registre Docker. Je sais que je peux gérer un registre privé, mais pour cela, je dois mettre en place l'infrastructure d'exécution d'un serveur.

j'ai jeté un coup d'oeil à L'intérieur des rouages internes de Docker (et bien, le système de fichiers au moins), et il semble que les couches d'image de Docker ne soient qu'un tas de boules de goudron, plus ou moins, avec quelques nommage des fichiers. Je pense naïvement qu'il ne serait pas impossible de concocter un simple script Python pour faire 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 (sans serveur) push/pull distribué, comme Git ou Mercurial?

je pense que ce serait une aide énorme, puisque je pourrais juste pousser les images que j'ai construit sur mon ordinateur portable directement sur les serveurs d'application, au lieu de la première pousser vers un serveur repo quelque part et puis tirer à partir des serveurs app. Ou peut-être que j'ai juste mal compris le concept et le Registre est vraiment une caractéristique essentielle que j'ai absolument besoin?

EDIT un certain contexte qui, je l'espère, explique pourquoi je veux cela, considérez le scénario suivant:

  • développement, tests effectués sur mon ordinateur portable (OSX, exécuter Docker machine, utiliser docker-composer pour définir les services et les dépendances)
  • Déployer à un environnement en direct au moyen d'un script (auto-écrit, bash, peu de dépendances sur dev machine, essentiellement juste Docker machine)
  • déployer sur un nouveau VPS avec très peu de dépendances sauf accès SSH et démon Docker.
  • pas de services" permanents " tournant n'importe où, c'est-à-dire que je ne veux pas héberger un registre tournant en permanence (surtout pas accessible à toutes les instances VPS, bien que cela puisse probablement être résolu avec un certain SSH intelligent tunneling)

la meilleure solution actuelle est d'utiliser Docker machine pour pointer vers le serveur VPS et le reconstruire, mais cela ralentit le déploiement car je dois construire le conteneur à partir de la source à chaque fois.

16
demandé sur Krumelur 2015-07-23 02:10:10

3 réponses

si vous voulez pousser des images docker vers un hôte donné, il y a déjà tout dans Docker pour permettre cela. L'exemple suivant montre comment pousser une image docker à travers ssh:

docker save <my_image> | ssh -C user@my.remote.host.com docker load
  • menu fixe enregistrer produira une archive tar d'une de vos images docker (y compris ses couches)
  • -C pour ssh pour compresser le flux de données
  • panneau de charge crée une image docker à partir d'un goudron archive

Notez que la combinaison d'un panneau de registre + a l'avantage de ne Télécharger que les calques manquants. Ainsi, si vous mettez fréquemment à jour une image docker (ajout de nouvelles couches, ou modification de quelques dernières couches) , alors le docker pull la commande générerait moins de trafic réseau que la poussée des images complètes de docker à travers ssh.

26
répondu Thomasleveil 2016-04-09 11:28:37

sauvegarder/charger une image sur un Docker et la pousser vers un registre (privé ou Hub) sont deux choses différentes.

l'ancien @Thomasleveil s'est déjà exprimé.

Le avoir l'intelligence de pousser seulement 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 un est dérivé de l'autre, puis faire:

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:

docker tag derivedimage myregistry:5000/derivedimage
docker push myregistry:5000/derivedimage

vous pouvez remarquer que seul un calque est poussé-à condition que votre fichier Dockerfile ait été construit de telle sorte qu'il n'ait besoin que d'un calque (par exemple chaînage des paramètres D'exécution, selon Meilleures Pratiques Dockerfile).

sur votre Docker, vous pouvez également gérer un registre privé Dockerisé.

Voir Conteneurs Docker registre

a ma connaissance et au moment de la rédaction de ce document, le mécanisme push/pull/query du Registre ne supporte pas SSH, mais seulement HTTP/HTTPS. Ça ne ressemble pas à Git and friends.

Voir Enregistrement Non Sécurisé sur la façon D'exécuter un registre privé via HTTP, surtout soyez conscient que vous devez changer les options du moteur Docker et le redémarrer:

ouvrir le fichier/etc/default / docker ou /etc/sysconfig/docker pour édition.

selon votre système d'exploitation, vos options de démarrage du démon moteur.

modifier (ou ajouter) la ligne DOCKER_OPTS et ajouter le -- insecure-registry drapeau.

ce drapeau prend l'URL de votre registre, par exemple.

DOCKER_OPTS="--l'insécurité-registre myregistrydomain.com:5000"

fermez et sauvegardez le fichier de configuration.

redémarrez votre Docker démon

vous trouverez également des instructions pour utiliser des certificats auto-signés, vous permettant d'utiliser HTTPS.

Utilisation de certificats auto-signés

[...]

C'est plus sûr que la solution de Registre non sécurisée. Vous devez configurer chaque démon docker qui veut 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.
4
répondu Marakai 2016-04-20 06:31:03

j'ai créé un utilitaire en ligne de commande juste pour ce scénario.

il met en place un registre temporaire de dockers privés sur le serveur, établit un Tunnel SSH à partir de votre serveur local, repousse votre image, puis nettoie après lui-même.

L'avantage de cette approche sur docker save c'est que seuls les nouveaux calques sont poussés vers le serveur, ce qui accélère le téléchargement.

souvent utiliser un registre intermédiaire comme dockerhub n'est pas souhaitable, et lourd.

https://github.com/coherenceapi/docker-push-ssh

Installation:

pip install docker-push-ssh

Exemple:

docker-push-ssh -i ~/my_ssh_key username@myserver.com my-docker-image

la plus grande mise en garde est que vous devez ajouter manuellement votre adresse ip locale à insecure_registries config.

https://stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry-flag-on-mac-os

0
répondu brthornbury 2018-09-12 05:11:27