RECURSOS CLOUD
Docker: conceptos
Comprende cómo construir, ejecutar y conectar aplicaciones mediante imágenes y contenedores Docker.
GUÍA DE CONSULTA
¿Qué es Docker?
Dockeres una plataforma que permite empaquetar y ejecutar aplicaciones utilizando contenedores.
Un contenedor proporciona un entorno aislado en el que una aplicación puede ejecutarse junto con las dependencias que necesita.
De esta forma, el entorno de ejecución puede definirse de manera reproducible y utilizarse en diferentes sistemas que dispongan de una plataforma compatible con Docker.
Aplicación
+ Dependencias
+ Configuración
↓
Imagen
↓
ContenedorDocker facilita así la creación de entornos consistentes para desarrollo, pruebas, integración continua y despliegue.
AISLAMIENTO
Contenedores y máquinas virtuales
Un contenedor y una máquina virtual permiten aislar aplicaciones, pero utilizan mecanismos diferentes.
Una máquina virtualincorpora normalmente un sistema operativo invitado completo sobre un hipervisor.
Los contenedores, en cambio, comparten el kernel del sistema anfitrión y aíslan procesos, sistema de archivos, red y otros recursos.
MÁQUINAS VIRTUALES
Aplicación Aplicación
│ │
SO invitado SO invitado
│ │
└──── Hipervisor ────┘
│
Host
CONTENEDORES
Aplicación Aplicación
│ │
Contenedor Contenedor
└────── Docker ──────┘
│
Sistema anfitriónEsto suele permitir que los contenedores sean más ligeros y rápidos de crear que una máquina virtual completa.
No obstante, ambas tecnologías responden a necesidades diferentes y pueden utilizarse conjuntamente.
CONCEPTOS FUNDAMENTALES
Imágenes y contenedores
Imagen
Una imagen Dockeres una plantilla inmutable que contiene los elementos necesarios para crear y ejecutar un contenedor.
Puede incluir el sistema de archivos de la aplicación, bibliotecas, dependencias, configuración y el comando que debe ejecutarse al iniciar el contenedor.
Contenedor
Un contenedores una instancia creada a partir de una imagen.
Dockerfile
↓
docker build
↓
IMAGEN
↓
docker run
↓
CONTENEDORUna misma imagen puede utilizarse para crear múltiples contenedores independientes.
Imagen
├─ Contenedor 1
├─ Contenedor 2
└─ Contenedor 3Registro de imágenes
Las imágenes pueden almacenarse en un registro. Un registro permite publicar, descargar y distribuir imágenes.
Docker Hub es uno de los registros utilizados habitualmente, aunque también pueden emplearse registros privados u otros servicios de almacenamiento de imágenes.
Etiquetas
Las imágenes pueden identificarse mediante tagso etiquetas.
nginx:1.27
mysql:8.4
mi-aplicacion:1.0Utilizar versiones explícitas ayuda a controlar qué versión de una imagen se utiliza en cada entorno.
CICLO DE VIDA
Comandos fundamentales
Docker proporciona comandos para descargar imágenes, crear contenedores y gestionar su ciclo de vida.
Descargar una imagen
docker pull nginxConsultar imágenes locales
docker imagesCrear y ejecutar un contenedor
docker run nginxPara ejecutarlo en segundo plano puede utilizarse -d:
docker run -d nginxConsultar contenedores activos
docker psPara mostrar también los contenedores detenidos:
docker ps -aDetener y arrancar un contenedor
docker stop mi-contenedor
docker start mi-contenedorEliminar un contenedor
docker rm mi-contenedorConsultar los logs
docker logs mi-contenedorEjecutar un comando dentro del contenedor
docker exec -it mi-contenedor shLa opción -itpermite trabajar de forma interactiva cuando el proceso ejecutado lo admite.
CONECTIVIDAD
Puertos
Una aplicación puede escuchar en un puerto dentro del contenedor sin que ese puerto sea directamente accesible desde el sistema anfitrión.
Para publicar un puerto puede utilizarse la opción -p.
docker run -d -p 8080:80 nginxEn este ejemplo:
8080 : 80
│ │
│ └─ Puerto del contenedor
│
└──────── Puerto del hostUna petición realizada al puerto 8080del host se redirige al puerto 80del contenedor.
CONECTIVIDAD
Redes Docker
Docker permite crear redes para facilitar la comunicación entre contenedores.
Una red definida por el usuario permite conectar varios servicios manteniendo una separación lógica respecto a otros contenedores.
Crear una red
docker network create mi-redEjecutar un contenedor conectado a la red
docker run -d \
--name servidor-web \
--network mi-red \
nginxLos contenedores conectados a una misma red pueden comunicarse utilizando los mecanismos de resolución de nombres proporcionados por Docker.
Aplicación
│
mi-red
│
Base de datosDATOS
Persistencia y volúmenes
Los contenedores deben considerarse reemplazables. Los datos importantes no deberían depender exclusivamente de la capa escribible del contenedor.
Docker proporciona diferentes mecanismos para almacenar información fuera del ciclo de vida del contenedor.
Volúmenes
Los volúmenesson recursos gestionados por Docker y diseñados específicamente para almacenar datos persistentes.
docker volume create datos-appEl volumen puede montarse al crear un contenedor:
docker run -d \
--name mi-app \
-v datos-app:/datos \
mi-imagenContenedor
│
└──── /datos
│
▼
Volumen Docker datos-appBind mounts
Un bind mountpermite montar directamente un archivo o directorio del sistema anfitrión dentro del contenedor.
docker run -d \
--mount type=bind,source=/ruta/host,target=/app \
mi-imagenLos bind mounts resultan especialmente útiles durante el desarrollo cuando es necesario trabajar directamente con archivos del host.
DEFINICIÓN DE IMÁGENES
Dockerfile
Un Dockerfilees un archivo de texto que contiene instrucciones para construir una imagen Docker.
Permite definir de forma reproducible el entorno necesario para ejecutar una aplicación.
Instrucciones habituales
FROMestablece la imagen base.
FROM eclipse-temurin:21-jreWORKDIRestablece el directorio de trabajo dentro de la imagen.
WORKDIR /appCOPYincorpora archivos al sistema de archivos de la imagen.
COPY app.jar app.jarRUNejecuta comandos durante la construcción de la imagen.
RUN mkdir /app/datosENVdefine variables de entorno.
ENV APP_ENV=productionEXPOSEdocumenta el puerto utilizado por la aplicación.
EXPOSE 8080CMDpuede definir el comando predeterminado que se ejecutará al iniciar el contenedor.
CMD ["java", "-jar", "app.jar"]Ejemplo completo
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY app.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]CONSTRUCCIÓN Y EJECUCIÓN
De Dockerfile a contenedor
Una vez definido el Dockerfile, puede construirse una imagen mediante docker build.
docker build -t mi-aplicacion:1.0 .La opción -tpermite asignar un nombre y una etiqueta a la imagen.
Después puede crearse un contenedor:
docker run -d \
--name mi-aplicacion \
-p 8080:8080 \
mi-aplicacion:1.0El flujo completo queda representado de la siguiente forma:
Dockerfile
│
▼
docker build
│
▼
Imagen
│
▼
docker run
│
▼
ContenedorMÚLTIPLES SERVICIOS
Docker Compose
Docker Composepermite definir y ejecutar aplicaciones formadas por varios contenedores utilizando un archivo de configuración.
El archivo suele denominarse:
compose.yamlEn él pueden declararse servicios, imágenes, puertos, volúmenes, redes y variables de configuración.
Ejemplo
services:
web:
image: nginx
ports:
- "8080:80"
database:
image: postgres:17
environment:
POSTGRES_DB: aplicacion
POSTGRES_USER: usuario
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- datos-db:/var/lib/postgresql/data
volumes:
datos-db:El valor de POSTGRES_PASSWORD debe proporcionarse externamente. Los secretos no deben almacenarse directamente en un archivo Compose versionado.
En este ejemplo se definen dos servicios: weby database.
El servicio de base de datos utiliza un volumen para conservar sus datos aunque el contenedor sea sustituido.
Iniciar los servicios
docker compose up -dConsultar su estado
docker compose psConsultar logs
docker compose logsDetener y eliminar los servicios
docker compose downCompose resulta especialmente útil cuando una aplicación necesita varios componentes relacionados, como una aplicación web, una base de datos y otros servicios auxiliares.
VISIÓN DE CONJUNTO
Aplicación y base de datos
Una arquitectura sencilla basada en contenedores podría estar formada por una aplicación y una base de datos.
HOST
│
puerto 8080
│
▼
Aplicación (contenedor)
│
red Docker
│
▼
Base de datos (contenedor)
│
▼
Volumen Docker
datos persistentesEl puerto publicado permite acceder a la aplicación desde el exterior. La red permite la comunicación entre los servicios y el volumen conserva los datos de la base de datos.
Cada elemento cumple así una función diferente: imagenpara definir el software, contenedorpara ejecutarlo, redpara comunicar servicios y volumenpara conservar información.
RECOMENDACIONES
Buenas prácticas
Una imagen debería contener únicamente los componentes necesarios para ejecutar la aplicación y poder construirse de manera reproducible.
- Utilizar imágenes base adecuadas y mantenerlas actualizadas.
- Utilizar etiquetas de versión explícitas cuando sea necesario controlar la versión utilizada.
- Mantener las imágenes tan pequeñas y simples como resulte razonable.
- Utilizar un archivo
.dockerignorepara evitar incorporar archivos innecesarios al contexto de construcción. - Evitar almacenar contraseñas, tokens y otros secretos dentro de la imagen.
- Ejecutar los procesos con los privilegios mínimos necesarios.
- Utilizar volúmenes cuando los datos deban sobrevivir al ciclo de vida del contenedor.
- Separar la configuración del código de la aplicación cuando sea posible.
- Revisar periódicamente imágenes, contenedores y recursos que ya no sean necesarios.
El objetivo es que los contenedores sean reproducibles, reemplazables y fáciles de gestionar.
IDEAS CLAVE
Resumen
Dockerfile
│
▼
IMAGEN ───────────────► Registro
│
docker run
▼
CONTENEDOR
├────────► PUERTOS
├────────► REDES
└────────► VOLÚMENESUna imagendefine el entorno de ejecución. Un contenedores una instancia creada a partir de esa imagen.
Los puertospermiten publicar servicios, las redespermiten comunicar contenedores y los volúmenespermiten mantener datos fuera del ciclo de vida de un contenedor.
El Dockerfilepermite automatizar la construcción de imágenes y Docker Composepermite definir aplicaciones formadas por varios servicios.
RECURSOS RELACIONADOS
Recursos relacionados
PARA AMPLIAR
Documentación de referencia
Documentación oficial para ampliar los conceptos, consultar comandos y profundizar en el funcionamiento de Docker.