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