web-dev-qa-db-fra.com

Utilisation du registre privé hébergé sur le menu fixe

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:

  • Créer un registre privé
  • Sécuriser le registre avec l'authentification de base
  • Utilisez le registre de boot2docker

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.

16
ConfusedNoob

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
6
anish

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"
3
JaTo

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"
2
Xiaokun

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.

2
Farshid
  1. Enregistrez une clé SSL à partir de https://letsencrypt.org/ si vous avez besoin de plus d’instructions, reportez-vous à ce lien .

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

2
Finn

À 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).

2
scjody

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

1
Miguel Marques