Etiquetas

Docker (iniciando en lo basico)




Docker es una plataforma de código abierto que permite a los desarrolladores automatizar el despliegue de aplicaciones dentro de contenedores. Los contenedores son unidades ligeras, portables y autónomas que incluyen el código de una aplicación y todas sus dependencias necesarias, como librerías, configuraciones, y runtime. Docker facilita la creación de entornos consistentes para desarrollar, probar y desplegar aplicaciones, asegurando que funcionen de la misma manera en diferentes sistemas, independientemente de las configuraciones del sistema operativo o hardware.

Principales características de Docker:

Contenedores ligeros: Los contenedores comparten el kernel del sistema operativo anfitrión, lo que los hace más ligeros y rápidos en cuanto a arranque y uso de recursos.
Portabilidad: Se pueden ejecutarse en cualquier entorno que soporte Docker: desde un entorno local, servidores en la nube, hasta clústeres complejos de orquestación como Kubernetes.
Aislamiento de aplicaciones: Cada contenedor se ejecuta de manera aislada, lo que permite tener varias aplicaciones en el mismo servidor sin que interfieran entre sí.
Reutilización de imágenes: Docker usa un sistema de capas para crear contenedores a partir de imágenes. Estas imágenes son plantillas que pueden reutilizarse y compartirse, lo que facilita el despliegue rápido de nuevas instancias de la aplicación.

¿Cómo funciona Docker?

Docker se basa en los conceptos clave:
  • Dockerfile: Es el archivo que define cómo se construye la imagen.
  • Imagen: Es el resultado del proceso de construcción a partir del Dockerfile.
  • Contenedor: Es la instancia en ejecución de una imagen.

Componentes principales de Docker:

  • Docker Engine: El motor que ejecuta los contenedores.
  • Docker Hub: Un repositorio donde los usuarios pueden almacenar y compartir imágenes de Docker. Es el equivalente a un "almacén de imágenes" similar a un repositorio de código.
  • Docker Compose: Herramienta para definir y ejecutar aplicaciones multi-contenedor usando un archivo YAML.
  • Docker Standalone es Docker ejecutándose en un solo host.
  • Docker Swarm permite orquestar clústeres de Docker de forma sencilla, gestionando múltiples nodos.
  • Kubernetes es una plataforma de orquestación más avanzada que permite gestionar de forma más eficiente clústeres de contenedores en grandes despliegues.

Aplicaciones de Docker:

  • Desarrollo y pruebas: Facilita la creación de entornos consistentes en diferentes fases del ciclo de vida de la aplicación.
  • Producción: Gracias a su escalabilidad y portabilidad, Docker es usado para desplegar aplicaciones en servidores o servicios de nube.
  • CI/CD (Integración continua y entrega continua): Docker es ideal para implementar pipelines de desarrollo, donde cada parte del proceso (construcción, pruebas, despliegue) puede ser automatizada en un entorno Docker.


Instalacion de Docker

La instalación de Docker varía ligeramente según el sistema operativo. Aquí te doy una guía paso a paso para instalar Docker en Ubuntu, que es uno de los sistemas más comunes para trabajar con Docker:

Paso 1: Actualizar los paquetes del sistema


Primero, actualiza los paquetes de Ubuntu para asegurarte de que el sistema está al día.

sudo apt-get update
sudo apt-get upgrade

Paso 2: Instalar dependencias


Debes instalar algunas dependencias necesarias para permitir que Docker trabaje correctamente.

sudo apt-get install \   
ca-certificates \
gnupg \
lsb-release
curl \

Paso 3: Añadir la clave GPG oficial de Docker


Agrega la clave GPG oficial de Docker para verificar la autenticidad del paquete.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Paso 4: Añadir el repositorio de Docker


Añade el repositorio oficial de Docker a tu lista de fuentes de Ubuntu.

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Paso 5: Instalar Docker


Actualiza los paquetes de nuevo para cargar el repositorio de Docker y luego instala Docker.

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Paso 6: Verificar la instalación de Docker


Para asegurarte de que Docker se instaló correctamente, verifica su versión.

docker --version

Paso 7: Ejecutar Docker sin usar sudo (opcional)


Por defecto, Docker requiere permisos de superusuario para ejecutar comandos. Si deseas ejecutar Docker sin tener que usar sudo cada vez, agrega tu usuario al grupo de Docker:

sudo usermod -aG docker $USER

Luego, reinicia la sesión para que los cambios tengan efecto.

Paso 8: Probar la instalación de Docker


Para confirmar que Docker está funcionando correctamente, ejecuta el siguiente comando para descargar y ejecutar un contenedor de prueba:

docker run hello-world

Si ves un mensaje de bienvenida de Docker, significa que Docker está correctamente instalado y funcionando.

Docker Compose (opcional)

Si necesitas Docker Compose para gestionar aplicaciones de múltiples contenedores, puedes instalarlo con el siguiente comando:

sudo apt-get install docker-compose

Desinstalar Docker (si es necesario)

Si en algún momento deseas eliminar Docker de tu sistema:

sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Comandos básicos de Docker 

Gestión de imágenes

  • docker images: Lista todas las imágenes disponibles en el sistema local.
  • docker pull <imagen>: Descarga una imagen de Docker desde un repositorio (por defecto Docker Hub).
  • docker build -t <nombre_imagen> .: Construye una imagen de Docker a partir de un Dockerfile en el directorio actual.
  • docker rmi <imagen>: Elimina una imagen de Docker del sistema local.

Gestión de contenedores

  • docker ps: Lista todos los contenedores en ejecución.
  • docker ps -a: Lista todos los contenedores, incluidos los detenidos.
  • docker push: Sube una imagen a un registro.
  • docker run <imagen>: Crea y ejecuta un nuevo contenedor a partir de una imagen.
  • docker run -d <imagen>: Ejecuta un contenedor en segundo plano (modo "detached").
  • docker run -p <puerto_host>:<puerto_contenedor> <imagen>: Ejecuta un contenedor y asigna un puerto del host al puerto del contenedor.
  • docker exec -it <contenedor> <comando>: Ejecuta un comando en un contenedor en ejecución, útil para entrar en un shell interactivo (por ejemplo, bash).
  • docker stop <contenedor>: Detiene un contenedor en ejecución.
  • docker start <contenedor>: Inicia un contenedor detenido.
  • docker restart <contenedor>: Reinicia un contenedor en ejecución.
  • docker rm <contenedor>: Elimina un contenedor.

Gestión de volúmenes

  • docker volume ls: Lista todos los volúmenes.
  • docker volume create <nombre_volumen>: Crea un nuevo volumen.
  • docker volume rm <nombre_volumen>: Elimina un volumen.
  • Información y ayuda
  • docker info: Muestra información detallada sobre el sistema Docker.
  • docker version: Muestra la versión de Docker que estás utilizando.
  • docker help: Muestra información de ayuda sobre los comandos de Docker.

Para crear un archivo usando el editor Vim


Abre la terminal: Puedes hacerlo con Ctrl + Alt + T.

Crea o abre un archivo con Vim:

Si quieres crear un nuevo archivo, puedes usar el comando vim nombre-del-archivo.ext, reemplazando "nombre-del-archivo.ext" con el nombre y extensión que desees.
Por ejemplo, para crear un archivo llamado archivo.txt, escribe:

vim archivo.txt

Entra en modo de inserción:

Cuando se abre Vim, estarás en modo "Normal". Para empezar a editar el archivo, debes entrar en modo de inserción. Presiona la tecla i para entrar en este modo.
Ahora puedes escribir texto en el archivo.

Guardar y salir:

Cuando termines de editar, presiona Esc para salir del modo de inserción y volver al modo "Normal".
Para guardar el archivo y salir de Vim, escribe :wq y presiona Enter.

:wq significa "write and quit" (escribir y salir).

Si solo quieres guardar sin salir, usa :w y si quieres salir sin guardar, usa :q!.

Comandos útiles en Vim:


  • i - Entrar en modo de inserción para editar el archivo.
  • Esc - Salir del modo de inserción y volver al modo normal.
  • :w - Guardar el archivo.
  • :q - Salir de Vim.
  • :wq - Guardar y salir.
  • :q! - Salir sin guardar.


Comandos de DOCKERFILE

Un Dockerfile es un archivo de texto que contiene una serie de instrucciones para construir una imagen de Docker. Estas instrucciones le indican a Docker cómo crear la imagen, qué software incluir, qué comandos ejecutar y cómo configurar el entorno para ejecutar una aplicación dentro de un contenedor.

  • FROM :Define la imagen base a partir de la cual se construye la nueva imagen. Es obligatorio que el Dockerfile comience con esta instrucción.
  • WORKDIR :Establece el directorio de trabajo dentro del contenedor. Todas las instrucciones posteriores se ejecutarán en este directorio.
  • COPY :Copia archivos desde tu sistema local al sistema de archivos del contenedor.
  • RUN:Ejecuta comandos en la construcción de la imagen, como instalar paquetes, configurar archivos, etc.
  • CMD :Especifica el comando que se ejecutará cuando se inicie el contenedor. Sólo puede haber un CMD en un Dockerfile, y si se define más de uno, se ejecuta el último.
  • EXPOSE :Indica el puerto que expone el contenedor para la comunicación con otros contenedores o el mundo exterior.
  • ENV :Establece variables de entorno que estarán disponibles dentro del contenedor.
  • ENTRYPOINT :Define el comando que siempre debe ejecutarse cuando se inicia el contenedor. Se suele combinar con CMD.
  • ARG (Variables de Construcción) :ARG se usa para definir variables que solo estarán disponibles durante el proceso de construcción de la imagen. Es útil para pasar información o parámetros específicos que pueden variar entre diferentes entornos.
  • ONBUILD :El comando ONBUILD se usa para agregar instrucciones desencadenantes que no se ejecutarán al construir la imagen, sino cuando otra imagen se construya a partir de ella (es decir, en una imagen hija).
  • HEALTHCHECK : Este comando define un chequeo de salud para un contenedor. Docker ejecutará este comando periódicamente para verificar si el contenedor está en buen estado.
  • SHELL :Con SHELL, puedes cambiar el intérprete de comandos predeterminado utilizado para ejecutar las instrucciones RUN. Esto es útil cuando trabajas en sistemas que no usan Bash como shell predeterminada.
  • ADD vs. COPY :Aunque ambos comandos parecen similares, ADD ofrece funcionalidad adicional, como la capacidad de extraer archivos comprimidos directamente en el sistema de archivos del contenedor.Ventajas: ADD es más flexible, pero se recomienda COPY cuando solo necesitas copiar archivos, ya que es más predecible.
  • USER :Especifica el usuario que ejecutará los comandos dentro del contenedor. Es útil para evitar ejecutar procesos como el usuario root y mejorar la seguridad.
  • VOLUME :Declara un volumen que persiste los datos generados por el contenedor, manteniéndolos fuera del sistema de archivos de la imagen.
  • LABEL :Las etiquetas permiten agregar metadatos a las imágenes de Docker. Son útiles para la gestión, la organización, y el análisis de imágenes.
  • STOPSIGNAL :Define la señal que Docker debe usar para detener un contenedor.




Creando un DOCKERFILE para react.

El archivo que se va a crear debe estar en la misma carpeta donde esta tu proyecto que quieres subir al contenedor.


contenido de nuestro DOCKERFILE

FROM node:lts
WORKDIR /app
COPY . .
EXPOSE 3000
CMD ["npm","start"]

Explicación línea por línea:

1. FROM node:lts

Esta línea define la imagen base que se va a utilizar. En este caso, se está utilizando la imagen oficial de Node.js con la versión LTS (Long-Term Support), que es la versión más estable y recomendada de Node.js. Esta imagen incluye todo lo necesario para ejecutar aplicaciones Node.js.

  • Imagen base: Es el punto de partida de tu contenedor. En este caso, se usa la imagen de Node.js que ya incluye el entorno necesario para correr aplicaciones basadas en Node.js.
  • LTS: Significa "soporte a largo plazo" y es una versión estable de Node.js con actualizaciones de seguridad garantizadas.

2. WORKDIR /app

Esta línea establece el directorio de trabajo dentro del contenedor. Todo lo que suceda después de esta línea ocurrirá dentro del directorio /app.

  • WORKDIR: Establece el directorio dentro del contenedor donde se ejecutarán los comandos y se colocarán los archivos.
  • /app: Es el directorio que se crea en el contenedor y en donde se ubicarán los archivos de tu aplicación.

3. COPY . .

Esta instrucción copia los archivos de tu sistema local al contenedor.

  • COPY . .: El primer punto (.) representa el directorio actual en tu máquina local, y el segundo punto (.) representa el directorio de trabajo dentro del contenedor (en este caso, /app). Es decir, esta línea copia todo el contenido del directorio de tu proyecto en la máquina local al directorio /app en el contenedor.

4. EXPOSE 3000

Esta línea indica que el contenedor va a exponer el puerto 3000. Es común en aplicaciones Node.js que el servidor web se ejecute en el puerto 3000 por defecto.

  • EXPOSE: Especifica el puerto en el que el contenedor estará escuchando las conexiones. Aunque EXPOSE no abre el puerto por sí mismo (esto se debe hacer al iniciar el contenedor con docker run -p), sirve como documentación y permite a Docker saber cuál es el puerto principal que usará la aplicación.

5. CMD ["npm", "start"]

Finalmente, esta línea ejecuta el comando npm start cuando el contenedor se inicia. Este comando, por lo general, está configurado en el archivo package.json de una aplicación Node.js y se usa para arrancar la aplicación.

  • CMD: Define el comando por defecto que se ejecutará cuando el contenedor se inicie. En este caso, se está diciendo que el contenedor debe ejecutar npm start, lo que inicia el servidor de la aplicación Node.js.

Construir una imagen


El comando sudo docker build -t react-app . se utiliza para construir una imagen Docker a partir de un Dockerfile en el directorio actual. A continuación te explico cada parte del comando:

sudo docker build -t react-app . Desglose del comando
sudo: Este comando se utiliza en sistemas basados en Unix (como Linux y macOS) para ejecutar el siguiente comando con privilegios de superusuario. Esto es necesario si Docker requiere permisos elevados para construir la imagen.
En algunos sistemas, Docker puede requerir permisos de administrador para ejecutar ciertos comandos, por lo que sudo asegura que el comando se ejecute con los privilegios necesarios.
docker build: Este es el comando principal que le indica a Docker que construya una imagen a partir de un Dockerfile. El proceso de "build" toma los pasos definidos en el Dockerfile (como la elección de la imagen base, instalación de dependencias, copiado de archivos, etc.) y genera una imagen Docker que puede ser utilizada para crear contenedores.
-t react-app: La opción -t (que es la abreviatura de --tag) permite asignar un nombre y una etiqueta (tag) a la imagen que se está construyendo.
En este caso, react-app es el nombre de la imagen. Puedes pensar en esto como el nombre con el cual podrás referirte a esta imagen más tarde.
Si omites la opción -t, Docker generará un identificador único para la imagen, pero no tendrá un nombre fácil de usar.
. (punto): El punto al final del comando especifica el "contexto de construcción", que en este caso es el directorio actual.
Docker buscará el Dockerfile y todos los archivos necesarios en el directorio actual para construir la imagen.
Puedes reemplazar . por otra ruta si quieres construir la imagen a partir de un Dockerfile ubicado en otro directorio.

Es decir .

El comando completo sudo docker build -t react-app . hace lo siguiente: Construye una imagen Docker utilizando las instrucciones del Dockerfile en el directorio actual (.). Asigna a la imagen resultante el nombre react-app.
Ejecuta este proceso con privilegios elevados gracias a sudo (necesario si tu usuario actual no tiene permisos suficientes para construir imágenes).
Después de ejecutar este comando, la imagen react-app estará disponible en tu máquina local y podrás utilizarla para crear contenedores Docker.


Correomos nuestra imagen.

El comando sudo docker run -p 3000:3000 react-app se utiliza para crear y ejecutar un contenedor a partir de una imagen Docker previamente construida.

sudo docker run -p 3000:3000 react - app
Desglose del comando:
sudo: Este comando se utiliza en sistemas basados en Unix (como Linux y macOS) para ejecutar el siguiente comando con privilegios de superusuario. Esto es necesario si Docker requiere permisos elevados para ejecutar contenedores.
docker run: Este es el comando principal que le indica a Docker que inicie (o "corra") un nuevo contenedor a partir de una imagen Docker específica.
Al ejecutar este comando, Docker crea un contenedor basado en la imagen que especifiques y lo inicia, ejecutando el comando definido en el Dockerfile de esa imagen.
-p 3000:3000: La opción -p se utiliza para mapear puertos entre el contenedor y el host.
En este caso, el primer 3000 se refiere al puerto en el host (tu máquina local), y el segundo 3000 se refiere al puerto en el contenedor.
Esto significa que el tráfico que llegue al puerto 3000 de tu máquina local será redirigido al puerto 3000 del contenedor. Por lo tanto, si la aplicación dentro del contenedor está sirviendo una página web en el puerto 3000, podrás acceder a ella en http://localhost:3000.
react-app: Este es el nombre de la imagen Docker que se utilizará para crear el contenedor. En este caso, react-app es la imagen que se creó previamente con el comando docker build.
Docker buscará una imagen llamada react-app en tu máquina local. Si la encuentra, usará esa imagen para crear el contenedor.
Es decir.
El comando completo sudo docker run -p 3000:3000 react-app hace lo siguiente: Inicia un nuevo contenedor basado en la imagen react-app.
  • Mapea el puerto 3000 del contenedor al puerto 3000 de tu máquina local, lo que te permite acceder a la aplicación dentro del contenedor a través de http://localhost:3000.
  • Ejecuta este proceso con privilegios elevados gracias a sudo (si es necesario).

Para detener el contenedor.

Para detener un contenedor en Linux, puedes usar el comando docker stop seguido del nombre o ID del contenedor. Aquí te dejo un ejemplo básico:


docker stop <nombre_o_id_del_contenedor>

Si no estás seguro del nombre o ID del contenedor, puedes listar todos los contenedores en ejecución con:


docker ps

Esto te mostrará una lista de contenedores en ejecución junto con sus nombres e IDs. Luego, puedes utilizar uno de esos identificadores con docker stop.

Por ejemplo, si tienes un contenedor en ejecución llamado mi_contenedor, lo detienes así:


docker stop mi_contenedor

Si deseas detener todos los contenedores en ejecución de una vez, puedes utilizar:


docker stop $(docker ps -q)

Este comando primero obtiene los IDs de todos los contenedores en ejecución (docker ps -q) y luego los pasa al comando docker stop.


Pasos para eliminar un contenedor:

  1. Listar contenedores:

    • Primero, identifica el contenedor que deseas eliminar. Puedes listar todos los contenedores en ejecución usando:

      docker ps
    • Para listar todos los contenedores (incluidos los que están detenidos), usa:

      docker ps -a
    • Esto te dará una lista con los IDs de contenedor y los nombres.
  2. Eliminar un contenedor:

    • Una vez que hayas identificado el ID o el nombre del contenedor que deseas eliminar, usa el siguiente comando:
      docker rm <container_id_or_name>
    • Por ejemplo, si el ID del contenedor es abc123, el comando sería:
      docker rm abc123
  3. Eliminar un contenedor en ejecución:

    • Si el contenedor está en ejecución, no podrás eliminarlo directamente. Primero, debes detenerlo con:
      docker stop <container_id_or_name>
    • Luego, puedes eliminarlo con el comando docker rm como se explicó anteriormente.
    • Alternativamente, puedes forzar la eliminación de un contenedor en ejecución usando el siguiente comando (esto detendrá y eliminará el contenedor):
      docker rm -f <container_id_or_name>

Comandos adicionales:

  • Eliminar varios contenedores:
    • Puedes eliminar múltiples contenedores a la vez especificando varios IDs o nombres:
      docker rm <container_id_or_name_1> <container_id_or_name_2>
  • Eliminar todos los contenedores detenidos:
    • Si deseas eliminar todos los contenedores que están detenidos, puedes hacerlo con:

      docker container prune
    • Esto eliminará todos los contenedores que no estén en ejecución.

Estos comandos te permiten gestionar y eliminar contenedores en Docker dentro de un entorno Linux.

Etapas (stages)

Un Dockerfile puede dividirse en múltiples etapas (stages), dependiendo de las necesidades de la aplicación. El uso de etapas múltiples es un enfoque avanzado que permite crear imágenes más eficientes, ya que se construyen varias capas y solo se incluyen en la imagen final aquellas necesarias para el entorno de producción.

Aquí te doy un ejemplo de cómo se podría dividir un Dockerfile en etapas, según el propósito:

1. Etapa de construcción:

En esta etapa se preparan todas las dependencias necesarias para la aplicación, como la instalación de bibliotecas o compilación de código.


FROM node:lts as build WORKDIR /app COPY . . RUN npm install
  • Propósito: Preparar y construir el código o las dependencias sin incluirlas en la imagen final.
  • Aplicaciones: Frontend (React, Angular) o Backend (Node.js, PHP, etc.).

2. Etapa de producción:

Esta es la fase final donde se configura el entorno de producción en el cual se ejecutará la aplicación.


FROM nginx:stable-alpine COPY --from=build /app/build /usr/share/nginx/html
  • Propósito: Usar solo los archivos que la aplicación necesita para ejecutarse en un entorno más liviano y optimizado.
  • Aplicaciones: Configuración de servidores web, como Nginx o Apache.

3. Etapa de testing o validación:

Si necesitas realizar pruebas o validaciones del código antes de pasarlo a producción, puedes agregar una etapa para ejecutar tests.


FROM build as test RUN npm run test
  • Propósito: Validar el código (pruebas unitarias, integraciones).
  • Aplicaciones: Pipeline CI/CD donde es importante ejecutar tests antes del despliegue.

4. Etapa de optimización:

En esta etapa puedes realizar operaciones de optimización, como reducir el tamaño de la imagen, eliminar archivos temporales o ajustar configuraciones para que la aplicación consuma menos recursos.


FROM php:8.1-cli as optimizer WORKDIR /app RUN composer install --optimize-autoloader
  • Propósito: Optimizar el código para mejorar el rendimiento en producción.
  • Aplicaciones: Reducción del tamaño de la imagen Docker final y mejoras de rendimiento.

5. Etapa de despliegue:

Puedes incluir una etapa que defina configuraciones específicas para despliegue, como la conexión a servicios externos o configuraciones de red.


FROM production as deploy CMD ["npm", "start"]
  • Propósito: Definir los comandos finales y configuraciones que se ejecutarán cuando el contenedor esté en producción.
  • Aplicaciones: Iniciar servidores, aplicaciones web, microservicios, etc.

Resumen:

Un Dockerfile puede dividirse en varias etapas según lo que quieras lograr en cada una. A continuación se resumen las etapas comunes:

  1. Etapa de construcción (instalación de dependencias y compilación del código).
  2. Etapa de producción (configuración del entorno de producción y la aplicación).
  3. Etapa de testing o validación (ejecución de pruebas y validación).
  4. Etapa de optimización (mejoras de rendimiento y reducción de tamaño).
  5. Etapa de despliegue (configuración final para producción).

Estas etapas se utilizan principalmente para optimizar el tamaño de la imagen, acelerar los despliegues y mejorar la seguridad al incluir solo lo esencial en la imagen final.

ejemplo :

FROM composer:2.3.7 as build

WORKDIR /app
COPY . .

RUN composer install --ignore-platform-reqs && composer dump-autoload

FROM php:8.1-rc-apache-buster


RUN rm /etc/apt/preferences.d/no-debian-php && \
    apt-get update && apt-get install -y \
    vim \
    libldb-dev \
    libldap2-dev \
    libpq-dev \
    postgresql \
    libxml2-dev \
    php-soap \
    zlib1g-dev \
    libzip-dev \
    pdftk-java \
    gnupg2 \
    unixodbc \
    unixodbc-dev \
    telnet \
&& ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so \
&& ln -s /usr/lib/x86_64-linux-gnu/liblber.so /usr/lib/liblber.so


#Add Microsoft repo for Microsoft ODBC Driver 17 for Linux
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

RUN apt-get update && ACCEPT_EULA=Y apt-get install -y \
    apt-transport-https \
    msodbcsql17

RUN apt-get update && apt-get install -y libmagickwand-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*


RUN apt-get update -yqq \
    && apt-get install -y --no-install-recommends openssl \
    && sed -i 's,^\(MinProtocol[ ]*=\).*,\1'TLSv1.0',g' /etc/ssl/openssl.cnf \
    && sed -i 's,^\(CipherString[ ]*=\).*,\1'DEFAULT@SECLEVEL=1',g' /etc/ssl/openssl.cnf

RUN apt-get clean && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install pdo pgsql pdo_pgsql ldap soap zip

RUN pecl install pdo_sqlsrv sqlsrv imagick \
    && docker-php-ext-enable pdo_sqlsrv sqlsrv imagick


WORKDIR /app
CMD php artisan serve --host=0.0.0.0
EXPOSE 8018

Este Dockerfile está diseñado para construir y ejecutar una aplicación PHP con varios servicios adicionales. A continuación, explico cada parte del código línea por línea:

Primera parte: Etapa de construcción

1. FROM composer:2.3.7 as build

  • Imagen base: Aquí se usa la imagen oficial de Composer 2.3.7 como la base para la fase de construcción (build). Composer es una herramienta de gestión de dependencias para PHP.
  • as build: Establece una etapa de compilación (build stage). Esto es útil para la multi-etapa de Docker, permitiendo separar la construcción de la aplicación del entorno de producción final.

2. WORKDIR /app

  • Establece el directorio de trabajo dentro del contenedor como /app. Aquí es donde se ejecutarán los comandos posteriores.

3. COPY . .

  • Copia el contenido del directorio local (el directorio de tu proyecto) dentro del directorio /app en el contenedor.

4. RUN composer install --ignore-platform-reqs && composer dump-autoload

  • composer install: Instala las dependencias PHP especificadas en el archivo composer.json de tu proyecto.
  • --ignore-platform-reqs: Ignora los requisitos específicos de la plataforma durante la instalación, útil si la imagen Docker no coincide exactamente con los requisitos del sistema local.
  • composer dump-autoload: Optimiza el archivo de carga automática de Composer para mejorar el rendimiento de la aplicación.

Segunda parte: Entorno de producción

5. FROM php:8.1-rc-apache-buster

  • Imagen base de PHP 8.1 con el servidor Apache en la distribución Debian Buster. Esto crea un entorno de ejecución para aplicaciones PHP.

6. RUN rm /etc/apt/preferences.d/no-debian-php && \ ...

  • Elimina cualquier preferencia de apt relacionada con PHP que pueda estar en conflicto y luego instala varias dependencias del sistema necesarias para la aplicación, como:
    • vim (editor de texto)
    • libldap2-dev, libpq-dev, postgresql (librerías para LDAP y PostgreSQL)
    • php-soap (extensión SOAP de PHP)
    • Otras utilidades: zlib1g-dev, libzip-dev, pdftk-java, unixodbc (herramientas para manejo de datos, archivos ZIP, PDF y conexiones ODBC).

7. ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so

  • Crea enlaces simbólicos para las librerías LDAP, asegurando que estén disponibles en el contenedor.

Instalación de dependencias de Microsoft y otros componentes

8. RUN curl https://packages.microsoft.com/...

  • Agrega el repositorio de Microsoft para instalar el ODBC Driver 17 para SQL Server, necesario para conectar la aplicación a bases de datos SQL Server.

9. RUN apt-get install -y msodbcsql17

  • Instala el driver ODBC de Microsoft para SQL Server.

10. RUN apt-get install -y libmagickwand-dev --no-install-recommends

  • Instala las librerías necesarias para ImageMagick, que proporciona herramientas para manipular imágenes.

Configuración de SSL y OpenSSL

11. RUN apt-get install -y --no-install-recommends openssl ...

  • Instala OpenSSL y modifica su configuración para permitir versiones antiguas de protocolos SSL/TLS, necesarios en algunos entornos.

12. RUN docker-php-ext-install pdo pgsql pdo_pgsql ldap soap zip

  • Instala varias extensiones PHP importantes:
    • pdo, pgsql, pdo_pgsql: Extensiones para conectar PHP a bases de datos PostgreSQL usando PDO.
    • ldap: Extensión para manejar autenticación con LDAP.
    • soap: Para usar el protocolo SOAP en PHP.
    • zip: Para manipular archivos ZIP.

13. RUN pecl install pdo_sqlsrv sqlsrv imagick ...

  • Usa PECL (el repositorio de extensiones de PHP) para instalar:
    • pdo_sqlsrv, sqlsrv: Extensiones para conectarse a bases de datos SQL Server desde PHP.
    • imagick: Extensión de PHP para trabajar con imágenes mediante ImageMagick.

Definir el entorno de trabajo final y comandos de ejecución

14. WORKDIR /app

  • Establece nuevamente el directorio de trabajo a /app, donde se encuentra la aplicación PHP.

15. CMD php artisan serve --host=0.0.0.0

  • php artisan serve: Ejecuta el servidor embebido de Laravel (asumiendo que es una aplicación Laravel). El flag --host=0.0.0.0 permite que el servidor esté accesible desde fuera del contenedor.

16. EXPOSE 8018

  • Expone el puerto 8018, que es donde el servidor web estará escuchando.

Resumen:

Este Dockerfile tiene una estructura de multi-etapas:

  1. Etapa de construcción: Usa Composer para instalar las dependencias de PHP.
  2. Etapa de producción: Configura un servidor PHP con Apache en una imagen basada en Debian, instala extensiones y dependencias adicionales (PostgreSQL, LDAP, ODBC, etc.), y ajusta el entorno para ejecutar una aplicación Laravel o similar.

Este enfoque de múltiples etapas reduce el tamaño final de la imagen y separa las fases de construcción y producción, lo cual es beneficioso para entornos de despliegue y optimización del tamaño de la imagen.

url

  • https://www.linkedin.com/posts/francojof_developer-code-coder-activity-7224414942819434496-bb5t?utm_source=share&utm_medium=member_android