Skip to content

Instantly share code, notes, and snippets.

@jsoques
Last active July 16, 2023 21:18
Show Gist options
  • Save jsoques/d77d00e164e20b9a0c39b03fb63d1b33 to your computer and use it in GitHub Desktop.
Save jsoques/d77d00e164e20b9a0c39b03fb63d1b33 to your computer and use it in GitHub Desktop.
Create private Docker Registry with Caddy as proxy server and using dynu.com as ddns service

Como crear tu repositorio privado para imágenes docker (con Caddy server)

Este gist/doc te permite crear tu propio repositorio de imágenes docker privado gratis sin las limitaciones de docker.hub (versión free).

Requisitos

  • Un dominio o en su defecto un servicio ddns (yo utilizo dynu.com)
  • Servidor Linux con docker instalado (ejemplo en este documento: Ubuntu 22.04)
  • Caddy server (instalación mas adelante)

Tu dominio En este ejemplo usare un ddns de dynu.com

Instalar el cliente dynu para actualizar tu IP publica: enlace Supongamos que ya tienes configurado tu dominio como "miregistro.ddnsgeek.com" dashboard de dynu

Asegurar que el registro DNS (A y AAAA) apunta a tu ip externo. dynu-dns-manage

Debes configurar tu router también para que haga port mapping a tu servidor interno. Esto es para enrutar https(puerto 443). Como el método depende del router te dejo aquí un enlace que te puede ayudar.

Instalación de Docker En la consola de tu servidor Linux (en este ejemplo, Ubuntu 22.04) instalaremos primero Docker:

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Para no usar sudo a cada rato con docker, agregamos nuestro usuario al grupo docker:

sudo usermod -aG docker $USER
newgrp docker

Podemos verificar que funciona:

docker run hello-world

Recurso

Instalación de Caddy

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o \
/usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Probamos que Caddy se instalo y esta corriendo:

sudo systemctl status caddy 

La salida debe tener Active: active (running) en una linea.

Habilitamos el firewall de Ubuntu

sudo ufw enable
sudo ufw allow ssh
sudo ufw allow https
sudo ufw allow http
sudo ufw allow 5000

Puedes ahora probar que Caddy esta escuchando por puerto 80 navegando al la dirección IP de to servidor Linux: http://xxx.xxx.xxx.xxx y debe salir una pagina similar a esta imagen.

Instalar Docker Registry En nuestro directorio de Linux (/home/{usuario}) creamos un directorio (yo lo llame docker-registry)

mkdir ~/docker-registry

Cambiamos a ese directorio:

cd ~/docker-registry

Creamos un directorio donde se almacenara nuestros imágenes docker:

mkdir data

Instalamos utilidades de Apache (para autenticar usuarios):

sudo apt install apache2-utils -y

Creamos otra carpeta:

mkdir ~/docker-registry/auth

Cambiamos a ese directorio:

cd ~/docker-registry/auth

Creamos un usuario para login al registry (reemplaza {miusuario}):

htpasswd -Bc registry.password {miusuario}

Ahora creamos un docker-compose.yml:

cd .. 
nano docker-compose.yml

Y lo iniciamos con este contenido:


services:
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- ./auth:/auth
- ./data:/data 

Guardamos el docker-compose.yml (Ctrl-O enter y luego Ctrl-X) Iniciamos el contenedor docker:

docker compose up -d

Verificamos que este corriendo la imagen:

docker ps

Podemos ver los logs de la imagen (reemplaza {container_id} con el id del comando anterior):

docker logs {container_id}

Adaptado de este documento.

Configuración de Caddy server para proxy reverso

sudo nano /etc/caddy/Caddyfile 

Podemos reemplazar el contenido con esto (reemplazar miregistro.ddnsgeek.com con tu dominio):

miregistro.ddnsgeek.com {
reverse_proxy /v2/* 127.0.0.1:5000 {
header_up Docker-Distribution-Api-Version "registry/2.0"
header_up X-Forwarded-Proto "https"
}
}

Guardamos el archivo Caddyfile y reiniciamos el servicio:

sudo systemctl restart caddy.service

Si todo salio bien no debe salir mensaje de error, vemos el status:

sudo systemctl status caddy.service

Asegurar que tu router este redireccionando puerto 443 a tu Linux Un enlace que te puede ayudar.

Crear imagen docker de nuestro proyecto Podemos ahora trasladarnos a nuestro estación de trabajo (Windows o Linux) En este ejemplo sigo en Linux (Xubuntu) con docker instalado: Hacemos login a nuestro registro (usando tu dominio y usuario/password creado anteriormente):

docker login miregistro.ddnsgeek.com

Ahora en lugar de crear la imagen docker con tu cuenta de docker.hub puedes crearlo con tu registro local. Por ejemplo:

docker build -t miregistro.ddnsgeek.com/elproyecto .

En el docker-compose de tu proyecto:

...
image: miregistro.ddnsgeek.com/elproyecto
...

Puedes ver tu catalogo de imágenes con este URL:

https://miregistro.ddnsgeek.com/v2/_catalog

No es muy bonito (json crudo) pero es mejor que nada. Faltaría un administrador de registro pero eso es para otra entrega...

Ya debes poder 'jalar' tus imágenes de tu repositorio docker privado.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment