3 votes

Comment se connecter à un registre Docker qui a un préfixe HTTP défini ?

J'ai configuré mon propre registre Docker, mais je ne voulais pas qu'il se trouve sur l'URL racine, donc lorsque j'ai créé le service, j'ai utilisé l'option REGISTRY_HTTP_PREFIX et lui donner la valeur suivante /registry/ L'URL du registre est donc https://tools.example.com/registry . Ce message est transmis par Nginx qui a une configuration Basic Auth.

J'ai testé l'accès au registre à l'aide d'un navigateur et j'ai pu faire en sorte qu'il indique qu'il n'y a pas de dépôts en allant dans le menu suivant http://tools.example.com/registry/v2/_catalog :

enter image description here

Cela m'a conduit à penser qu'il fonctionnait. Cependant, lorsque j'essaie de me connecter au registre à l'aide de la ligne de commande Docker, j'obtiens l'authentification de base, mais la connexion échoue parce que l'URL est incorrecte.

docker login -u russells -p xxxxxxxx https://tools.example.com/registry/
Error response from daemon: login attempt to https://tools.example.com/v2/ failed with status: 404 Not Found

Comme on peut le voir dans l'erreur, le préfixe n'est pas ajouté correctement. Alors comment puis-je me connecter au registre pour pouvoir pousser des images. Y a-t-il une variable d'environnement ou quelque chose que j'ai oublié pour faire en sorte que le préfixe soit ajouté correctement ? docker login fonctionnent correctement ?

Mise à jour - 2017-08-12 2253 BST

J'ai un peu joué avec la configuration, mais je n'arrive toujours pas à aller très loin.

Comme demandé, voici mes fichiers de configuration.

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    keepalive_timeout  65;

    upstream docker-registry {
        server registry:5000;
    }

    map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
        '' 'registry/2.0';
    }

    server {
        listen 15000;
        server_name tools.example.com;

        # disable any limits to avoid HTTP 413 for large image uploads
        client_max_body_size 0;

        # required to avoid HTTP 411
        chunked_transfer_encoding on;

        location /registry/ {

            # 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;
            }

            auth_basic "Docker Registry";
            auth_basic_user_file /etc/nginx/.htpasswd;

            add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

            proxy_pass                      http://docker-registry/registry/;
            proxy_set_header    Host        $http_host;
            proxy_set_header    X-Real-IP   $remote_addr;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto $scheme;
            proxy_read_timeout              900;

        }
    }
}

Mon service de registre Docker est déployé en tant que registry et fonctionne sur le port par défaut de 5000. En regardant cela maintenant, je pense que j'ai confondu les choses. Je n'ai pas besoin que le registre réponde sur le préfixe lui-même, seulement Nginx.

Par exemple, si je laisse l'emplacement défini sur / alors je peux me connecter, mais si je change cela en /registry/ alors je ne suis pas en mesure de le faire. Je commence à penser que les deux sont en conflit l'un avec l'autre.

Registre

Je n'ai pas défini de configuration pour le registre autre que la seule variable d'environnement. REGISTRY_HTTP_PREFIX qui sont peut-être superflus dans cette configuration.

Mise à jour - 2017-08-15 1100 BST

Afin de tester le prefix pour le registre, j'ai créé un conteneur de registre avec le fichier de configuration suivant :

version: 0.1
auth:
  htpasswd:
    realm: Docker Registry
    path: /auth/etc/htpasswd
storage:
  filesystem:
    rootdirectory: /var/lib/registry
    maxthreads: 100
http:
  addr: 0.0.0.0:5000
  prefix: /registry/
  tls:
    certificate: /auth/ssl/certs/registry.cert
    key: /auth/ssl/private/registry.key

Comme cela utilise des certificats auto-signés, j'ai mis à jour mon moteur Docker en plaçant le certificat dans le répertoire /etc/docker/certs.d/host-lin-01:5000 .

J'ai ensuite créé le conteneur avec la commande suivante :

docker run -it --rm -p 5000:5000 --name registry_test -v ~/workspaces/docker/registry/etc/registry.yml:/etc/docker/registry/config.yml -v ~/workspaces/docker/registry:/auth registry:2

Si j'essaie de me connecter au registre avec la commande :

docker login -u russells -p xxxxxx https://host-lin-01:5000/registry

Je reçois l'erreur suivante :

Error response from daemon: login attempt to https://host-lin-01:5000/v2/ failed with status: 404 Not Found

Maintenant, si je retire le perfix: /registry/ du fichier yaml du registre et redémarrez le conteneur, puis connectez-vous, tout va bien :

docker login -u russells -p xxxxxx https://turtle-host-03:5000/
Login Succeeded

Ce qui est étrange, cependant, c'est que la connexion fonctionne pour tout que je mets à la fin de l'URL de connexion, par ex.

docker login -u russells -p xxxxxx https://turtle-host-03:5000/registry/fred/34
Login Succeeded

Je ne comprends pas cela. Je dois mal comprendre ce que le prefix Le réglage de l'appareil le fait.

0voto

Tarun Lalwani Points 75641

Votre problème est l'application de votre Auth. de base. Vous avez donc Nginx avec Basic Auth qui est soutenu par un simple registre.

Vous êtes capable d'authentifier les urls et de voir le _catalog blank json, et cela vous donne l'impression que ça fonctionne. Mais techniquement, ce qui se passe, c'est que votre Nginx demande un nom d'utilisateur/mot de passe, qui l'obtient et le transmet ensuite à votre registre docker. Qui à son tour n'a pas d'authentification.

Maintenant, lorsque vous utilisez docker login vous attendez un registre authentifié mais vous avez un nginx authentifié et un registre non authentifié. Vous devez donc supprimer les lignes de code suivantes de votre configuration de nginx

auth_basic "Docker Registry";
auth_basic_user_file /etc/nginx/.htpasswd;

En outre, lorsque vous lancez votre registre, vous devez définir les variables d'environnement suivantes

  REGISTRY_AUTH: htpasswd
  REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
  REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm

Assurez-vous de cartographier /auth/htpasswd de votre hôte vers le conteneur de registre. Faites cela et l'installation devrait fonctionner. Assurez-vous également de configurer les certificats du serveur dans votre système client Docker.

Modifications facultatives

La partie suivante de cette réponse est facultative en tant que telle. Puisque vous utilisez Nginx et Registry tous les deux. Je vous suggère de laisser tomber le REGISTRY_HTTP_PREFIX de votre registre et modifiez le proxy_pass a

proxy_pass http://docker-registry/;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X