Publicación de Imágenes Docker en DockerHub con Jenkins

Clase 10 de 21Curso Profesional de DevOps

Resumen

¿Qué es un Artifact en Docker y cómo se utiliza en Jenkins?

Un Artifact es el resultado final de un proceso de integración y desarrollo continuo, y en Docker, puede ser la imagen que montamos para correr nuestros tests. Esta imagen de Docker es crucial porque encapsula todo lo necesario para que una aplicación funcione. Además, es necesario almacenar este Artifact de manera segura y accesible. Docker ofrece el concepto de repositorios para almacenar imágenes, siendo Docker Hub uno de los más comunes. Los repositorios te permiten almacenar y gestionar tus imágenes de manera centralizada.

¿Cómo podemos almacenar imágenes en Docker Hub?

Para empezar a almacenar imágenes en Docker Hub, lo primero que debes hacer es crear una cuenta. Esto se hace en hub.docker.com. Una vez que tengas tu cuenta, sigue estos pasos:

  1. Obtener un token de autenticación: Utiliza este token en tu consola de Docker. Este token actúa como una contraseña que te permitirá interactuar de manera segura con Docker Hub.

  2. Configurar Jenkins para usar Docker Hub: Es crucial que Jenkins pueda autenticar de manera segura y continua con Docker Hub. Para ello:

    • Ve a la sección de Credentials en Jenkins.
    • Navega a 'Jenkins' > 'Global Credentials'.
    • Añade unas nuevas credenciales utilizando la opción de "user name with password". Aquí introduces tu nombre de usuario de Docker y el token como contraseña.
    • Asigna un ID a estas credenciales, tal como 'DockerHub Credentials'. Asegúrate de recordar este ID para su uso en el código posterior.

¿Cómo configuramos el Jenkins file para publicar la imagen?

Una vez que Jenkins está configurado para interactuar con Docker Hub, debes ajustar el Jenkins file para que publique las imágenes cuando cumpla ciertas condiciones, como en ramas específicas de tu proyecto:

def registry = '<tu-repositorio>/mi-imagen'
def registryCredential = 'DockerHub Credentials'

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                script {
                    docker.build("${registry}:latest")
                }
            }
        }
        stage('Push') {
            steps {
                script {
                    docker.withRegistry('', registryCredential) {
                        docker.image("${registry}:latest").push()
                    }
                }
            }
        }
    }
}
  • docker.withRegistry(''): Aquí se deja en blanco para usar el default que es Docker Hub. Si tienes otro repositorio, especifica la URL.

  • docker.image("${registry}:latest").push(): Esta línea sube la imagen a Docker Hub. Ya está etiquetada desde el build, de modo que no necesitas volver a hacerlo.

¿Qué aspectos importantes debemos considerar al almacenar imágenes en Docker Hub?

Al almacenar imágenes en un repositorio como Docker Hub, considera lo siguiente:

  • Seguridad: Aunque el método con token es sencillo, investiga otras alternativas más seguras para proteger tus credenciales.

  • Consistencia: Asegúrate de que todas las imágenes estén bien etiquetadas para evitar confusiones y facilitar los rollbacks si es necesario.

  • Disponibilidad: Almacenarlas de manera remota no solo las hace accesibles desde cualquier lugar, sino que también actúa como un respaldo en caso de fallos locales.

Esto asegura que siempre tengas acceso a tus Artifacts aunque surjan problemas en tu entorno de Jenkins, proporcionando redundancia y permitiendo realizar rollbacks efectivos si es necesario. Con estos pasos realizados, estarás listo para realizar el deployment de tus imágenes de Docker en un entorno productivo desde Docker Hub.