Estoy tratando de enviar una imagen, digamos foo/bar , desde mi registro Docker local a un registro que se ejecuta en OpenShift 3.11 (en realidad , Minishift v1.33.0+ba29431).
El registro está en 192.168.64.3:2376 y espera conexiones HTTPS. Utiliza un certificado autofirmado.
Primero copio la etiqueta de la nueva imagen:
docker tag foo/bar 192.168.64.3:2376/app/foo/barEsto tiene éxito. Entonces intento empujar:
$ docker push 192.168.64.3:2376/app/foo/bar The push refers to repository [192.168.64.3:2376/app/foo/bar] Get https://192.168.64.3:2376/v2/: x509: certificate signed by unknown authority o, cuando Docker está configurado para permitir el uso de registros inseguros en 192.168.64.0/24 , comunica HTTP al servidor en lugar de deshabilitar la verificación del certificado:
$ docker push 192.168.64.3:2376/app/foo/bar The push refers to repository [192.168.64.3:2376/app/foo/bar] Get http://192.168.64.3:2376/v2/: EOFLa documentación dice que para un registro inseguro, debería "Primero, intente usar HTTPS. Si HTTPS está disponible pero el certificado no es válido, ignore el error sobre el certificado. Si HTTPS no está disponible, recurra a HTTP". Entonces, no esperaría ver un error EOF.
Tampoco puedo intentar decirle a Docker que use los certificados de Minishift, porque de repente pierde la capacidad de comunicarse con el demonio Docker local (debe usar un socket de dominio Unix, no tcp://localhost:2376):
$ export DOCKER_TLS_VERIFY="1" $ export DOCKER_CERT_PATH="/Users/rzg/.minishift/certs" $ docker push 192.168.64.3:2376/app/foo/bar Cannot connect to the Docker daemon at tcp://localhost:2376. Is the docker daemon running?Esta es la versión de Docker que estoy usando:
Client: Docker Engine - Community Version: 18.09.2 API version: 1.39 Go version: go1.10.8 Git commit: 6247962 Built: Sun Feb 10 04:12:39 2019 OS/Arch: darwin/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.2 API version: 1.39 (minimum version 1.12) Go version: go1.10.6 Git commit: 6247962 Built: Sun Feb 10 04:13:06 2019 OS/Arch: linux/amd64 Experimental: falseSegún la documentación:
Puede poner sus certificados de cliente y clave en
~/.docker/certs.d/<MyRegistry>:<Port>/client.cert
y
~/.docker/certs.d/<MyRegistry>:<Port>/client.key
https://docs.docker.com/docker-for-mac/faqs/#how-do-i-add-custom-ca-certificates
Alternativamente, configura un almacén de credenciales y carga los certificados allí y luego configura el almacén en ~/.docker/config json
Documentación aquí: https://docs.docker.com/engine/reference/commandline/login/
Esas dos variables de entorno que menciona son para que la herramienta de línea de comandos de docker se comunique con el demonio de Docker. Normalmente no es necesario configurarlos. (También tenga en cuenta que el puerto 2376 es el puerto convencional para Docker API HTTP-over-TLS, aunque nada le impide usarlo para un registro en su lugar).
Está intentando configurar el demonio de Docker para comunicarse con un registro remoto en el que confía. La referencia de dockerd dice acerca de los registros seguros :
Un registro seguro usa TLS y se coloca una copia de su certificado CA en el host de Docker en
/etc/docker/certs.d/myregistry:5000/ca.crt.
Entonces, en su configuración, debe encontrar el certificado de CA para su registro y colocarlo en /etc/docker/certs.d/192.168.64.3:2376/ca.crt y luego reiniciar el demonio de Docker.
Esto también se describe en la documentación de OpenShift OKD en Protección y exposición del registro (consulte "Protección manual del registro" y, en particular, los pasos 12 y 13).
El cliente de Docker debe configurarse para (i) aceptar el certificado del registro privado, que está firmado por el certificado de CA, y (ii) presentar un certificado de cliente autorizado.
Minishift coloca todos sus archivos de certificados en ~/.minishift/certs. Esto incluye un certificado de CA (ca.pem), un certificado de cliente (cert.pem) y una clave privada de cliente (key.pem).
Esta consulta de ejemplo demuestra que los tres ingredientes conducen a una conexión exitosa:
curl \ --cacert ~/.minishift/certs/ca.pem \ --cert ~/.minishift/certs/cert.pem \ --key ~/.minishift/certs/key.pem \ https://$(minishift ip):2376/v2/infoEn macOS, debemos seguir esta parte de la documentación de Docker e instalar el certificado de CA en el llavero:
security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain ~/.minishift/certs/ca.pemY también haga enlaces al certificado y la clave del cliente:
mkdir -p ~/.docker/certs.d/$(minishift ip):2376/ ln -s ~/.minishift/certs/cert.pem ~/.docker/certs.d/$(minishift ip):2376/client.cert ln -s ~/.minishift/certs/key.pem ~/.docker/certs.d/$(minishift ip):2376/client.keyFinalmente, reinicie Docker para Mac y luego presione.