Un poco de Docker

Docker es una plataforma que permite crear, desplegar y ejecutar aplicaciones en contenedores. Los contenedores son entornos aislados que empaquetan una aplicación con todas sus dependencias, lo que garantiza que funcione de manera consistente en cualquier entorno.

Conceptos clave:
Imagen: Plantilla de solo lectura que contiene el código, librerías y dependencias necesarias para ejecutar una aplicación.

Contenedor: Instancia en ejecución de una imagen. Es ligero y aislado del sistema host.

Dockerfile: Archivo de texto con instrucciones para construir una imagen.

Volumen: Almacenamiento persistente para datos, independiente del ciclo de vida del contenedor.

Docker Compose: Herramienta para definir y gestionar múltiples contenedores en una aplicación.

Comandos básicos:
docker build -t nombre_imagen .: Construye una imagen desde un Dockerfile.
docker run nombre_imagen: Ejecuta un contenedor desde una imagen.
docker ps: Lista contenedores en ejecución.
docker stop ID_CONTENEDOR: Detiene un contenedor.
docker rm ID_CONTENEDOR: Elimina un contenedor.
docker images: Lista las imágenes disponibles.

Estructura:
Ejemplo de una estructura básica de Dockerfile:
-Usar una imagen base de Python
FROM python:3.9-slim
-Establecer el directorio de trabajo
WORKDIR /app
-Copiar los archivos de la aplicación al contenedor
COPY . /app
-Instalar dependencias
RUN pip install –no-cache-dir -r requirements.txt
-Exponer el puerto 5000
EXPOSE 5000
-Comando por defecto al iniciar el contenedor
CMD [“python3”, “app.py”]

La primera palabra clave es FROM, es el primer comando que debe estar en el Dockerfile.
Ejemplo: FROM python:3.9-slim
Es la instrucción que indica que se va a usar una imagen base existente como punto de partida.
Todas las instrucciones posteriores en el Dockerfile se aplicarán sobre esta imagen base.
python:3.9-slim:
Es el nombre de la imagen base que se va a utilizar.
En este caso, es una imagen oficial de Python proporcionada por Docker Hub.
La etiqueta 3.9-slim especifica la versión de Python (3.9) y el tipo de imagen (slim).

COPY: Ejemplo: COPY . /app
Es la instrucción que copia archivos o directorios desde el host al sistema de archivos del contenedor.
. (punto) Representa el directorio actual en tu máquina local (el contexto de construcción).
Copia todos los archivos y subdirectorios del directorio actual.
/app: Es la ruta de destino dentro del contenedor donde se copiarán los archivos.
Si la ruta no existe, Docker la creará automáticamente.

EXPOSE 5000: en un Dockerfile es utilizada para documentar que el contenedor escuchará en un puerto específico (en este caso, el puerto 5000). Sin embargo, es importante entender que esta instrucción no abre automáticamente el puerto en el host ni permite el acceso externo al contenedor.

CDM: Es la instrucción que especifica el comando predeterminado que se ejecutará al iniciar el contenedor.
Solo puede haber una instrucción CMD en un Dockerfile. Si hay varias, solo la última tendrá efecto.
“python3”, “app.py”
Es una lista que define el comando y sus argumentos.
En este caso, ejecuta python3 app.py, lo que inicia un script de Python llamado app.py.

RUN: Es una instrucción que ejecuta comandos durante la construcción de la imagen.
Los cambios resultantes de estos comandos se guardan en una nueva capa de la imagen.
pip install:
Es el comando de Python para instalar paquetes desde el Python Package Index (PyPI) o desde un archivo de requisitos.
–no-cache-dir:
Es una opción de pip que evita almacenar en caché los paquetes descargados.
Esto reduce el tamaño de la imagen final, ya que no se guardan archivos temporales innecesarios.
-r requirements.txt:
Especifica que pip debe instalar los paquetes listados en el archivo requirements.txt.
El archivo requirements.txt es un archivo de texto que contiene una lista de paquetes de Python y sus versiones.

Otro ejemplo de Dockerfile

FROM openjdk:8u151-jdk-alpine3.7

EXPOSE 8070

ENV APP_HOME /usr/src/app

COPY target/shopping-cart-0.0.1-SNAPSHOT.jar $APP_HOME/app.jar

WORKDIR $APP_HOME

ENTRYPOINT exec java -jar app.jar

Docker en Jenkis.
Instalar los plugins de docker: docker, docker pipeline, docker-build-step, CloudBees Docker Build and Publish.

Lo primero, crear la imagen de Docker, luego enviarla a Docker Hub y después recuperarla para crear la implementación de la aplicación dentro de un contenedor. Docker Hub es un repositorio de imagenes público.

En Jenkins -> ir a Tools -> docker -> docker installations -> nombre: docker -> instalar automaticamente -> download from docker.com -> docker verison: latest -> apply.

Ir al pipeline ->Configurar -> crear la imagen de docker
En Jenkins no se puede escribir directamente comandos de docker. Asi que basicamente se requiere encerrarlo dentro de un script{} y dentro de las llaves escribir el comando docker.
Una ayuda puede ser el pipeline Syntax-> withDockerRegistry: sets up docker registry endpoint y las credencias de registry y dentro se podran escribir los comandos docker con sh “”
Nota: se debe agregar al usuario jenkins al grupo docker para darle permisos
sudo usermod -aG docker jenkins
sudo systemctl restart jenkins

El stage quedaria asi:

stage('Build Docker Image') {
   steps {
    script{
     withDockerRegistry(credentialsId: '4fc9fae3-35e5-42fd-bcaa-6318a680aa19', toolName: 'docker') {
     sh "docker build -t shopping-cart -f docker/Dockerfile ."
     sh "docker tag shopping-cart richardaguirrecloud/shopping-cart:latest"
   }
  }
 }
}

el usuario de docker hub se guarda como credencial en jenkis y se usa el id. El password de docker hub debe crearse en docker hub como token.
docker tag -> el el nombre que recibirá la imagen de docker en docker hub.

Para ver la imagen creada ir a docker hub o con el comando docker images enla consola.

Aparte se puede hacer el push de la imagen o dentro del Build Docker Image.

stage('Build Docker Image') {
   steps {
    script{
withDockerRegistry(credentialsId: '4fc9fae3-35e5-42fd-bcaa-6318a680aa19', toolName: 'docker') {
    sh "docker push richardaguirrecloud/shopping-cart:latest"
   }
  }
 }
}

Implementar la aplicación usando un contenedor de Docker
con la opcion -d, el trabajo de jenkins seguira ejecutandose y el trabajo de docker siguirá en segundo plano.

stage('Deploy to Docker Containner') {
   steps {
    script{
withDockerRegistry(credentialsId: '4fc9fae3-35e5-42fd-bcaa-6318a680aa19', toolName: 'docker') {
    sh "docker run -d --name shopping -p 8070:8070 richardaguirrecloud/shopping-cart:latest"
   }
  }
 }
}

Agregar un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos están marcados *