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