web-dev-qa-db-fra.com

Comment obtenir un accès à distance à un registre privé de docker?

J'essaye d'installer un registre privé de docker en utilisant l'image prise à partir de: https://github.com/docker/docker-registry

Juste en courant:
docker run -p 5000:5000 registry

Je peux tirer/Push de/vers ce référentiel uniquement à partir de localhost, mais si j'essaie d'y accéder depuis une autre machine (en utilisant une adresse privée sur le même réseau local), il échoue avec un message d'erreur:

*2014/11/03 09:49:04 Error: Invalid registry endpoint https ://10.0.0.26:5000/v1/': 
Get https:// 10.0.0.26:5000/v1/_ping: Forbidden. If this private 
registry supports only HTTP or HTTPS with an unknown CA certificate,
please add `--insecure-registry 10.0.0.26:5000` to the daemon's 
arguments. In the case of HTTPS, if you have access to the registry's
CA certificate, no need for the flag; simply place the CA certificate 
at /etc/docker/certs.d/10.0.0.26:5000/ca.crt*

Ce qui me rend fou c'est que je peux y accéder avec succès en utilisant: curl 10.0.0.26:5000 et/ou curl 10.0.0.26:5000/v1/search

Je ne comprends pas non plus où et comment je devrais passer le drapeau --insecure-registry.

80
Ofer Eliassaf

OK - j'ai trouvé la solution à ce problème - après une journée de fouilles.

Pour le menu fixe inférieur à 1.12.1:

Il s'avère que la nouvelle version du client refuse de travailler avec un registre privé sans SSL.

Pour résoudre ce problème, le démon de la machine cliente doit être lancé avec l'indicateur non sécurisé:

Il suffit de taper:

Sudo service docker stop # to stop the service

puis

Sudo docker -d --insecure-registry 10.0.0.26:5000

(remplacez le 10.0.0.26 par votre propre adresse IP).

Je m'attendrais à ce que les gars du docker ajoutent cette option à la ligne de commande pull/push ...

Éditer - à titre facultatif - vous pouvez ajouter l'indicateur à la variable DOCKER_OPTS env dans/etc/default/docker ..., puis à Sudo service docker restart

Modifier à nouveau - Il semble que les gars de docker sont sur - et un correctif viendra bientôt: https://github.com/docker/docker/pull/8935

Pour le menu fixe 1.12.1:

Veuillez suivre ci-dessous la réponse de vikas027 (valable pour centos)

71
Ofer Eliassaf

C'est ce qui a fonctionné pour moi sur CentOS 7.2 et Docker 1.12.1 (le plus tard à la date). Mon registre privé v2 fonctionnait sur 192.168.1.88:5000, changez-le en conséquence. Cela fonctionne aussi si vous avez plusieurs registres, continuez simplement à ajouter --insecure-registry IP:Port

$ Sudo vim /usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.88:5000
$
$ Sudo systemctl stop docker
$ Sudo systemctl daemon-reload
$ systemctl start docker
27
vikas027

Editez le fichier de configuration "/ etc/default/docker"

Sudo vi/etc/default/docker

ajouter la ligne à la fin du fichier

DOCKER_OPTS = "$ DOCKER_OPTS --insecure-registry = 192.168.2.170: 5000"

(remplacez le 192.168.2.170 par votre propre adresse IP)

et redémarrez le service Docker

Redémarrage du docker de service Sudo

24
daozhao

J'ai trouvé les informations suivantes très utiles car elles expliquent comment le service Docker est configuré. https://docs.docker.com/articles/systemd/

Avec cet article sur la commande systemctl https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

J'ai utilisé la série de commandes suivante dans un conteneur basé sur Centos 7 avec une image de registre obtenue par "docker pull registry: 2.1.1"

Sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d
Sudo touch override.conf
Sudo nano override.conf

Et à l'intérieur de override.conf ajouté ce qui suit.

[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

Notez que la première, vide, ExecStart = efface tout ce qui est déjà en place, alors assurez-vous d’ajouter quoi que ce soit de l’instruction /usr/lib/systemd/system/docker.service ExecStart = que vous souhaitez conserver.

Si vous ne spécifiez pas l'option -d (démon), vous obtiendrez une erreur "Veuillez ne spécifier qu'un seul -H".

Après avoir émis la série de commandes suivante, je peux voir mes remplacements en place.

Sudo systemctl stop docker
Sudo systemctl daemon-reload
Sudo systemctl start docker
Sudo systemctl status docker

docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─override.conf
   Active: active (running) since Thu 2015-09-17 13:37:34 AEST; 7s ago
     Docs: https://docs.docker.com
 Main PID: 5697 (docker)
   CGroup: /system.slice/docker.service
           └─5697 /usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

REMARQUE: Les informations fournies par les lignes Loaded: et Drop-In: du message d'état sont utiles pour vérifier le fonctionnement d'un démon docker préexistant.

REMARQUE: Consultez également le fichier Loaded: docker.service pour un fichier Environment = = afin de trouver des indices supplémentaires.

12
TJA

D'accord. Voici comment je l’ai fait fonctionner. Si vous voyez cette erreur dans docker 1.3.2 ou supérieur, faites ceci

aller à /etc/sysconfig/docker

other_args="--insecure-registry 10.0.0.26:5000"

et courir

Sudo service docker restart

12
Jay

utilisez la commande suivante en remplaçant {YOUR_REGISTRY} par votre registre

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | Sudo tee -a /var/lib/boot2docker/profile && Sudo /etc/init.d/docker restart"
9
JaTo

modifier le fichier docker.service, ajouter --insecure-registry x.x.x.x après l'option -d, redémarrer le menu fixe

c'est la seule chose qui a fonctionné pour moi, le DOCKER_OPTS n'a eu aucun effet

7
Diman

Docker 1.12.1

Pour CentOS 7.2

/usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000

Pour buntu 16.04

/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000 -H fd://

Sudo systemctl stop docker
Sudo systemctl daemon-reload
Sudo systemctl start docker

Il semble que l'option --insecure-registry puisse être utilisée avec et sans le "=" entre elle et l'ID de registre.

4
tedwards

J'ai trouvé que la version du client Docker et la version du docker du Registre doivent être identiques, sinon vous auriez des problèmes de connectivité, même si tout était en place.

2
Saikrishna Rao

Ceci est basé sur la réponse de vikas027 sur Centos 7 et Docker 1.12

Depuis que je suis derrière un proxy, ma solution complète était ...

/etc/systemd/system/docker.service.d/http-proxy.conf

[Service]

Environment="FTP_PROXY={{MY_PROXY}}"
Environment="ftp_proxy={{MY_PROXY}}"

Environment="HTTPS_PROXY={{MY_PROXY}}"
Environment="https_proxy={{MY_PROXY}}"

Environment="HTTP_PROXY={{MY_PROXY}}"
Environment="http_proxy={{MY_PROXY}}"

Environment="NO_PROXY=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"
Environment="no_proxy=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"

/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --insecure-registry {{MY_INSECURE_REGISTRY_IP}}:5000

et n'oubliez pas de redémarrer :)

Sudo systemctl daemon-reload; Sudo systemctl restart docker;
1
danday74

Solution en deux étapes (sans --insecure-registry):

  1. Télécharger la clé publique de votre registre
  2. Mettez-le dans le répertoire /etc/docker/certs.d/$HOSTNAME/

mkdir -p /etc/docker/certs.d/10.0.0.26:5000
echo -n | openssl s_client -connect 10.0.0.26:5000 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/10.0.0.26:5000/registry.crt

Votre docker va maintenant faire confiance à votre certificat auto-signé.

1
vp_arth

Pour vous épargner les tracas, pourquoi ne pas utiliser le service de registre privé GRATUIT de dockers fourni par gitlab - fonctionne très bien

https://about.gitlab.com/2016/05/23/gitlab-container-registry/

Leur registre est sécurisé, vous n'aurez donc aucun problème

0
danday74

En plus des réponses ci-dessus, j'ajoute ce qui a fonctionné dans "docker pour mac" pour moi:

  1. Cliquez sur l'icône du docker baleine dans le bac Mac dans le coin supérieur droit de votre écran.
  2. Cliquez sur Préférences -> Démon .
  3. Ajoutez votre adresse IP et votre portage aux registres non sécurisés.
  4. Redémarrez le démon.

enter image description here

0
Parantap Sharma

Ce qui suit a été testé avec:

ubuntu@ubuntu-xenial:~$ docker -v
Docker version 17.05.0-ce, build 89658be

J'ai essayé toutes les réponses mentionnées ci-dessus, mais aucune d'entre elles n'a fonctionné pour moi.

Je suivais ces instructions afin de le faire fonctionner

openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -x509 -days 365 -out certs/domain.crt

et

Linux: Copy the domain.crt file to
/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt on every Docker
Host. You do not need to restart Docker.

et d'autres problèmes sont survenus qui ont été résolus comme suit:

Numéro 1

Error response from daemon: Get https://10.20.30.40:8001/v1/users/: x509: cannot validate certificate for 10.20.30.40 because it doesn't contain any IP SANs

solution

Mappage d'hôtes dans/etc/hosts:

10.20.30.40 somehost

Numéro 2

Error response from daemon: Get https://somehost:8001/v1/users/: x509: certificate is valid for , not somehost

solution

réexécutez la commande openssl

$ openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -x509 -days 365 -out certs/domain.crt

appuyez sur entrée à chaque étape sauf à:

Common Name (e.g. server FQDN or YOUR name) []:

et tapez le nom de domaine du registre, à savoir somehost

Assurez-vous d'utiliser le nom myregistrydomain.com en tant que CN.

la connexion au registre réussit maintenant

Numéro 3

Réponse d'erreur du démon: Get https: // somehost: 8001/v1/users / : x509: certificat signé par une autorité inconnue

solution

Sudo mkdir -p /etc/docker/certs.d/somehost:8001/
Sudo cp certs/domain.crt /etc/docker/certs.d/somehost:8001/ca.crt
0
030

Définition du registre local non sécurisé dans docker avec proxy:

1) dans Ubuntu, ajoutez l’indicateur suivant --insecure-registry IP: port sous DOCKER_OPTS dans le fichier/etc/default/docker

1.1) configurez la variable d'environnement no_proxy de manière à contourner l'adresse IP locale/le nom d'hôte/le nom de domaine ... car le proxy peut envoyer un msg interactif ... comme continuer et ce msg intermédiaire confond le client docker et, enfin, le délai d'expiration ...

1.2) si nom de domaine est configuré ... alors n'oubliez pas de mettre à jour le fichier/etc/hosts si vous n'utilisez pas DNS.

1.3) dans/etc/default/docker définissez les variables env http_proxy et https_proxy ..., car elles permettent de télécharger des images depuis des hubs externes à la société. format http_proxy = http: // nom d'utilisateur: mot de passe @ proxy: port

2) redémarrez le service de menu fixe ... s'il est installé en tant que service, utilisez le redémarrage du service de base Sudo

3) redémarrez le conteneur de registre [Sudo docker run -p 5000: 5000 registry: 2]

4) marquez l’image désirée à l’aide de la balise de docker Sudo

5) Appuyez sur l'image ... Sudo docker Appuyez sur ip: port/imagename

6) Si vous voulez extraire l’image d’une autre machine, dites B sans TLS/SSL, appliquez les valeurs 1, 1.1 et 2 dans B. Si ces modifications ne sont pas effectuées sur la machine B, la lecture échouera.

0
Ragha

buntu 16.04

Créer (n'existe pas) le fichier /etc/systemd/system/docker.service.d/registry.conf avec le contenu:

[Service]
#You need the below or you 'ExecStart=' or you will get and error 'Service has more than one ExecStart= setting, which is only allowed'
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 10.20.30.40:5000

ensuite

Sudo systemctl stop docker
Sudo systemctl daemon-reload
Sudo systemctl start docker
0
danday74