Docker
Docker
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.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.
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.
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.
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.
Rápido, generalmente en
Inicio Más lento, puede tomar minutos.
segundos.
Excelente, proporciona un
Aislamiento Bueno, pero menor que las VMs.
aislamiento completo.
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.
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.
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.
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.
17. Docker 6
contenedores.
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.
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.
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.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:
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.
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: EXPOSE 80
7. ADD : Copia archivos, directorios o archivos remotos desde src y los agrega al
sistema de archivos de la imagen en dest .
17. Docker 10
que se pueden sobrescribir desde la línea de comando cuando se inicia el
contenedor.
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.
12. WORKDIR : Establece el directorio de trabajo para cualquier instrucción RUN , CMD ,
ENTRYPOINT , COPY y ADD que se ejecute en la imagen.
13. ARG: Define una variable que los usuarios pueden pasar en tiempo de
construcción con el comando docker build .
descendiente. Es útil para imágenes que se van a usar como bases de otras
imágenes.
15. STOPSIGNAL : Establece la señal del sistema que se enviará al contenedor para
salir.
17. Docker 11
# Usar una imagen base
FROM python:3.8
# Instalar dependencias
RUN pip install -r [Link]
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.
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
# Autor/Mantenedor de la imagen
LABEL maintainer="developer@[Link]"
17. Docker 13
# Crear y establecer el directorio de trabajo
WORKDIR /app
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.
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:
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:
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. 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).
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.
docker ps
docker ps -a
4. docker stop
Uso: Detiene uno o más contenedores en ejecución.
5. docker start
Uso: Levanta un contenedor ya creado.
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.
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
17. Docker 18
docker volume create : Crea un volumen para almacenamiento persistente.
Ejemplo Combinado
Supongamos que deseas construir y ejecutar una aplicación web en un
contenedor:
1. Construir la Imagen:
2. Ejecutar la Aplicación:
3. Verificar y Detener:
docker ps
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.
/proyecto-react-node
/backend
[Link]
[Link]
...
/frontend
/src
/public
[Link]
...
[Link]
# Imagen base
FROM node:14
17. Docker 20
WORKDIR /usr/src/app
# Instalar dependencias
COPY package*.json ./
RUN npm install
# Imagen base
FROM node:14
# Instalar dependencias
COPY package*.json ./
RUN npm install
17. Docker 21
RUN npm install -g serve
# Exponer el puerto
EXPOSE 5000
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
17. Docker 22
mongodb : Utiliza la imagen oficial de MongoDB y expone el puerto 27017.
docker-compose up --build
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.
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.
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.
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.
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.
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.
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
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.
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.
/proyecto-docker-compose
/web
Dockerfile
[Link]
[Link]
[Link]
[Link]
17. Docker 30
const express = require('express');
const mysql = require('mysql');
const app = express();
const port = 3000;
[Link]();
[Link](port, () => {
[Link](`Aplicación escuchando en <[Link]
>:${port}`);
});
FROM node:14
WORKDIR /usr/src/app
17. Docker 31
COPY package*.json ./
COPY . .
EXPOSE 3000
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:
docker-compose up --build
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 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"
}
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
COPY . .
EXPOSE 3000
17. Docker 35
docker run -p 3000:3000 hola-mundo-node
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].
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).
17. Docker 36
docker-compose up
contenedores futuros.
version: '3.8'
services:
db:
image: postgres
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
17. Docker 37
version: '3.8'
services:
app:
image: my-app
volumes:
- ./local/dir:/container/dir
Swarm.
version: '3.8'
services:
web:
image: my-web-app
deploy:
replicas: 3
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:
version: '3.8'
services:
app:
image: my-app
environment:
- MY_VAR=valor
services:
app:
env_file: .env
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.
Una vez dentro del contenedor, puedes usar comandos como ls /mnt para
ver los archivos en el volumen.
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.
17. Docker 41