0% encontró este documento útil (0 votos)
11 vistas41 páginas

Docker

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas41 páginas

Docker

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

17.

Docker
1. Introducción a Docker
1.1 ¿Qué es Docker?
Docker es una plataforma de contenedorización de código abierto que permite a
los desarrolladores y administradores de sistemas automatizar el despliegue de
aplicaciones dentro de contenedores ligeros y portátiles. Estos contenedores son
entornos independientes y autocontenidos, que pueden ejecutar aplicaciones y
sus dependencias de manera coherente en diversos entornos.

1.1.1 Características Clave de Docker:


1. Portabilidad: Al encapsular una aplicación y sus dependencias en un
contenedor Docker, esta puede ejecutarse consistentemente en cualquier
sistema que tenga Docker instalado, independientemente del entorno
subyacente.

2. Eficiencia: Docker utiliza los recursos del sistema operativo anfitrión de


manera más eficiente que las máquinas virtuales tradicionales, permitiendo un
mayor rendimiento y menor uso de recursos.

3. Aislamiento: Los contenedores Docker ejecutan procesos en espacios


aislados, lo que mejora la seguridad y permite que múltiples contenedores
coexistan en el mismo host sin interferencias.

4. Escalabilidad y Orquestación: Docker se integra bien con herramientas de


orquestación como Kubernetes, lo que facilita el escalado y la gestión de
aplicaciones contenerizadas en clusters y entornos de nube.

1.1.2 Contenedores
Los contenedores son unidades estándar de software que empaquetan el código
de una aplicación y todas sus dependencias, asegurando que la aplicación se
ejecute de forma rápida y confiable en diferentes entornos informáticos.

1.1.3 Comparación con Máquinas Virtuales

17. Docker 1
Arquitectura: Las máquinas virtuales (VM) incluyen no solo la aplicación y sus
dependencias, sino también un sistema operativo completo. Los
contenedores, por otro lado, comparten el kernel del sistema operativo del
host y aíslan la aplicación y sus dependencias en un entorno de usuario
separado.

Qué es el Kernel del Sistema Operativo


El kernel es la parte central o núcleo del sistema operativo. Actúa como un
intermediario entre el software de aplicación y el hardware del ordenador. Las
responsabilidades clave del kernel incluyen:

1. Gestión de Recursos: Controla y gestiona cómo se utiliza el hardware por


diferentes programas, incluyendo la CPU, la memoria, el almacenamiento y
los dispositivos de entrada/salida.

2. Planificación de Procesos y Gestión de Tareas: Se encarga de la


creación, planificación y terminación de procesos (programas en
ejecución) y gestiona los recursos que estos necesitan.

3. Manejo de Interrupciones: Responde a las solicitudes de hardware y


software, como las entradas del usuario o las señales de los dispositivos
periféricos.

4. Control de Acceso y Seguridad: Regula el acceso a los recursos del


sistema y los datos, manteniendo la seguridad y la estabilidad del sistema.

5. Comunicación entre Procesos: Permite la comunicación y sincronización


entre diferentes procesos.

Rendimiento: Los contenedores son más ligeros y requieren menos recursos


que las VM porque no necesitan cargar un sistema operativo completo. Esto
resulta en un inicio más rápido de los contenedores y un menor uso de
memoria y CPU.

Eficiencia del Espacio: Dado que los contenedores comparten el kernel del
sistema operativo y los elementos básicos, ocupan mucho menos espacio que
las VM, lo que permite ejecutar más contenedores en el mismo hardware que
las VM.

Aislamiento vs. Seguridad: Mientras que los contenedores ofrecen cierto


grado de aislamiento, las VM pueden proporcionar un aislamiento más fuerte

17. Docker 2
debido a la separación a nivel de sistema operativo. Esto hace que las VM
sean a menudo más seguras, aunque también más pesadas.

En resumen, Docker representa una solución moderna y eficiente para el


despliegue de aplicaciones, ofreciendo ventajas significativas en términos de
portabilidad, eficiencia, escalabilidad y facilidad de gestión en comparación con
las arquitecturas basadas en máquinas virtuales tradicionales.
Tabla comparativa entre contenedores y máquinas virtuales (VMs), destacando
los pros y contras de cada uno:

Característica Contenedores Máquinas Virtuales

Bajo, ya que comparten el kernel Alto, debido a la necesidad de un


Overhead
del SO host. SO completo por VM.

Rápido, generalmente en
Inicio Más lento, puede tomar minutos.
segundos.

Eficiente, menor consumo de Menos eficiente, mayor uso de


Uso de Recursos
CPU y memoria. recursos.

Alta, pueden ejecutar más


Menor, limitada por la necesidad
Densidad instancias en el mismo
de recursos del SO.
hardware.

Excelente, proporciona un
Aislamiento Bueno, pero menor que las VMs.
aislamiento completo.

Buena, aunque depende del Mejor, debido al aislamiento a


Seguridad
aislamiento del kernel del SO. nivel de SO.

Excelente, fácil de mover entre Buena, pero más pesada debido al


Portabilidad
diferentes entornos. SO incluido.

Mayor uso debido al SO y al disco


Almacenamiento Menor uso de almacenamiento.
virtual.

Alta, puede ejecutar diferentes


Compatibilidad Depende del kernel del SO host.
SO.

Escalabilidad limitada por


Escalabilidad Alta, fácil de escalar y orquestar.
recursos y rendimiento.

Simplificada a través de Más compleja, requiere gestión de


Gestión
herramientas como Kubernetes. SO y aplicaciones.

17. Docker 3
Esta tabla resume los aspectos clave de los contenedores y las máquinas
virtuales, destacando las fortalezas y debilidades de cada tecnología en diversos
contextos de uso.
La elección entre contenedores y VMs a menudo depende de las necesidades
específicas del proyecto, la infraestructura existente, y consideraciones de
seguridad y rendimiento.

1.2 Historia y Evolución de Docker


1.2.1 Origen de Docker
Docker, lanzado inicialmente en 2013, es el resultado de un proyecto iniciado por
Solomon Hykes como parte de la empresa dotCloud, una compañía de PaaS
(Platform as a Service). Originalmente, Docker fue diseñado para mejorar la
capacidad de dotCloud de desplegar aplicaciones en múltiples infraestructuras de
manera eficiente y consistente.

1.2.2 Por qué Surgió


Necesidad de Consistencia y Eficiencia: Antes de Docker, desplegar
aplicaciones en diferentes entornos era un desafío debido a las diferencias en
los entornos de desarrollo, prueba y producción. Esto llevaba a la
problemática de "funciona en mi máquina", donde las aplicaciones
funcionaban bien en un entorno pero fallaban en otros.

Auge de la Contenedorización: Docker aprovechó las ventajas de la


contenedorización, una técnica que ya existía en Linux a través de LXC (Linux
Containers), pero la simplificó y la hizo más accesible, ofreciendo una
solución a la problemática antes mencionada.

1.2.3 Extensión de su Uso en la Industria


1. Estandarización del Despliegue: Docker proporcionó una forma
estandarizada de empaquetar y desplegar aplicaciones, lo que significó una
gran mejora en la eficiencia y la portabilidad en comparación con las
metodologías anteriores.

2. DevOps y Automatización: Con la creciente popularidad de las prácticas de


DevOps, Docker se alineó perfectamente con la necesidad de automatización

17. Docker 4
y entrega continua. Permitió a los equipos de desarrollo y operaciones trabajar
más estrechamente para desplegar y escalar aplicaciones rápidamente.

3. Microservicios: La arquitectura de microservicios ganó popularidad porque


permitía una mayor escalabilidad y agilidad. Docker, con su capacidad de
aislar y gestionar pequeñas unidades de software, se convirtió en una
herramienta ideal para desplegar microservicios.

4. Adopción en la Nube: Con el auge de la computación en la nube, Docker se


benefició enormemente, ya que facilitaba el despliegue de aplicaciones en
diferentes infraestructuras de nube, proporcionando consistencia y
reduciendo la dependencia de proveedores.

5. Comunidad y Ecosistema: Docker no solo se convirtió en una herramienta


popular, sino que también desarrolló un rico ecosistema y una comunidad
activa. Esto llevó a una gran cantidad de imágenes de Docker disponibles
públicamente, herramientas complementarias y mejoras constantes en la
plataforma.

6. Orquestación de Contenedores: La necesidad de gestionar múltiples


contenedores llevó al desarrollo de sistemas de orquestación como
Kubernetes, que, aunque inicialmente competían con la propia herramienta de
orquestación de Docker (Swarm), terminaron por integrarse y
complementarse, reforzando aún más el uso de contenedores en la industria.

La evolución de Docker está marcada por su capacidad para resolver problemas


clave en el despliegue y gestión de aplicaciones. Su impacto en la industria del
software es significativo, habiendo cambiado fundamentalmente la forma en que
las aplicaciones se desarrollan, despliegan y escalan, tanto en entornos on-
premise como en la nube. Su adopción generalizada refleja una clara tendencia
hacia la eficiencia, la portabilidad y la automatización en el desarrollo de software
moderno.

1.3 Ventajas de Docker


1. Aislamiento de Recursos
Docker permite que cada contenedor funcione de manera aislada, con sus
propias dependencias y bibliotecas. Esto evita conflictos entre contenedores y

17. Docker 5
mejora la seguridad al limitar el impacto de fallos.
Beneficios: Facilita la gestión de dependencias y reduce los problemas de
"funciona en mi máquina", ya que el entorno es consistente a través de todos los
contenedores.

2. Portabilidad
Los contenedores Docker pueden ejecutarse en cualquier sistema que tenga
Docker instalado, independientemente del entorno operativo. Esto elimina el
problema de las discrepancias entre los entornos de desarrollo y producción.
Beneficios: Facilita el despliegue en diversos entornos, desde un servidor local
hasta la nube, sin necesidad de reconfiguraciones.

3. Eficiencia
Docker utiliza los recursos del sistema operativo anfitrión de manera más eficiente
que las máquinas virtuales, lo que se traduce en un uso más eficiente de la CPU y
la memoria.

Beneficios: Permite ejecutar más aplicaciones en el mismo hardware en


comparación con las máquinas virtuales, reduciendo los costos de infraestructura.

4. Escalabilidad y Orquestación
Docker se integra bien con herramientas de orquestación como Kubernetes, lo
que facilita la gestión y el escalado automático de aplicaciones contenerizadas.
Beneficios: Permite a las empresas escalar servicios de manera eficiente y
responder rápidamente a cambios en la demanda.

Desventajas de Docker

1. Seguridad
A pesar del aislamiento, los contenedores comparten el kernel del sistema
operativo anfitrión, lo que puede ser un riesgo de seguridad si un contenedor se
ve comprometido.

Retos: Requiere una gestión cuidadosa de la seguridad, incluyendo la


actualización regular de imágenes y la limitación de privilegios dentro de los

17. Docker 6
contenedores.

2. Complejidad para Nuevos Usuarios


La curva de aprendizaje para Docker puede ser empinada, especialmente para
usuarios sin experiencia en contenedorización o administración de sistemas.
Retos: Necesidad de formación y adaptación, así como de documentación y
soporte para nuevos usuarios.

3. Dependencia de la Plataforma
A pesar de su portabilidad, Docker depende de características específicas del
kernel de Linux, lo que puede limitar su uso en algunos sistemas operativos sin
soporte nativo.

Retos: Puede requerir soluciones de trabajo, como Docker Machine en Windows o


Mac, que pueden añadir complejidad.

4. Gestión de Almacenamiento y Red


La gestión del almacenamiento y la configuración de redes para contenedores
puede ser compleja, especialmente en entornos de gran escala o con requisitos
específicos.
Retos: Requiere conocimientos avanzados para optimizar el rendimiento y
asegurar una configuración adecuada.

Aspecto Ventajas (Pros) Desventajas (Contras)

Cada contenedor funciona de forma Compartir el kernel del SO


Aislamiento de aislada, lo que mejora la seguridad y anfitrión puede ser un riesgo si
Recursos reduce conflictos entre un contenedor se ve
aplicaciones. comprometido.

Los contenedores pueden Puede haber dependencia de la


ejecutarse en cualquier sistema con plataforma y limitaciones en
Portabilidad
Docker, facilitando la migración y el sistemas operativos sin soporte
despliegue en diferentes entornos. nativo.

Eficiencia Uso más eficiente de la CPU y la La gestión del almacenamiento


memoria en comparación con las y la configuración de redes para

17. Docker 7
máquinas virtuales, permitiendo contenedores puede ser
mayor densidad de aplicaciones en compleja.
el mismo hardware.

Requiere conocimientos
Integración con herramientas de
avanzados para una
Escalabilidad y orquestación como Kubernetes para
configuración y gestión
Orquestación una gestión y escalabilidad
efectivas en entornos a gran
eficientes.
escala.

La curva de aprendizaje puede


Curva de ser empinada para usuarios
-
Aprendizaje nuevos o sin experiencia en
contenedorización.

2. Conceptos clave y principales usos


2.1 Conceptos Clave de Docker

2.1.1. Imagen Docker


Una imagen Docker es un archivo inmutable que contiene el código fuente,
bibliotecas, dependencias, herramientas y otros archivos necesarios para ejecutar
una aplicación. Es esencialmente una plantilla o una instantánea del estado de una
aplicación que sirve como base para crear contenedores.
Cómo se usa:

17. Docker 8
Las imágenes Docker se utilizan para crear contenedores. Cuando ejecutas un
contenedor, Docker toma la imagen base y crea una capa de escritura encima de
ella, donde la aplicación se ejecuta. Puedes obtener imágenes de Docker desde
Docker Hub, que es un repositorio público, o puedes crear tus propias imágenes
usando un Dockerfile.

2.1.2. Contenedor Docker


Un contenedor Docker es una instancia ejecutable de una imagen Docker. Puedes
pensar en un contenedor como una versión en ejecución de la imagen, que
encapsula la aplicación y su entorno de ejecución. Los contenedores son ligeros,
portátiles y consistentes en diferentes entornos.

Diferencia entre imagen y contenedor:


La diferencia clave es que una imagen es estática, es decir, no cambia, mientras
que un contenedor es una entidad dinámica que está en ejecución. La imagen
proporciona los archivos y configuraciones necesarios, pero el contenedor es
donde se ejecuta la aplicación en sí, con su propio espacio de archivos y recursos
de red aislados.

2.1.3. Dockerfile
Un Dockerfile es un script de instrucciones utilizado para crear una imagen
Docker. Contiene una serie de comandos y argumentos que definen cómo se
debe construir la imagen.
Estructura y Uso:

Un Dockerfile consta de una serie de comandos e instrucciones que dictan cómo


se debe construir una imagen Docker.
Un Dockerfile típico comienza con una imagen base utilizando la instrucción FROM .
Luego, se agregan capas adicionales con instrucciones como COPY o ADD para
añadir archivos al contenedor, RUN para ejecutar comandos durante el proceso de
construcción, y CMD o ENTRYPOINT para especificar el comando que se ejecutará
cuando se inicie el contenedor. El proceso de construcción de una imagen a partir
de un Dockerfile se realiza mediante el comando docker build .
Aquí tienes una lista de algunos de los comandos más comunes en un Dockerfile
y sus propósitos:

17. Docker 9
1. FROM: Establece la imagen base para la construcción. Es el primer comando en
cualquier Dockerfile y define de qué imagen se parte.

Ejemplo: FROM ubuntu:18.04

2. RUN : Ejecuta comandos en una nueva capa sobre la imagen actual y confirma
los resultados. Es útil para instalar paquetes o realizar configuraciones.

Ejemplo: RUN apt-get update && apt-get install -y python

3. CMD : Proporciona un comando y argumentos por defecto para el contenedor


ejecutable. Solo puede haber un CMD en un Dockerfile. Si se especifican
varios, solo el último tiene efecto.

Ejemplo: CMD ["python", "./[Link]"]

4. LABEL: Agrega metadatos a la imagen como pares clave-valor. Es útil para


añadir información como mantenedor, versión de la imagen, etc.

Ejemplo: LABEL version="1.0"

5. EXPOSE: Informa a Docker que la imagen escuchará en los puertos


especificados en tiempo de ejecución. No publica el puerto, solo actúa como
una forma de documentación entre quien construye la imagen y quien la
ejecuta.

Ejemplo: EXPOSE 80

6. ENV : Establece variables de entorno. Estas variables persisten cuando se


inicia un contenedor basado en la imagen.

Ejemplo: ENV PATH /usr/local/bin:$PATH

7. ADD : Copia archivos, directorios o archivos remotos desde src y los agrega al
sistema de archivos de la imagen en dest .

Ejemplo: ADD . /app

8. COPY: Copia archivos y directorios locales al contenedor. Es preferible a ADD ,


ya que es más transparente (no realiza descompresiones ni descargas).

Ejemplo: COPY ./[Link] /app/

9. : Configura un contenedor para que se ejecute como un ejecutable.


ENTRYPOINT

Permite configurar un contenedor con un comando y argumentos por defecto

17. Docker 10
que se pueden sobrescribir desde la línea de comando cuando se inicia el
contenedor.

Ejemplo: ENTRYPOINT ["python"]

10. VOLUME : Crea un punto de montaje con el nombre especificado y marca con él
un directorio que puede ser montado desde el host o desde otros
contenedores.

Ejemplo: VOLUME /myvol

11. USER: Establece el nombre de usuario (o UID) y opcionalmente el grupo de


usuario (o GID) a usar al ejecutar la imagen y para cualquier RUN , CMD y
ENTRYPOINT .

Ejemplo: USER myuser:mygroup

12. WORKDIR : Establece el directorio de trabajo para cualquier instrucción RUN , CMD ,
ENTRYPOINT , COPY y ADD que se ejecute en la imagen.

Ejemplo: WORKDIR /app

13. ARG: Define una variable que los usuarios pueden pasar en tiempo de
construcción con el comando docker build .

Ejemplo: ARG VERSION=1.0

14. : Agrega un comando de disparo que se ejecutará en una imagen


ONBUILD

descendiente. Es útil para imágenes que se van a usar como bases de otras
imágenes.

Ejemplo: ONBUILD RUN /usr/local/bin/python-build --dir /app

15. STOPSIGNAL : Establece la señal del sistema que se enviará al contenedor para
salir.

Ejemplo: STOPSIGNAL SIGTERM

Estos comandos son los bloques de construcción de un Dockerfile, permitiéndote


crear imágenes Docker personalizadas que se ajusten exactamente a tus
necesidades de aplicación y despliegue.

2.1.4 Ejemplo de Dockerfile:

17. Docker 11
# Usar una imagen base
FROM python:3.8

# Establecer el directorio de trabajo


WORKDIR /app

# Copiar los archivos necesarios


COPY [Link] .

# Instalar dependencias
RUN pip install -r [Link]

# Copiar el resto del código de la aplicación


COPY . .

# Comando para ejecutar la aplicación


CMD ["python", "./my_script.py"]

En este ejemplo, el Dockerfile construye una imagen para una aplicación Python,
comenzando desde una imagen base de Python 3.8, instalando las dependencias
necesarias y luego copiando el código de la aplicación en la imagen. Finalmente,
define el comando que se ejecutará al iniciar el contenedor.

Estos conceptos fundamentales de Docker - imágenes, contenedores y


Dockerfiles - son cruciales para entender cómo funciona Docker y cómo se utiliza
para desplegar y gestionar aplicaciones de manera eficiente y consistente.

Vamos a crear un ejemplo combinado de un Dockerfile que construye una imagen


para una aplicación web simple en Python. El Dockerfile incluirá varios de los
comandos mencionados anteriormente, cada uno con su propósito específico.

2.1.5 Ejemplos
Dockerfile App en Node
Aquí tienes un ejemplo de cómo se podría usar WORKDIR en un Dockerfile :

17. Docker 12
# Usa una imagen base
FROM node:14

# Establece el directorio de trabajo


WORKDIR /usr/src/app

# Copia los archivos del proyecto


COPY . .

# Instala dependencias del proyecto


RUN npm install

# Expone el puerto en el que la app se ejecuta


EXPOSE 3000

# Define el comando para ejecutar la app


CMD ["node", "[Link]"]

En este ejemplo, WORKDIR /usr/src/app establece /usr/src/app como el directorio de


trabajo. Los comandos COPY , RUN y CMD se ejecutarán en este contexto. Si
/usr/src/app no existe, Docker lo creará.

Dockerfile para una Aplicación Web en Python

# Establecer la imagen base con Python 3.8


FROM python:3.8

# Autor/Mantenedor de la imagen
LABEL maintainer="developer@[Link]"

# Establecer variables de entorno


ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

17. Docker 13
# Crear y establecer el directorio de trabajo
WORKDIR /app

# Instalar dependencias de Python


# Utiliza el archivo [Link] de tu proyecto
COPY [Link] /app/
RUN pip install --no-cache-dir -r [Link]

# Copiar el resto de los archivos del proyecto al contenedor


COPY . /app

# Exponer el puerto en el que la aplicación se ejecutará


EXPOSE 8000

# Definir el comando por defecto para iniciar la aplicación


# Este es el comando para ejecutar una aplicación web Flask,
por ejemplo
CMD ["python", "[Link]"]

2.1.6 Indicaciones para el Dockerfile


1. FROM python:3.8: Selecciona la imagen base oficial de Python 3.8. Esta
imagen incluye el intérprete de Python y todas las herramientas necesarias
para ejecutar una aplicación Python.

2. LABEL maintainer="developer@[Link]": Etiqueta la imagen con la


información del autor o mantenedor.

3. ENV PYTHONDONTWRITEBYTECODE 1 y ENV PYTHONUNBUFFERED 1:


Establece variables de entorno para Python. Evita la creación de archivos .pyc

y asegura que los logs de Python se muestren en tiempo real.

4. WORKDIR /app: Establece el directorio /app dentro del contenedor como


directorio de trabajo. Todos los comandos siguientes se ejecutarán en este
directorio.

5. COPY [Link] /app/: Copia el archivo [Link] del directorio


local al directorio de trabajo en el contenedor.

17. Docker 14
6. RUN pip install --no-cache-dir -r [Link]: Instala las dependencias
de Python especificadas en [Link] .

7. COPY . /app: Copia todos los archivos restantes del directorio local al
directorio de trabajo en el contenedor.

8. EXPOSE 8000: Informa a Docker que la aplicación escuchará en el puerto


8000. Esto es útil para la documentación y no publica el puerto por sí mismo.

9. CMD ["python", "[Link]"]: Define el comando por defecto para ejecutar la


aplicación. En este caso, estamos asumiendo que [Link] es el archivo que
inicia la aplicación web.

2.2 Uso del Dockerfile


Para construir una imagen a partir de este Dockerfile, ejecutarías el siguiente
comando en el directorio donde se encuentra el Dockerfile:

docker build -t mi-aplicacion-web .

Esto construirá una nueva imagen Docker con el nombre mi-aplicacion-web basada
en las instrucciones proporcionadas en el Dockerfile. Luego, puedes iniciar un
contenedor basado en esta imagen usando:

docker run -p 8000:8000 mi-aplicacion-web

Esto inicia un contenedor que ejecuta tu aplicación web y mapea el puerto 8000
del contenedor al puerto 8000 de tu máquina host, permitiéndote acceder a la
aplicación a través de localhost:8000 en tu navegador.
El mapeo de puertos se realiza de la siguiente manera:

Primer 8000: Este es el puerto de tu máquina host, el cual se abre al exterior.


Es el puerto al que accedes cuando visitas localhost:8000 en tu navegador o
haces una solicitud a tu aplicación.

Segundo 8000: Este es el puerto dentro del contenedor Docker. Es el puerto


al que tu aplicación está escuchando, como se define en el código de la
aplicación o en su configuración.

17. Docker 15
En resumen, -p 8000:8000 mapea el puerto 8000 de tu host (la máquina en la que
se ejecuta Docker) al puerto 8000 del contenedor Docker. Esto permite que las
solicitudes enviadas al puerto 8000 de tu máquina host se redirijan al puerto 8000
del contenedor, donde se ejecuta tu aplicación. Este tipo de mapeo es esencial
para el acceso a aplicaciones web y servicios que se ejecutan en contenedores.

2.3 Comandos Principales de Docker


1. docker build
Uso: Crea una imagen Docker a partir de un Dockerfile.

Ejemplo: Para construir una imagen a partir de un Dockerfile en el directorio


actual:

docker build -t mi-aplicacion .

Ejercicio Rápido: Construir una imagen a partir de un Dockerfile ubicado en


un subdirectorio:

docker build -t mi-app ./app

2. docker run
Uso: Inicia un contenedor a partir de una imagen. Si la imagen no está
disponible localmente, Docker intenta descargarla desde un registro de
imágenes (como Docker Hub).

Ejemplo: Para ejecutar un contenedor a partir de la imagen de Ubuntu y


acceder a su shell, usarías:

docker run -it ubuntu /bin/bash

Ejercicio Rápido: Ejecutar un contenedor con una imagen de Python e iniciar


una sesión interactiva de Python:

17. Docker 16
docker run -it python python

3. docker ps
Uso: Muestra los contenedores en ejecución. Con la opción a , muestra todos
los contenedores, incluyendo los detenidos.

Ejemplo: Para ver todos los contenedores activos:

docker ps

Ejercicio Rápido: Listar todos los contenedores (activos y detenidos):

docker ps -a

4. docker stop
Uso: Detiene uno o más contenedores en ejecución.

Ejemplo: Para detener un contenedor llamado mi_contenedor :

docker stop mi_contenedor

Ejercicio Rápido: Detener todos los contenedores en ejecución:

docker stop $(docker ps -q)

5. docker start
Uso: Levanta un contenedor ya creado.

Ejemplo: Para levantar un contenedor llamado mi_contenedor :

docker start mi_contenedor

Ejercicio Rápido: Detener todos los contenedores en ejecución:

17. Docker 17
docker stop $(docker ps -q)

6. docker pull
Uso: Descarga una imagen de un registro de imágenes sin iniciar un
contenedor.

Ejemplo: Para descargar la última imagen de Ubuntu:

docker pull ubuntu

Ejercicio Rápido: Descargar la imagen oficial de [Link]:

docker pull node

Lista de comandos
docker build . : Crea una imagen de Docker a partir del Dockerfile

docker build -t mi-app . : Crea una imagen de Docker a partir del Dockerfile, con
el nombre indicado

docker images : Lista todas las imágenes locales.

docker rmi [IMAGE_ID] : Elimina una o más imágenes.

docker run mi-app : Crea e inicializa un contenedor a partir de la imagen

: Crea e inicializa un contenedor a partir de la


docker run -p 8080:3000 mi-app

imagen y expone los puertos

docker ps -a : Lista todas los contenedores, activos o inactivos.

docker stop [CONTAINER_ID] : Elimina uno o más contenedores.

docker start [CONTAINER_ID] : Inicializa un contenedor.

docker exec : Ejecuta un comando en un contenedor en ejecución.

docker logs : Obtiene los logs de un contenedor.

17. Docker 18
docker volume create : Crea un volumen para almacenamiento persistente.

docker network create : Crea una red para conectar contenedores.

Ejemplo Combinado
Supongamos que deseas construir y ejecutar una aplicación web en un
contenedor:

1. Construir la Imagen:

Tienes un Dockerfile en tu directorio actual.

Construye la imagen con:

docker build -t mi-web-app .

2. Ejecutar la Aplicación:

Supongamos que tu aplicación escucha en el puerto 5000.

Ejecuta el contenedor mapeando el puerto:

docker run -p 8000:5000 mi-web-app

Ahora puedes acceder a la aplicación en localhost:8000 en tu navegador.

3. Verificar y Detener:

Verifica si el contenedor está ejecutándose:

docker ps

Detén el contenedor usando su ID o nombre:

docker stop [CONTAINER_ID]

Estos ejemplos y ejercicios brindan una visión práctica de cómo utilizar los
comandos fundamentales de Docker para manejar imágenes y contenedores en
distintas situaciones.

17. Docker 19
2.4 Ejercicio práctico
Para demostrar cómo crear y ejecutar un contenedor Docker con una aplicación
web React que utiliza [Link] para el backend y MongoDB como base de datos,
seguiremos un enfoque paso a paso. Este ejemplo te guiará a través de la
creación de un Dockerfile para el frontend de React y otro para el backend de
[Link], y luego utilizaremos Docker Compose para orquestar ambos servicios
junto con MongoDB.

Paso 1: Preparar la Aplicación


Supongamos que tienes un proyecto con la siguiente estructura:

/proyecto-react-node
/backend
[Link]
[Link]
...
/frontend
/src
/public
[Link]
...
[Link]

El frontend es una aplicación creada con create-react-app y el backend es una API


simple en [Link] que se conecta a MongoDB.

Paso 2: Crear Dockerfiles

Dockerfile para el Backend ([Link])


En el directorio backend , crea un Dockerfile :

# Imagen base
FROM node:14

# Establecer directorio de trabajo

17. Docker 20
WORKDIR /usr/src/app

# Instalar dependencias
COPY package*.json ./
RUN npm install

# Copiar el código fuente


COPY . .

# Exponer el puerto en el que la app se ejecuta


EXPOSE 3001

# Comando para iniciar la app


CMD ["node", "[Link]"]

Dockerfile para el Frontend (React)


En el directorio frontend , crea un Dockerfile :

# Imagen base
FROM node:14

# Establecer directorio de trabajo


WORKDIR /usr/src/app

# Instalar dependencias
COPY package*.json ./
RUN npm install

# Copiar el código fuente


COPY . .

# Construir la aplicación para producción


RUN npm run build

# Instalar servidor HTTP para servir la aplicación construida

17. Docker 21
RUN npm install -g serve

# Exponer el puerto
EXPOSE 5000

# Comando para iniciar la app


CMD ["serve", "-s", "build", "-l", "5000"]

Paso 3: Docker Compose para Orquestar los Servicios


En la raíz de tu proyecto ( /proyecto-react-node ), crea un archivo [Link]
para definir y ejecutar los servicios de frontend, backend y MongoDB:

version: '3.8'
services:
mongodb:
image: mongo
ports:
- "27017:27017"
backend:
build: ./backend
ports:
- "3001:3001"
depends_on:
- mongodb
environment:
MONGO_URI: "mongodb://mongodb:27017/miBaseDeDatos"
frontend:
build: ./frontend
ports:
- "5000:5000"
depends_on:
- backend

Este archivo define tres servicios:

17. Docker 22
mongodb : Utiliza la imagen oficial de MongoDB y expone el puerto 27017.

: Construye la imagen del backend a partir del Dockerfile en el


backend

directorio backend , se conecta a MongoDB y expone el puerto 3001.

frontend: Construye la imagen del frontend a partir del Dockerfile en el


directorio frontend y expone el puerto 5000.

Paso 4: Ejecutar con Docker Compose


En el directorio raíz de tu proyecto, donde se encuentra el [Link] ,
ejecuta:

docker-compose up --build

Este comando construirá las imágenes para el frontend y el backend (si es


necesario) y arrancará los contenedores para los servicios definidos, incluido
MongoDB.

Paso 5: Acceder a la Aplicación


Una vez que todos los servicios estén en funcionamiento, puedes acceder a la
aplicación React en [Link] y a tu API de [Link] en
[Link] .

Este ejemplo demuestra cómo Docker y Docker Compose pueden ser utilizados
para desarrollar, construir y ejecutar aplicaciones complejas con múltiples
servicios de manera fácil y eficiente.

3. Docker Compose
3.1 ¿Qué es Docker Compose?
3.1.1 Definición
Docker Compose es una herramienta que fue diseñada para ayudar a los
desarrolladores y administradores de sistemas a definir y gestionar aplicaciones
multi-contenedor de Docker con una mayor facilidad y eficiencia. Utiliza un
archivo YAML para configurar los servicios de la aplicación, lo que permite definir,

17. Docker 23
entre otras cosas, imágenes a usar, puertos a exponer, volúmenes a montar y
dependencias entre servicios. Con un único comando, los usuarios pueden iniciar,
detener y reconstruir todos los servicios definidos en este archivo de
configuración.

3.1.2 ¿Por Qué Surge Docker Compose?


La necesidad de Docker Compose surge de la complejidad inherente a manejar
aplicaciones compuestas por múltiples contenedores que interactúan entre sí. En
entornos de producción o desarrollo complejos, una aplicación podría necesitar,
por ejemplo, un contenedor para la base de datos, otro para la aplicación web, tal
vez uno más para un servidor de caché, y así sucesivamente. Gestionar estos
contenedores de manera individual con comandos de Docker puede volverse
tedioso y propenso a errores, especialmente cuando se trata de establecer
conexiones entre ellos, mantener sus configuraciones consistentes y asegurar
que se ejecuten en el orden correcto.

3.1.3 Beneficios de Docker Compose:


1. Simplificación de la Gestión de Contenedores: Docker Compose simplifica el
proceso de despliegue de aplicaciones multi-contenedor, permitiendo que
toda la configuración se maneje a través de un único archivo docker-
[Link] .

2. Desarrollo Eficiente: Al definir servicios, redes y volúmenes en un archivo de


configuración, los desarrolladores pueden compartir y replicar entornos de
desarrollo y producción de manera fácil, asegurando la consistencia entre los
entornos.

3. Automatización del Despliegue: Con Docker Compose, se pueden


automatizar tareas como la construcción de imágenes, el inicio y la detención
de servicios, y la escalación de servicios, lo cual es particularmente útil en
ciclos de integración continua y despliegue continuo (CI/CD).

4. Facilidad de Uso: Docker Compose permite a los desarrolladores y


administradores de sistemas iniciar toda una stack de aplicación con un solo
comando ( docker-compose up ), lo que hace que sea más sencillo gestionar
aplicaciones compuestas por varios contenedores.

17. Docker 24
5. Aislamiento de Aplicaciones: Cada configuración de Docker Compose puede
estar aislada en su propio entorno, lo que permite ejecutar múltiples instancias
de la misma stack de aplicación en el mismo host sin conflictos.

Docker Compose surgió como una solución a la necesidad de simplificar y


automatizar el despliegue y gestión de aplicaciones compuestas por varios
contenedores Docker. A través de su uso, los desarrolladores y operadores
pueden mejorar significativamente la eficiencia, la reproducibilidad y la
escalabilidad de las aplicaciones, facilitando a su vez el desarrollo, las pruebas y
la producción de software.

3.2 Ventajas de usar Docker Compose


Docker Compose ofrece una serie de ventajas significativas para el desarrollo,
despliegue y gestión de aplicaciones basadas en contenedores, simplificando
muchos de los desafíos asociados con aplicaciones multi-contenedor. A
continuación, se detallan algunas de las principales ventajas:

1. Facilidad de Configuración
Docker Compose permite definir la configuración de tu aplicación (servicios,
redes, volúmenes, etc.) en un solo archivo YAML, lo que simplifica la
configuración de entornos complejos.
Beneficio: Reduce la complejidad y los errores potenciales al configurar
manualmente cada contenedor, y facilita la replicación de entornos de desarrollo,
prueba y producción.

2. Gestión de Múltiples Contenedores


Con Docker Compose, puedes gestionar toda una stack de aplicación (front-end,
back-end, bases de datos, etc.) como un grupo cohesivo de servicios que pueden
ser iniciados, detenidos y reconstruidos con comandos sencillos.
Beneficio: Mejora la eficiencia operativa al permitir que los desarrolladores y
operadores se centren en la aplicación como un todo, en lugar de lidiar con
contenedores individuales.

3. Aislamiento de Entornos

17. Docker 25
Docker Compose facilita la creación de entornos aislados para tus aplicaciones
mediante el uso de redes, volúmenes y nombres de contenedores específicos del
proyecto.
Beneficio: Permite que múltiples instancias de la misma stack, o diferentes
proyectos, coexistan en el mismo host sin interferencia, facilitando el desarrollo y
las pruebas.

4. Consistencia entre Entornos


La definición de toda la stack de aplicación en un archivo [Link]
asegura que todos los miembros del equipo y los entornos de CI/CD utilicen
configuraciones idénticas.
Beneficio: Reduce los "funciona en mi máquina" problemas al garantizar que
todos trabajen con configuraciones idénticas, lo que mejora la calidad y
predictibilidad del software.

5. Desarrollo y Despliegue Rápidos


Docker Compose hace que sea rápido y fácil iniciar entornos de desarrollo y
testeo, así como desplegar aplicaciones en producción con un solo comando.
Beneficio: Acelera el ciclo de desarrollo y despliegue, permitiendo a los equipos
iterar más rápidamente y responder más eficientemente a las necesidades del
negocio.

6. Integración y Escalabilidad
Aunque Docker Compose se utiliza principalmente en entornos de desarrollo y
pruebas, su formato de configuración es compatible con herramientas de
orquestación de contenedores como Docker Swarm y Kubernetes, lo que facilita
la transición a la producción y la escalabilidad.
Beneficio: Permite una transición suave de proyectos desde el desarrollo hasta la
producción a gran escala, aprovechando las ventajas de la orquestación de
contenedores para la gestión y escalabilidad.

Las ventajas de usar Docker Compose radican en su capacidad para simplificar y


automatizar el proceso de desarrollo y despliegue de aplicaciones complejas. Al

17. Docker 26
proporcionar una herramienta que mejora la eficiencia, la consistencia y la
portabilidad, Docker Compose se ha convertido en un componente esencial en el
ecosistema de contenedores, facilitando a los equipos el manejo de aplicaciones
compuestas por múltiples servicios.

3.3 Sintaxis y Archivos de Configuración


3.3.1 Sintaxis y Archivos de Configuración de Docker Compose
El archivo [Link] es el corazón de Docker Compose y sirve como el
archivo de configuración donde se definen todos los servicios, redes y volúmenes
necesarios para tu aplicación. A continuación, se describe la estructura general y
algunas de las opciones comunes utilizadas en este archivo.

3.3.2 Estructura Básica


Un archivo [Link] típico tiene la siguiente estructura:

version: '3.8' # Especifica la versión de la sintaxis de Dock


er Compose

services: # Define los servicios de tu aplicación


web:
image: nginx:alpine # Usa una imagen preconstruida
ports:
- "80:80" # Mapea puertos entre el contenedor y el host
volumes:
- ./html:/usr/share/nginx/html # Monta un volumen

app:
build: ./app # Construye la imagen a partir de un Dockerf
ile en el directorio ./app
environment:
- NODE_ENV=production # Establece variables de entorno
depends_on:
- db # Establece dependencias entre servicios

17. Docker 27
db:
image: postgres:13
volumes:
- db-data:/var/lib/postgresql/data # Define un volumen
nombrado para persistir datos

volumes: # Define volúmenes para la persistencia de datos


db-data:

networks: # Define redes personalizadas


app-net:

3.3.3 Opciones Comunes


version : Especifica la versión de la sintaxis de Docker Compose utilizada. Es
importante alinear esta versión con las capacidades de tu versión de Docker
Compose.

services : El corazón del archivo, donde defines los contenedores que


necesitas para tu aplicación. Cada servicio puede incluir configuraciones
como image (para especificar una imagen de Docker existente) o build (para
construir una imagen a partir de un Dockerfile ).

image : Especifica la imagen de Docker que el servicio debe usar.

build : Indica a Docker Compose que construya una imagen a partir de un


Dockerfile . Puedes especificar la ruta al directorio que contiene el Dockerfile y
opciones adicionales de construcción.

: Mapea los puertos entre el contenedor y el host, permitiendo el acceso


ports

externo a los servicios.

: Se utiliza para montar directorios del host dentro de los contenedores


volumes

o para definir volúmenes nombrados para la persistencia de datos.

environment : Permite definir variables de entorno dentro de los contenedores.

: Establece dependencias entre servicios, asegurando que los


depends_on

servicios dependientes se inicien en el orden correcto.

17. Docker 28
volumes (a nivel de raíz): Define volúmenes nombrados que pueden ser
utilizados por los servicios, ideal para la persistencia de datos.

(a nivel de raíz): Permite definir redes personalizadas para facilitar la


networks

comunicación entre los servicios.

3.3.4 Ejemplo Práctico


Supongamos que tienes una aplicación web simple con un frontend en React, un
backend en [Link] y una base de datos MongoDB. Tu [Link] podría
verse así:

version: '3.8'

services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend

backend:
build: ./backend
environment:
MONGO_URI: "mongodb://db:27017/myapp"
depends_on:
- db

db:
image: mongo:4.2
volumes:
- db-data:/data/db

volumes:
db-data:

17. Docker 29
Este archivo define tres servicios ( frontend , backend , db ) y un volumen nombrado
( db-data ) para la persistencia de datos de MongoDB. La comunicación entre estos
servicios se gestiona a través de redes predeterminadas de Docker, y las
dependencias aseguran que se inician en el orden correcto.
La sintaxis y estructura del archivo [Link] ofrecen una forma flexible y
poderosa de definir cómo se deben construir, conectar y ejecutar los
contenedores de tu aplicación, simplificando significativamente el proceso de
desarrollo y despliegue.

3.4 Demostración Práctica: Usando Docker Compose


Para ilustrar cómo usar Docker Compose, vamos a crear un ejemplo práctico que
implica configurar una aplicación web sencilla que se conecta a una base de
datos. Este ejemplo consistirá en dos servicios principales:

1. Servicio Web: Una aplicación web simple escrita en [Link].

2. Base de Datos: Una base de datos MySQL para almacenar datos de la


aplicación.

Estructura del Proyecto


La estructura de carpetas de nuestro proyecto será algo así:

/proyecto-docker-compose
/web
Dockerfile
[Link]
[Link]
[Link]

Paso 1: Preparar la Aplicación Web ([Link])


Supongamos que [Link] es un archivo simple de [Link] que se conecta a una
base de datos MySQL y devuelve una respuesta básica.

[Link]

17. Docker 30
const express = require('express');
const mysql = require('mysql');
const app = express();
const port = 3000;

// Configuración de la conexión a la base de datos


const connection = [Link]({
host: 'db',
user: 'user',
password: 'password',
database: 'mydb'
});

[Link]();

[Link]('/', (req, res) => {


[Link]('SELECT NOW() as now', (err, rows) => {
if (err) throw err;
[Link](`Fecha y hora actual de la base de datos: ${rows
[0].now}`);
});
});

[Link](port, () => {
[Link](`Aplicación escuchando en <[Link]
>:${port}`);
});

Dockerfile para el Servicio Web

FROM node:14

WORKDIR /usr/src/app

17. Docker 31
COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "[Link]"]

Paso 2: Configurar [Link]


Ahora, vamos a definir nuestro [Link] para orquestar los dos servicios.

version: '3.8'

services:
web:
build: ./web
ports:
- "3000:3000"
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_DB: mydb

db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password

17. Docker 32
volumes:
- db-data:/var/lib/mysql

volumes:
db-data:

Este archivo configura dos servicios: web y db . El servicio web construye su


imagen a partir del Dockerfile en el directorio web y se conecta al servicio db , que
usa la imagen de MySQL 5.7. También se define un volumen db-data para persistir
los datos de MySQL.

Paso 3: Ejecutar con Docker Compose


Para iniciar la aplicación, ejecuta el siguiente comando en el directorio donde se
encuentra el [Link] :

docker-compose up --build

Docker Compose construirá la imagen para el servicio web (si es necesario),


iniciará los servicios web y db , y montará el volumen para la persistencia de datos
de MySQL.

Paso 4: Acceder a la Aplicación


Una vez que los servicios están en funcionamiento, puedes acceder a la
aplicación web en [Link] desde tu navegador. Verás un mensaje con
la fecha y hora actual de la base de datos, lo que indica que la aplicación web se
ha conectado correctamente a MySQL.

Este ejemplo demuestra cómo Docker Compose facilita la orquestación de


aplicaciones multi-contenedor, permitiendo definir y ejecutar entornos complejos
con múltiples servicios interconectados de manera sencilla y eficaz. Con Docker
Compose, puedes asegurar la consistencia de los entornos de desarrollo, prueba
y producción, simplificando el proceso de desarrollo y despliegue de
aplicaciones.

17. Docker 33
4. Ejercicios y Prácticas
4.1. Ejercicio Práctico con Docker
Objetivo: Crear una imagen Docker para una aplicación simple de "Hola Mundo"
en [Link].
Paso 1: Preparar el entorno de la aplicación

Crea un directorio para tu proyecto y accede a él.

Dentro del directorio, crea un archivo llamado [Link] con el siguiente


contenido:

const http = require('http');

const hostname = '[Link]';


const port = 3000;

const server = [Link]((req, res) => {


[Link] = 200;
[Link]('Content-Type', 'text/plain');
[Link]('Hola Mundo\\n');
});

[Link](port, hostname, () => {


[Link](`Servidor corriendo en <[Link]
ort}/`);
});

Crea un archivo [Link] que especifique las dependencias (en este caso,
no hay dependencias externas, pero [Link] lo requiere para ejecutar la
aplicación):

{
"name": "hola-mundo",
"version": "1.0.0",

17. Docker 34
"description": "Una simple app de Hola Mundo",
"main": "[Link]",
"scripts": {
"start": "node [Link]"
},
"author": "",
"license": "ISC"
}

Paso 2: Crear un Dockerfile

En el mismo directorio, crea un Dockerfile con el siguiente contenido:

FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

Paso 3: Construir la imagen Docker

Abre una terminal en el directorio del proyecto y ejecuta el comando para


construir tu imagen Docker:

docker build -t hola-mundo-node .

Paso 4: Ejecutar la aplicación en un contenedor Docker

Una vez construida la imagen, inicia la aplicación en un contenedor:

17. Docker 35
docker run -p 3000:3000 hola-mundo-node

Accede a [Link] en tu navegador y deberías ver el mensaje


"Hola Mundo".

2. Ejercicio Práctico con Docker Compose


Objetivo: Configurar [Link] para una aplicación web sencilla que
interactúe con una base de datos Redis.
Paso 1: Preparar la aplicación

Asume que ya tienes una aplicación [Link] que utiliza Redis. El directorio del
proyecto debería incluir un Dockerfile para la aplicación [Link].

Paso 2: Crear el archivo [Link]

En el directorio raíz de tu proyecto, crea un archivo [Link] con el


siguiente contenido:

version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- redis
redis:
image: "redis:alpine"

Este archivo configura dos servicios: web (tu aplicación [Link]) y redis (una
instancia de Redis).

Paso 3: Iniciar los servicios con Docker Compose

Ejecuta el siguiente comando en el directorio del proyecto:

17. Docker 36
docker-compose up

Docker Compose construirá la imagen para la aplicación web si es necesario,


iniciará los servicios web y redis , y establecerá la red entre ellos.

Respuestas a Preguntas Comunes

1. ¿Cómo puedo persistir datos en Docker Compose?


Para persistir datos en Docker Compose, puedes utilizar volúmenes. Los
volúmenes son unidades de almacenamiento persistente que existen
independientemente de los ciclos de vida de los contenedores, lo que significa
que los datos permanecen intactos incluso después de que los contenedores se
detienen o eliminan. Hay dos tipos principales de volúmenes que puedes definir
en tu archivo [Link] :

Volúmenes Nombrados: Se declaran en la sección volumes del archivo docker-

y pueden ser compartidos entre contenedores o reutilizados en


[Link]

contenedores futuros.

version: '3.8'
services:
db:
image: postgres
volumes:
- db-data:/var/lib/postgresql/data

volumes:
db-data:

Volúmenes de Bind Mount: Permiten montar un directorio específico del


sistema de archivos del host en el contenedor, proporcionando un camino
directo para que el contenedor acceda y almacene datos en el host.

17. Docker 37
version: '3.8'
services:
app:
image: my-app
volumes:
- ./local/dir:/container/dir

2. ¿Es posible definir múltiples instancias del mismo servicio en


Docker Compose?
Sí, es posible escalar servicios en Docker Compose para crear múltiples
instancias del mismo servicio. Esto se puede hacer de dos maneras principales:

Usando el Comando docker-compose up --scale : Al iniciar tus servicios con


Docker Compose, puedes especificar el número de instancias que deseas
para un servicio determinado.

docker-compose up --scale web=3

Este comando escalará el servicio web a 3 instancias.

Definiendo la Escala en el Archivo [Link] (soporte limitado): La


versión 3 de Docker Compose introdujo soporte limitado para la definición de
la escala directamente en el archivo [Link] a través de la opción
, aunque esto está destinado principalmente para su uso con Docker
deploy

Swarm.

version: '3.8'
services:
web:
image: my-web-app
deploy:
replicas: 3

Es importante notar que la opción deploy no afecta al comando docker-compose up

cuando se usa fuera de un entorno Swarm.

17. Docker 38
3. ¿Cómo se manejan las variables de entorno en los
contenedores Docker?
Las variables de entorno en los contenedores Docker se pueden manejar de
varias maneras, proporcionando flexibilidad para pasar configuraciones
específicas a tus contenedores:

Directamente en el archivo [Link] : Puedes definir variables de


entorno para cada servicio usando la clave environment o env_file .

version: '3.8'
services:
app:
image: my-app
environment:
- MY_VAR=valor

O utilizando un archivo de variables de entorno:

services:
app:
env_file: .env

Archivos .env : Docker Compose automáticamente busca un archivo .env en


el directorio donde se ejecuta docker-compose para cargar variables de entorno
que pueden ser referenciadas dentro del archivo [Link] .

Estas técnicas permiten personalizar la configuración de los contenedores sin


modificar el código de la aplicación o los Dockerfiles, haciendo que las
aplicaciones sean más portátiles y fáciles de configurar en diferentes entornos.

Volúmenes Nombrados
Los volúmenes en Docker proporcionan una forma de persistir datos generados
por y utilizados por los contenedores Docker e implican el almacenamiento de
datos en el sistema de archivos del host, aunque la manera exacta en que se
accede a estos datos puede variar según el tipo de volumen utilizado. Existen

17. Docker 39
principalmente dos tipos de volúmenes en Docker: volúmenes nombrados y bind
mounts.

1. Creación y Almacenamiento: Cuando creas un volumen nombrado utilizando


Docker o Docker Compose, Docker gestiona la ubicación de almacenamiento
en el sistema de archivos del host. Por defecto, estos volúmenes se
almacenan en una parte del sistema de archivos gestionada por Docker,
usualmente bajo /var/lib/docker/volumes/ en sistemas Linux.

2. Acceder a Volúmenes Nombrados: Para acceder y ver los contenidos de un


volumen nombrado, puedes hacer lo siguiente:

Ejecutar un contenedor que monte el volumen y luego explorar los


archivos dentro del contenedor. Por ejemplo, si tienes un volumen
nombrado mi_volumen , puedes iniciar un contenedor de Ubuntu y montar el
volumen para explorar su contenido:

docker run -it --rm -v mi_volumen:/mnt ubuntu bash

Una vez dentro del contenedor, puedes usar comandos como ls /mnt para
ver los archivos en el volumen.

Acceder directamente al sistema de archivos del host. Para usuarios de


Linux, los datos se pueden encontrar en
/var/lib/docker/volumes/nombre_del_volumen/_data .

Bind Mounts
1. Creación y Almacenamiento: Un bind mount vincula un directorio o archivo
del sistema de archivos del host directamente dentro de un contenedor. Tú
especificas la ubicación exacta en el sistema de archivos del host, por lo que
el acceso y la visualización de los datos son tan simples como navegar a esa
ubicación con tu explorador de archivos o terminal.

2. Acceder a Bind Mounts: Dado que especificas la ubicación del bind mount en
el sistema de archivos del host, puedes acceder y modificar los archivos
directamente desde el host sin necesidad de pasar por Docker. Esto es útil
para el desarrollo de aplicaciones, ya que permite que el código y los datos se
trabajen directamente en el host y se reflejen en tiempo real en el contenedor.

17. Docker 40
Consideraciones de Seguridad y Acceso
Permisos: Ten en cuenta los permisos de los archivos y directorios en los
volúmenes y bind mounts. Los contenedores suelen ejecutarse con un UID
específico, que puede no tener los permisos adecuados para leer o escribir en
el volumen, dependiendo de cómo estén configurados los permisos en el
host.

Backup y Manejo de Datos: Aunque Docker facilita el manejo de los datos con
volúmenes, sigue siendo responsabilidad del usuario realizar backups y
gestionar adecuadamente estos datos para evitar pérdidas.

Los volúmenes y bind mounts en Docker ofrecen flexibilidad para el manejo de


datos en contenedores, permitiendo tanto la persistencia de datos como el
desarrollo activo con archivos del host, facilitando un amplio rango de casos de
uso en desarrollo y producción.

17. Docker 41

También podría gustarte