J'héberge mon propre registre docker dans un conteneur docker. Nginx s'exécute dans un conteneur séparé pour ajouter une authentification de base. En vérifiant les routes _ping, je peux voir que nginx effectue le routage de manière appropriée. Lorsque j'appelle docker login
depuis boot2docker (sous Mac OSX), le message d'erreur suivant s'affiche:
FATA [0003] Réponse d'erreur du démon: noeud final de registre non valide https://www.example.com:8080/v1/ : Get https://www.example.com:8080/v1/_ping : x509: certificat signé par une autorité inconnue. Si ce registre privé ne prend en charge que HTTP ou HTTPS avec un certificat d'autorité de certification inconnu, veuillez ajouter
--insecure-registry www.example.com:8080
aux arguments du démon. Dans le cas de HTTPS, si vous avez accès au certificat d'autorité de certification du registre, vous n'avez pas besoin de l'indicateur. placez simplement le certificat de l'autorité de certification dans /etc/docker/certs.d/www.example.com:8080/ca.crt
Ce qui est étrange, car il s’agit d’un certificat CA SSL valide. J'ai essayé d'ajouter --insecure-registry
dans EXTRA-ARGS conformément aux instructions suivantes: https://github.com/boot2docker/boot2docker#insecure-registry , mais au départ, le fichier "profil" n'existe pas. Si je le crée, et ajoute
EXTRA_ARGS="--insecure-registry www.example.com:8080"
Je ne vois aucune amélioration. Je voulais isoler l'exemple et j'ai donc essayé docker login
à partir d'un ubuntu VM (et non de boot2docker). Maintenant, je reçois une erreur différente:
Error response from daemon:
Le registre de docker est exécuté directement à partir du hub public, par exemple.
docker run -d -p 5000:5000 registry
(Notez que nginx route de 8080 à 5000). Toute aide et/ou ressources pour aider au débogage seraient grandement appréciées.
METTRE À JOUR
Je cherchais un guide pour aider à résoudre ce problème de manière globale. Plus précisément:
J'ai créé le registre et testé localement, cela fonctionne. J'ai sécurisé le registre avec nginx en ajoutant une autorisation de base.
Le problème est maintenant d’utiliser le registre de deux types de clients:
1) Client non boot2docker. Une des réponses ci-dessous a aidé avec ceci. J'ai ajouté l'indicateur --insecure-registry aux options de/etc/default/docker et je peux maintenant parler à mon registre de docker distant . Cependant, cela n'est pas compatible avec l'auth car l'authentification de docker génère une erreur:
2015/01/15 21:33:57 HTTP code 401, Docker will not send auth headers over HTTP.
Donc, si je veux utiliser auth, il me faudra utiliser HTTPS. J'ai déjà ce serveur servant via HTTPS, mais cela ne fonctionne pas si je configure --insecure-registry. Il semble y avoir un problème de confiance de certificat, que je suis sûr de pouvoir résoudre sur non-boot2docker mais ..
2) Pour un client boot2docker, je ne peux pas obtenir --insecure-registry fonctionner ou des certificats à faire confiance?
UPDATE 2
Après cet échange de pile question, j’ai réussi à ajouter le nom de domaine à mon ubuntu VM et je peux maintenant utiliser le client non boot2docker. Cependant, il y a encore beaucoup de comportement étrange.
Même si mon utilisateur actuel est membre du groupe de dockers (je n'ai donc pas besoin d'utiliser Sudo), je dois maintenant utiliser Sudo ou le message d'erreur suivant s'affiche lorsque j'essaie de me connecter ou d'extraire de mon registre privé
user@ubuntu:~$ docker login example.com:8080
WARNING: open /home/parallels/.dockercfg: permission denied
parallels@ubuntu:~$ docker pull example.com:8080/hw:1
WARNING: open /home/parallels/.dockercfg: permission denied
Et lorsque vous exécutez des conteneurs extraits de mon registre privé pour la première fois, je dois les spécifier à l'aide d'un identifiant d'image, et non de leur nom.
Editer le fichier docker
Sudo vim /etc/default/docker
Ajouter le DOCKER_OPTS
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"
Redémarrage du service de menu fixe
Sudo service docker restart
Exécutez la commande suivante:
boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE Host>\"' | Sudo tee -a /var/lib/boot2docker/profile && Sudo /etc/init.d/docker restart"
Pour Ubuntu, veuillez modifier le fichier/etc/default/docker
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=10.27.19.230:5000"
Pour rehl, veuillez modifier le fichier/etc/sysconfig/docker
other_args="--insecure-registry 10.27.19.230:5000"
Docker version> 1.3.1 communique par défaut sur HTTPS lors de la connexion au registre de docker
Si vous utilisez Nginx to proxy_pass sur le port 5000 où le registre docker est à l'écoute, vous devrez mettre fin à la connexion SSL du client docker au registre docker sur le serveur Web/LB (Nginx dans ce cas). Pour vérifier si Nginx met bien fin à la connexion SSL, utilisez cURL https://www.example.com:8081/something où 8081 est un autre port configuré pour tester le certificat SSL.
Si vous ne voulez pas que votre client docker se connecte au registre via HTTP et non HTTPS, ajoutez
OPTIONS = "- insecure-registry www.example.com:8080"
dans/etc/sysconfig/docker (ou l’équivalent dans d’autres distributions) et redémarrez le service Docker.
J'espère que ça aide.
Enregistrez une clé SSL à partir de https://letsencrypt.org/ si vous avez besoin de plus d’instructions, reportez-vous à ce lien .
Activer SSL pour nginx. Attention à la partie SSL dans le code ci-dessous, après avoir enregistré la clé SSL, vous avez fullchain.pem
, privkey.pem
, dhparam.pem
qui l’utilise pour que nginx active le SSL.
`
server {
listen 443;
server_name docker.mydomain.com;
# SSL
ssl on;
ssl_certificate /etc/nginx/conf.d/fullchain.pem;
ssl_certificate_key /etc/nginx/conf.d/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/conf.d/dhparam.pem;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
# disable any limits to avoid HTTP 413 for large image uploads
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
chunked_transfer_encoding on;
location /v2/ {
# Do not allow connections from docker 1.5 and earlier
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
# To add basic authentication to v2 use auth_basic setting plus add_header
auth_basic "registry.localhost";
auth_basic_user_file /etc/nginx/conf.d/registry.password;
add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
proxy_pass http://docker-registry;
proxy_set_header Host $http_Host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
Cela résout mon problème, j'espère que cela vous aidera.
À partir de la version 1.3.1 de Docker, si votre registre ne prend pas en charge le protocole HTTPS, vous devez l'ajouter en tant que registre non sécurisé. Pour boot2docker, c'est un peu plus compliqué que d'habitude. Voir: https://github.com/boot2docker/boot2docker#insecure-registry
Les commandes pertinentes sont:
$ boot2docker init
$ boot2docker up
$ boot2docker ssh
$ echo 'EXTRA_ARGS="--insecure-registry <YOUR INSECURE Host>"' | Sudo tee -a /var/lib/boot2docker/profile
$ Sudo /etc/init.d/docker restart
Si vous souhaitez ajouter des certificats SSL à l'instance boot2docker, il en sera de même (boot2docker ssh suivi de Sudo).
Essayez d’exécuter le démon avec les arguments:
docker -d --insecure-registry="www.example.com:8080"
au lieu de régler EXTRA_ARGS