webentwicklung-frage-antwort-db.com.de

Verwendung der auf Docker gehosteten privaten Registrierung

Ich hoste meine eigene Docker-Registry in einem Docker-Container. Es wird von Nginx angezeigt, das in einem separaten Container ausgeführt wird, um grundlegende Authentifizierung hinzuzufügen. Überprüfen der _ping-Routen Ich kann sehen, dass nginx das richtige Routing ausführt. Beim Aufruf von docker login von boot2docker (unter Mac OS X) erhalte ich folgenden Fehler:

FATA [0003] Fehlerantwort vom Dämon: Ungültiger Registrierungsendpunkt https://www.example.com:8080/v1/ : Get https://www.example.com:8080/v1/_ping : x509: Zertifikat von unbekannter Stelle signiert. Wenn diese private Registrierung nur HTTP oder HTTPS mit einem unbekannten CA-Zertifikat unterstützt, fügen Sie den Argumenten des Daemons --insecure-registry www.example.com:8080 hinzu. Wenn Sie bei HTTPS Zugriff auf das CA-Zertifikat der Registrierung haben, ist das Flag nicht erforderlich. Legen Sie einfach das CA-Zertifikat unter /etc/docker/certs.d/www.example.com:8080/ca.crt ab

Was seltsam ist - weil es ein gültiges CA SSL-Zertifikat ist. Ich habe versucht, --insecure-registry in EXTRA-ARGS wie folgt hinzuzufügen: https://github.com/boot2docker/boot2docker#insecure-registry aber anfangs existiert die 'profile'-Datei nicht. Wenn ich es erstelle und hinzufüge

EXTRA_ARGS="--insecure-registry www.example.com:8080"

Ich sehe keine Besserung. Ich wollte das Beispiel isolieren und versuchte docker login von einem Ubuntu VM (nicht boot2docker). Jetzt erhalte ich einen anderen Fehler:

Error response from daemon: 

Die Docker-Registrierung wird direkt vom öffentlichen Hub ausgeführt, z.

docker run -d -p 5000:5000 registry

(Beachten Sie, dass Nginx Routen von 8080 bis 5000). Hilfe und/oder Ressourcen zum Debuggen dieses Problems sind sehr willkommen.

UPDATE

Ich habe nach einem Leitfaden gesucht, um dieses Problem umfassend zu lösen. Speziell:

  • Erstellen Sie eine private Registrierung
  • Sichern Sie die Registrierung mit der Basisauthentifizierung
  • Verwenden Sie die Registrierung von boot2docker

Ich habe die Registrierung erstellt und lokal getestet, es funktioniert. Ich habe die Registrierung mit Nginx gesichert und grundlegende Authentifizierung hinzugefügt.

Das Problem besteht nun darin, die Registrierung von zwei Clienttypen aus zu verwenden:

1) Nicht-Boot2Docker-Client. Eine der folgenden Antworten hat dabei geholfen. Ich habe den Optionen in/etc/default/docker das Flag --insecure-registry hinzugefügt, und jetzt kann ich mit meiner Remote-Docker-Registrierung sprechen. Dies ist jedoch nicht mit auth kompatibel, da die Docker-Anmeldung eine Fehlermeldung erhält:

2015/01/15 21:33:57 HTTP code 401, Docker will not send auth headers over HTTP.

Wenn ich auth verwenden möchte, muss ich HTTPS verwenden. Ich habe diesen Server bereits über HTTPS bedient, aber das funktioniert nicht, wenn ich --insecure-registry einstelle. Es scheint ein Zertifikatvertrauensproblem zu geben, von dem ich sicher bin, dass ich es auf Nicht-Boot2Docker lösen kann, aber ..

2) Für einen boot2docker-Client kann ich --insecure-registry nicht zum Laufen bringen oder Zertifikate können nicht als vertrauenswürdig eingestuft werden.

UPDATE 2

Nach diesem Stapelaustausch der Frage habe ich es geschafft, die CA zu meinem Ubuntu VM hinzuzufügen, und ich kann sie jetzt von einem Nicht-Boot2Docker-Client aus verwenden. Es gibt jedoch immer noch eine Menge merkwürdiges Verhalten.

Obwohl mein aktueller Benutzer Mitglied der Docker-Gruppe ist (damit ich Sudo nicht verwenden muss), muss ich jetzt Sudo verwenden, oder es wird die folgende Fehlermeldung angezeigt, wenn ich mich anmelden oder von meiner privaten Registrierungabrufen möchte. _

[email protected]:~$ docker login example.com:8080
WARNING: open /home/parallels/.dockercfg: permission denied

[email protected]:~$ docker pull example.com:8080/hw:1
WARNING: open /home/parallels/.dockercfg: permission denied

Und wenn Sie Container ausführen, die zum ersten Mal aus meiner privaten Registrierung abgerufen wurden, muss ich sie anhand der Image-ID angeben - nicht anhand ihres Namens.

16
ConfusedNoob

Bearbeiten Sie die Docker-Datei 

Sudo vim /etc/default/docker

Fügen Sie den DOCKER_OPTS hinzu

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"

Starten Sie den Andockdienst neu

Sudo service docker restart
6
anish

Führen Sie den folgenden Befehl aus:

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

Ändern Sie für Ubuntu bitte die Datei/etc/default/docker

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

Ändern Sie für rehl bitte die Datei/etc/sysconfig/docker

other_args="--insecure-registry 10.27.19.230:5000"
2
Xiaokun

Die Docker-Version> 1.3.1 kommuniziert standardmäßig über HTTPS, wenn eine Verbindung zur Docker-Registrierung hergestellt wird

Wenn Sie Nginx verwenden, um proxy_pass zu Port 5000 zu übertragen, an dem die Docker-Registrierung überwacht wird, müssen Sie die SSL-Verbindung des Docker-Clients zur Docker-Registrierung am Webserver/LB (in diesem Fall Nginx) beenden. Um zu überprüfen, ob Nginx die SSL-Verbindung beendet, verwenden Sie cURL https://www.example.com:8081/something , wobei 8081 ein weiterer Port ist, der zum Testen des SSL-Zertifikats eingerichtet ist.

Wenn es Ihnen egal ist, ob Ihr Docker-Client über HTTP und nicht über HTTPS eine Verbindung zur Registrierung herstellt, fügen Sie hinzu 

OPTIONS = "- unsichere-Registrierung www.example.com:8080"

in/etc/sysconfig/docker (oder gleichwertig in anderen Distributionen) und starten Sie den Andockdienst neu.

Ich hoffe es hilft.

2
Farshid
  1. Registrieren Sie einen SSL-Schlüssel unter https://letsencrypt.org/ Wenn Sie weitere Anweisungen benötigen, lesen Sie diesen Link .

  2. Aktivieren Sie SSL für Nginx. Hinweis zum SSL-Teil im nachstehenden Code: Nach dem Registrieren des SSL-Schlüssels müssen Sie fullchain.pem, privkey.pem, dhparam.pem für nginx verwenden, um SSL zu aktivieren. 

`

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

Es löst mein Problem und hofft, dass es Ihnen hilft.

2
Finn

Wenn Ihre Registrierung HTTPS nicht unterstützt, müssen Sie sie ab Docker Version 1.3.1 als unsichere Registrierung hinzufügen. Für boot2docker ist dies etwas komplizierter als üblich. Siehe: https://github.com/boot2docker/boot2docker#insecure-registry

Die relevanten Befehle sind:

$ 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

Wenn Sie der boot2docker-Instanz SSL-Zertifikate hinzufügen möchten, wird dies ähnlich sein (boot2docker ssh gefolgt von Sudo).

2
scjody

Versuchen Sie, den Dämon mit den Argumenten auszuführen:

docker -d --insecure-registry="www.example.com:8080"

anstatt EXTRA_ARGS einzustellen

1
Miguel Marques