4.1 · Registros: Hub, GHCR y registro privado

Nivel 4 · Registros, fiabilidad y CI

4.1Registros: Hub, GHCR y registro privado

Objetivo: Publicar y descargar imágenes desde el registro correcto, público o privado.
Tiempo estimado: 12 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • Tres registros, tres usos : Docker Hub para compartir en público, GHCR vinculado al código para la CI, registro privado (interno de la empresa) para lo sensible — el nombre completo (registro/cuenta/imagen:tag) dice siempre de dónde viene la imagen.
  • Nos autenticamos con un token de derechos limitados, nunca con la contraseña de la cuenta : pasado por --password-stdin, no queda ni en el historial del shell ni en los logs de la CI — y se revoca en un clic en caso de duda.
  • Reflejo de Idir : en producción, se descarga un nombre completo + tag inmutable (nunca un atajo ambiguo), anotado en el compose de prod para saber qué imagen corre dónde.

Mini-caso hilado — Idir publica la imagen de su startup sin filtrar el token

Idir, devops junior en Argel, debe publicar la imagen de la aplicación de su startup para que el equipo la despliegue : elige GHCR (el código ya está en GitHub), crea un token limitado al push/pull, se conecta vía --password-stdin y sube un tag de versión inmutable. En producción, el equipo descarga el nombre completo y sabe exactamente qué imagen está corriendo. Primer hito del hilo : la imagen está en el lugar correcto, accesible para las personas correctas, sin secreto expuesto.

Este mismo caso vuelve en el curso, el esquema, el guion y el reto 48h — y continúa en 4.2, 4.3, 4.4 y 4.5.

1. Tres registros, tres usos

Docker Hub : la biblioteca pública por defecto, para compartir (open source, imágenes base). GHCR (GitHub Container Registry) : el registro vinculado a su código, perfecto para la CI — cada repositorio tiene ahí sus paquetes. Registro privado (interno de la empresa) : la caja fuerte de las imágenes sensibles, con acceso restringido. El nombre completo lo indica : registro/cuenta/imagen:tag — Idir lee de un vistazo de dónde viene cada imagen.

Elegir es decidir según la sensibilidad y el uso : público para el open source, GHCR para sus CI de GitHub, privado para lo interno sensible. El compose de producción fija la elección anotando los nombres completos.

2. Autenticarse sin exponer

docker login con un token de derechos limitados (push/pull), nunca la contraseña de la cuenta. El token pasa por --password-stdin (tubería, no argumento visible) : nada en el historial del shell, nada en los logs. En CI, el token vive en los secrets del repositorio, nunca en el script ni en el archivo de workflow.

Un token que se filtra se revoca en un clic : por eso nunca se comparte una cuenta — una cuenta compartida comprometida obliga a rehacer todo el acceso. Como Idir, se crea un token por uso y se revoca ante la menor duda.

3. Descargar en producción : fijen la fuente

En producción, se descarga nombre completo + tag inmutable (una versión fijada), nunca un atajo ambiguo que puede cambiar de contenido entre dos despliegues. La trazabilidad « qué imagen corre dónde » empieza con nombres completos anotados en el compose de prod.

Verificar después de la descarga : la imagen iniciada corresponde bien al tag deseado. Un tag móvil en prod es un despliegue que no se puede ni reproducir ni auditar.

Error frecuente de interpretación: « Para ir rápido, pongo mi contraseña en claro con -p y subo en latest : es lo mismo ». No. La contraseña en claro queda en el historial y los logs, y da un acceso total no revocable limpiamente ; un tag móvil en producción vuelve el despliegue irreproducible. Token limitado vía --password-stdin, guardado como secreto CI, tag inmutable en prod : ese trío es lo que hace una publicación limpia.
Publicar sin exponer Buen registro, token limpio, tag fijado Elegir el registro Hub público,GHCR CI, privado internoToken limitado Derechospush/pull, revocableLogin limpio --password-stdin,secreto CITag inmutable Nombrecompleto fijado en prod
Buen registro, token limpio, tag fijado
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Idir elige el registro según el uso : GHCR para la imagen vinculada al código de su startup. 2) Crea un token de derechos limitados (push/pull) en lugar de usar la contraseña de la cuenta. 3) Se conecta vía --password-stdin para que el secreto no quede ni en el historial ni en los logs. 4) Sube un tag de versión inmutable y la producción descarga el nombre completo. Lección : buen registro, token limitado por stdin, tag fijado — y revocación ante la menor duda.

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Subir hacia GHCR

El gesto de Idir : login sin rastro, imagen trazable.

echo $GHCR_TOKEN | docker login ghcr.io -u moncompte --password-stdin
docker build -t ghcr.io/monequipe/app:1.2.0 .
docker push ghcr.io/monequipe/app:1.2.0
# en prod :
docker pull ghcr.io/monequipe/app:1.2.0

Lectura : el token nunca se muestra, la imagen es trazable por su nombre completo.

Lección : --password-stdin evita el secreto en el historial.

Vocabulario de la sección

GHCR
El registro de GitHub, vinculado a los repositorios y a la CI : cada proyecto publica ahí sus imágenes.

Ejemplo sencillo: Idir sube ahí la imagen de la aplicación cuyo código ya está en GitHub.

Lo que no es: una simple carpeta de almacenamiento de archivos.

Reflejo: código en GitHub + imagen por publicar en CI : pensar GHCR.

Token
Ficha de acceso de derechos LIMITADOS y revocable, que sustituye la contraseña para los usos automatizados.

Ejemplo sencillo: Idir crea un token push/pull en lugar de pegar su contraseña en un script.

Lo que no es: la contraseña de la cuenta, total y difícil de revocar limpiamente.

Reflejo: automatizar un acceso : crear un token limitado, nunca la contraseña.

Nombre completo
Dirección sin ambigüedad de una imagen : registro/cuenta/imagen:tag.

Ejemplo sencillo: El equipo de Idir despliega un nombre completo con versión fijada en producción.

Lo que no es: un atajo ambiguo que puede cambiar de contenido.

Reflejo: producción : descargar siempre un nombre completo + tag inmutable.

--password-stdin
Opción de docker login que lee el secreto desde una tubería en lugar de un argumento visible.

Ejemplo sencillo: Idir envía su token por tubería : nada queda en el historial del shell.

Lo que no es: la opción -p que expone el secreto en claro.

Reflejo: conectarse a un registro : siempre vía stdin.

En la práctica — En práctica — Publicar en el lugar correcto

  1. Elija el registro adaptado a su caso (Hub/GHCR/privado).
  2. Cree un token de derechos limitados (push/pull).
  3. Conéctese vía --password-stdin.
  4. Suba un tag inmutable y descárguelo en otro lugar para verificar.
Sus imágenes están en el lugar correcto, accesibles para las personas correctas.

Guion listo para decir — explicar la elección del registro a su responsable (30 s)

« Soy Idir : he publicado nuestra imagen en GHCR con un token limitado al push y al pull, conectado sin dejar rastro. La producción descarga el nombre completo con la versión fijada, así que sabemos exactamente qué imagen está corriendo. Si el token se filtra, lo revoco en un clic. »

Para decir cuando le preguntan por qué no « simplemente subir en público » : muestre la sensibilidad del código.

Modelo copiar-pegar — publicar una versión (GHCR)

echo $GHCR_TOKEN | docker login ghcr.io -u moncompte --password-stdin
docker build -t ghcr.io/monequipe/app:1.2.0 .
docker push ghcr.io/monequipe/app:1.2.0
docker pull ghcr.io/monequipe/app:1.2.0

Imagen open source

Como Idir pero hacia Docker Hub en público : la comunidad puede descargar libremente, versión fijada para la confianza.

Imagen interna sensible

Registro privado de la empresa, repositorio con acceso restringido : solo los equipos habilitados descargan.

Token que se ha filtrado

Revocar inmediatamente el token, crear uno nuevo limitado, verificar los accesos — sin tocar la cuenta.

Prod que debe ser auditable

Nombre completo + tag inmutable anotados en el compose de prod : sabemos qué imagen corre dónde, en todo momento.

Prudencia: Los tokens de registro son secretos : guárdelos en los secretos CI (o un gestor de secretos), nunca en duro en un script, un archivo compose o un workflow — y páselos siempre vía --password-stdin. Un pipeline o un historial que muestre un secreto en claro debe corregirse con urgencia, luego revoque el token expuesto.

✓ Buenas prácticas

  • Tokens limitados, nunca contraseñas.
  • Nombres completos en producción.
  • Revocar ante la menor duda.

✗ Errores frecuentes

  • Login con -p y el secreto visible (historial).
  • Imágenes internas subidas en público.
  • Tags de atajos ambiguos en producción.

Puntos clave

  • Hub = público, GHCR = CI, privado = interno.
  • Tokens limitados vía --password-stdin.
  • Nombre completo + tag inmutable en producción.
  • Se revoca sin dudar.

Reto 48h — aplique mañana

Publique una imagen real : cree un token limitado, conéctese vía --password-stdin, suba un tag de versión y luego descárguelo desde otra máquina.

Lista de salida de la sección
  • Sé elegir el registro adaptado (Hub, GHCR, privado).
  • Sé autenticarme por token limitado vía --password-stdin.
  • Sé subir y descargar un tag inmutable trazable.
Autoevaluación 1-5 : ¿mi último login expuso un secreto en algún lugar?¿sabría decir qué imagen exacta corre en producción?

Preguntas frecuentes

¿Por qué --password-stdin en lugar de -p?

Porque -p expone el secreto en el historial del shell y los logs de CI. La tubería no deja rastro : el token transita sin aparecer nunca en claro.

¿Mantener el mismo registro en todas partes?

No : público para el open source, GHCR para sus CI de GitHub, privado para lo interno sensible. El compose de producción fija la elección con nombres completos.

Comprueba tu comprensión

En CI, ¿cómo autenticarse al registro?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 4Preguntas inéditas y más difíciles para validar tus conocimientos