¿Cómo obtener acceso remoto a un registro Docker privado?

82

Estoy tratando de configurar un registro de Docker privado usando la imagen tomada de: https://github.com/docker/docker-registry

Simplemente ejecutando:
docker run -p 5000:5000 registry

Puedo extraer / empujar desde / hacia este repositorio solo desde localhost, pero si intento acceder a él desde otra máquina (usando una dirección privada en la misma LAN), falla con un mensaje de error:

*2014/11/03 09:49:04 Error: Invalid registry endpoint https ://10.0.0.26:5000/v1/': 
Get https:// 10.0.0.26:5000/v1/_ping: Forbidden. If this private 
registry supports only HTTP or HTTPS with an unknown CA certificate,
please add `--insecure-registry 10.0.0.26:5000` to the daemon's 
arguments. In the case of HTTPS, if you have access to the registry's
CA certificate, no need for the flag; simply place the CA certificate 
at /etc/docker/certs.d/10.0.0.26:5000/ca.crt*

Lo que me vuelve loco es que puedo acceder a él con éxito usando: curl 10.0.0.26:5000 y / ocurl 10.0.0.26:5000/v1/search

Tampoco entiendo dónde y cómo debo pasar la --insecure-registrybandera.

Ofer Eliassaf
fuente
3
muchas de las respuestas parecen estar desactualizadas para la ventana acoplable 1.12, pero vea la respuesta de vikas027, que es excelente para la ventana acoplable 1.12 (último ATOW)
danday74
1
En Ubuntu, la documentación de Docker y esta respuesta funcionaron bien para mí.
Batandwa

Respuestas:

73

OK, encontré la solución a esto, después de un día de excavación.

Para Docker por debajo de 1.12.1:

Resulta que la nueva versión del cliente se niega a trabajar con un registro privado sin SSL.

Para solucionar este problema, el demonio en la máquina cliente debe iniciarse con el indicador inseguro:

Sólo tipo:

sudo service docker stop # to stop the service

y entonces

sudo docker -d --insecure-registry 10.0.0.26:5000

(reemplace el 10.0.0.26con su propia dirección IP).

Esperaría que los chicos de Docker agreguen esta opción a la línea de comando de extracción / inserción ...

Editar, alternativamente, puede agregar la bandera a la DOCKER_OPTSvariable env dentro de / etc / default / docker ... y luegosudo service docker restart

Edite de nuevo: parece que los chicos de Docker están en eso, y pronto habrá una solución: https://github.com/docker/docker/pull/8935

Para la ventana acoplable 1.12.1:

Siga a continuación la respuesta de vikas027 (válido para centos)

Ofer Eliassaf
fuente
Pude replicar sus pasos y enviarlos a un registro privado en un host remoto. También mostró un empuje exitoso. Sin embargo, ¿cómo incluyo imágenes en el registro privado? Lo intenté docker -H tcp://remote-host-ip:5000 imagespero volví con un error.
Howard Lee
Puedo verificar que esto sucede. También sucede cuando consulta <ip>: 5000 / v1 / search - obtiene una respuesta vacía. Probablemente un error diferente que tienen :-(
Ofer Eliassaf
Actualización: pude buscar / extraer imágenes almacenadas en un registro privado remoto. docker search remote-host-ip:5000/image-namey docker pull remote-host-ip:5000/image-nameambos funcionan bien. Ahora, ¿cómo hago para que enumere las imágenes ...
Howard Lee
3
@ashleyaitken, utilicé la siguiente referencia para ayudarme a resolver con Boot2Docker: github.com/boot2docker/boot2docker#insecure-registry . Espero que ayude.
Patelify
1
--insecure-registryes una solución alternativa y no una solución.
peterh - Reincorporar a Monica
28

Esto es lo que funcionó para mí en CentOS 7.2 y Docker 1.12.1 (la última fecha). Mi registro privado v2 se estaba ejecutando 192.168.1.88:5000, cámbielo en consecuencia. Esto también funciona si tiene varios registros, solo siga agregando--insecure-registry IP:Port

$ sudo vim /usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.88:5000
$
$ sudo systemctl stop docker
$ sudo systemctl daemon-reload
$ systemctl start docker
vikas027
fuente
1
Esta solución fue la única que me funcionó en Ubuntu.
JARC
1
Gracias hombre - funcionó muy bien - agregó una respuesta más completa basada en esto para aquellos detrás de un proxy corporativo
danday74
2
Me funcionó, pero docker.service estaba en /lib/systemd/system/docker.serviceUbuntu 16.04.
Karim Tabet
4
--insecure-registryes una solución alternativa y no una solución.
peterh - Restablece a Monica
1
trabajo. O tiene que piratear todo su sistema (otra "característica" similar es que "red puenteada" significa en realidad red NAT en la ventana acoplable, mientras que la red puenteada real simplemente no existe). Estas respuestas popularizan soluciones terribles para problemas importantes, que podrían solucionarse fácilmente, pero de alguna manera no lo son. Esta fue la razón por la que los rechacé a todos: todos son malas soluciones.
peterh - Reincorporar a Monica
24

Edite el archivo de configuración "/ etc / default / docker"

sudo vi / etc / default / docker

agregue la línea al final del archivo

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

(reemplace 192.168.2.170 con su propia dirección IP)

y reinicie el servicio Docker

reinicio de la ventana acoplable del servicio sudo

daozhao
fuente
¡Gracias! La edición de /etc/init.d/dockerplano no funciona en Ubuntu 14.04, sorprendentemente. Pero tu solución lo /etc/default/dockerhace.
elimisteve
mi sistema host también es Ubuntu 14.04
daozhao
1
--insecure-registryes una solución alternativa y no una solución.
peterh - Restablece a Monica
12

Encontré lo siguiente muy útil ya que analiza cómo se configura el servicio Docker en sí. https://docs.docker.com/articles/systemd/

Junto con este artículo sobre el comando systemctl https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

Utilicé la siguiente serie de comandos en un contenedor basado en Centos 7 con una imagen de registro obtenida por "docker pull registry: 2.1.1"

sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d
sudo touch override.conf
sudo nano override.conf

Y dentro de override.conf se agregó lo siguiente.

[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

Tenga en cuenta que la primera, en blanco, ExecStart = borra todo lo que ya está en su lugar, así que asegúrese de agregar cualquier cosa de la declaración /usr/lib/systemd/system/docker.service ExecStart = que desee retener.

Si no especifica la opción -d (demonio), obtendrá el error "Por favor, especifique solo una -H".

Después de emitir la siguiente serie de comandos, puedo ver mis anulaciones en su lugar.

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker

docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─override.conf
   Active: active (running) since Thu 2015-09-17 13:37:34 AEST; 7s ago
     Docs: https://docs.docker.com
 Main PID: 5697 (docker)
   CGroup: /system.slice/docker.service
           └─5697 /usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

NOTA: La información proporcionada por las líneas Loaded: y Drop-In: en el mensaje de estado, es útil para verificar qué está sucediendo con un demonio docker preexistente para que funcione.

NOTA: También eche un vistazo al archivo Loaded: docker.service para un EnvironmentFile = para obtener más pistas.

TJA
fuente
2
--insecure-registryes una solución alternativa y no una solución.
peterh - Restablece a Monica
Hola @peterh, entiendo que es una solución alternativa y una insegura. No tengo ninguna duda de que existen sistemas de producción que lo utilizan, lo cual es algo muy malo.
TJA
1
@peterh, ¿puede indicarme cualquier enlace que muestre cómo hacerlo correctamente y actualizaré mi respuesta y haré referencia al enlace?
TJA
11

Okay. Así es como lo hice funcionar. Si ve este error en la ventana acoplable 1.3.2 o superior, haga esto

ir /etc/sysconfig/docker

other_args="--insecure-registry 10.0.0.26:5000"

y correr

sudo service docker restart

Arrendajo
fuente
1
tiene que poner un '=' para afectar el valor del registro en ubuntu: "- insecure-registry = 10.0.0.26: 5000"
Romain Jouin
@Jay soy un novato. 1.3.2 suena como una versión futura de Docker. Veo que la versión actual es 1.12 github.com/docker/docker/releases si no me equivoco aquí.
ravindrab
1
@ravindrab ¿en qué universo es 12 menor que 3? ;)
ferrari2k
2
--insecure-registryes una solución alternativa y no una solución.
peterh - Restablece a Monica
9

use el siguiente comando reemplazando {YOUR_REGISTRY} con su registro

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
JaTo
fuente
boot2dockeres un juego de herramientas independiente irrelevante para el contexto de la pregunta.
Arnaud Meuret
2
--insecure-registryes una solución alternativa y no una solución.
peterh - Restablece a Monica
7

edite el archivo docker.service, agregue --insecure-registry xxxx después de la marca -d, reinicie la ventana acoplable

esto es lo único que funcionó para mí, el DOCKER_OPTS no tuvo ningún efecto

Diman
fuente
todo lo que dices es cierto, pero el detalle es tan escaso que la respuesta es casi inútil
danday74
2
--insecure-registryes una solución alternativa y no una solución.
peterh - Reincorpora a Monica
4

Docker 1.12.1

Para CentOS 7.2

/usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000

Para ubuntu 16.04

/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000 -H fd://

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker

Parece que la opción --insecure-registry se puede usar con y sin el "=" entre esta y la ID del registro.

tedwards
fuente
2
--insecure-registryes una solución alternativa y no una solución.
peterh - Reincorpora a Monica
2

Descubrí que la versión del cliente de la ventana acoplable y la versión de la ventana acoplable del registro deben coincidir; de lo contrario, se encontrarían con problemas de conectividad, a pesar de tener todo en su lugar.

Saikrishna Rao
fuente
2

Solución de dos pasos (sin --insecure-registry):

  1. Descargue la clave pública de su registro
  2. Ponlo en /etc/docker/certs.d/$HOSTNAME/directorio

 

mkdir -p /etc/docker/certs.d/10.0.0.26:5000
echo -n | openssl s_client -connect 10.0.0.26:5000 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/10.0.0.26:5000/registry.crt

Ahora su ventana acoplable confiará en su certificado autofirmado.

vp_arth
fuente
1

Esto se basa en la respuesta de vikas027 en Centos 7 y Docker 1.12

Como estoy detrás de un proxy, mi solución completa fue ...

/etc/systemd/system/docker.service.d/http-proxy.conf

[Service]

Environment="FTP_PROXY={{MY_PROXY}}"
Environment="ftp_proxy={{MY_PROXY}}"

Environment="HTTPS_PROXY={{MY_PROXY}}"
Environment="https_proxy={{MY_PROXY}}"

Environment="HTTP_PROXY={{MY_PROXY}}"
Environment="http_proxy={{MY_PROXY}}"

Environment="NO_PROXY=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"
Environment="no_proxy=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"

/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --insecure-registry {{MY_INSECURE_REGISTRY_IP}}:5000

y no te olvides de reiniciar :)

sudo systemctl daemon-reload; sudo systemctl restart docker;
danday74
fuente
1
--insecure-registryes una solución alternativa y no una solución.
peterh - Reincorpora a Monica
0

Configuración del registro inseguro local en la ventana acoplable junto con el proxy:

1) en ubuntu agregue la siguiente bandera --insecure-registration IP: port bajo DOCKER_OPTS en el archivo / etc / default / docker

1.1) configure la variable env no_proxy para omitir la IP local / nombre de host / nombre de dominio ... ya que el proxy puede lanzar un mensaje interactivo ... como continuar y este mensaje intermedio confunde al cliente de Docker y finalmente se agota el tiempo de espera ...

1.2) si el nombre de dominio está configurado ... entonces no olvide actualizar el archivo / etc / hosts si no usa DNS.

1.3) en / etc / default / docker configure las variables env http_proxy y https_proxy ... ya que permite descargar imágenes desde centros externos de la empresa. formato http_proxy = http: // nombre de usuario: contraseña @ proxy: puerto

2) reinicie el servicio docker ... si está instalado como servicio, use sudo service docker restart

3) reinicie el contenedor del registro [sudo docker run -p 5000: 5000 registro: 2]

4) etiquete la imagen requerida usando sudo docker tag imageid IP: puerto / imagename / tagname ifany

5) empujar la imagen ... sudo docker empujar ip: puerto / nombre de imagen

6) Si desea extraer la imagen de otra máquina, diga B sin TLS / SSL, entonces en B aplique los conjuntos 1,1.1 y 2. Si estos cambios no se realizan en la máquina B ... la extracción fallará.

Ragha
fuente
2
--insecure-registryes una solución alternativa y no una solución.
peterh - Reincorpora a Monica
0

Ubuntu 16.04

Crear (no existe) archivo /etc/systemd/system/docker.service.d/registry.confcon contenido:

[Service]
#You need the below or you 'ExecStart=' or you will get and error 'Service has more than one ExecStart= setting, which is only allowed'
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 10.20.30.40:5000

entonces

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
danday74
fuente
0

Además de las respuestas anteriores, estoy agregando lo que funcionó en "Docker para Mac" para mí:

  1. Haga clic en el icono de la ballena docker de la bandeja de mac en la esquina superior derecha de la pantalla.
  2. Haga clic en Preferencias -> Daemon .
  3. Agregue su IP y puerto a los registros inseguros.
  4. Reinicie el Daemon.

ingrese la descripción de la imagen aquí

Parantap Sharma
fuente