web-dev-qa-db-fra.com

Image de Docker Push sur SSH (distribué)

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:

  • Développement, tests effectués sur mon ordinateur portable (OSX, machine Docker en cours d'exécution, utilisation de docker-compose pour la définition des services et des dépendances)
  • Déployez-vous dans un environnement live à l'aide d'un script (auto-écrit, bash, peu de dépendances sur la machine dev, simplement la machine Docker)
  • Déployez-vous sur un nouveau VPS avec très peu de dépendances, à l'exception de l'accès SSH et du démon Docker.
  • Aucun service "permanent" ne fonctionnant nulle part, c’est-à-dire que je ne souhaite précisément pas héberger un registre fonctionnant de manière permanente (en particulier inaccessible à toutes les instances VPS, bien que cela puisse probablement être résolu avec un tunnel SSH intelligent)

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.

20
Krumelur

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
  • docker save produira une archive tar de l'une de vos images docker (y compris ses couches)
  • -C est pour ssh compresser le flux de données
  • docker load crée une image de menu fixe à partir d'une archive tar

Notez 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.

28
Thomasleveil

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.
4
Marakai

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

0
brthornbury