Semana 9: Docker y Kubernetes I¶
Docker¶
Dockerfile
FROM nginx:1.27.5-alpine
EXPOSE 80
Comandos
docker login #Autenticarse en el docker hub, tienen que tener una cuenta
#En caso de problemas rm ~/.docker/config.json
docker build -t servidorimage . #En la misma carpeta del docker file
docker image ls
docker run
docker run --name servidorcontenedor -p 8080:80 servidorimage
#Meterse a la url localhost:8080
#En caso de problemas
docker rm servidorcontenedor
#servidorimagen y servidorcontenido son nombre arbitrarios
docker run --name servidorcontenedor -p 8080:80 -d servidorimage
#Con esto nos queda corriendo en segundo plano
docker ps #Puedo ver los contenedores que están corriendo
docker ps -a #Puedo ver todos lo contendores (encendido y apagados)
docker stop servidorcontendor #Parar el contedor
docker restart servidorcontenedor #Reiniciar el contenedor
¿Que es docker?¶
Es un servicio de virtualización basado en contenedores, es decir estos utilizan el sistema operativo para administrar recursos, como una aplicación aislada que utiliza los recursos del sistema
Partes de Docker¶
- Docker Engine: Es el núcleo de Docker. Se encarga de construir, ejecutar y gestionar contenedores. Incluye el servidor (daemon), la API REST y la interfaz de línea de comandos (CLI).
- Docker Images: Son plantillas de solo lectura utilizadas para crear contenedores. Contienen el sistema operativo base, las aplicaciones y las dependencias necesarias.
- Docker Containers: Son instancias ejecutables de imágenes de Docker. Funcionan como entornos aislados donde se ejecutan aplicaciones.
- Docker Hub: Es un repositorio en la nube donde los usuarios pueden compartir y almacenar imágenes de Docker. También es posible descargar imágenes públicas.
- Dockerfile: Es un archivo de configuración que define cómo se debe construir una imagen de Docker, especificando instrucciones como el sistema operativo base y las dependencias.
- Docker Compose: Es una herramienta que permite definir y ejecutar aplicaciones de múltiples contenedores mediante un archivo YAML.
- Docker Networking: Proporciona la capacidad de conectar contenedores entre sí y con el mundo exterior, asegurando la comunicación necesaria.
- Docker Volumes: Se utilizan para gestionar el almacenamiento persistente de datos, permitiendo que los contenedores compartan información o guarden datos incluso después de ser eliminados.
Ejercicio¶
Se agregan imagenes y un archivo HTML, por ejemplo
FROM nginx:1.27.5-alpine
# Copiar index.html to the default nginx directory
COPY index.html /usr/share/nginx/html/index.html
COPY principito.png /usr/share/nginx/html/principito.png
#Esto es un ejemplo pilas
EXPOSE 80
#Borrar si es necesario
#docker stop servidorcontainer
#docker rm servidorcontainer
docker build -t servidorimagen .
docker run --name servidorcontainer -p 8080:80 -d servidorimagen
Docker compose¶
Docker Compose es una herramienta que permite definir y gestionar aplicaciones de múltiples contenedores de manera sencilla utilizando un archivo YAML. En este archivo, los desarrolladores pueden especificar los servicios necesarios, las redes, los volúmenes y las configuraciones específicas para cada contenedor. Docker Compose facilita la creación y ejecución de entornos complejos al automatizar la configuración y puesta en marcha de varios contenedores relacionados entre sí.
Usar Docker Compose es importante para la orquestación porque permite coordinar y gestionar múltiples contenedores que trabajan juntos como una unidad. Esto es especialmente útil en aplicaciones modernas que suelen estar compuestas por diversos servicios como bases de datos, servidores web y servicios de backend. Con Docker Compose, se puede garantizar que todos los componentes se inicien en el orden correcto y con las configuraciones necesarias.
La orquestación, en este contexto, se refiere al proceso de gestionar y coordinar múltiples contenedores para que trabajen juntos de manera eficiente y escalable. Por ejemplo, en una aplicación web, podrías tener un contenedor para el frontend, otro para el backend y un tercero para la base de datos. Con Docker Compose, puedes definir cómo se conectan estos servicios, cómo comparten datos y cómo se inician juntos, facilitando el desarrollo y despliegue de la aplicación.
Ejemplo de orquestación con Docker Compose:
Archivo docker-compose.yml:
version: '3.8'
services:
frontend:
image: nginx:1.27.5-alpine
ports:
- "8080:80"
volumes:
- ./frontend:/usr/share/nginx/html
depends_on:
- backend
backend:
image: python:3.9
working_dir: /app
volumes:
- ./backend:/app
command: python app.py
depends_on:
- database
database:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
Este archivo define una aplicación con tres servicios: un servidor web (frontend), un backend en Python y una base de datos PostgreSQL. Docker Compose asegura que la base de datos se levante antes que el backend, y que el backend esté operativo antes de que el frontend se conecte, garantizando una orquestación adecuada. Esto simplifica la gestión de aplicaciones complejas y mejora la productividad del desarrollo.
Ejemplo mysql, postgres y adminer¶
#Rutas
.
├── adminer
│ └── Dockerfile
├── docker-compose.yml
├── mysql
│ └── Dockerfile
└── postgres
└── Dockerfile
Dockerfile mysql¶
FROM mysql:9.3
# Set environment variables
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=mydb
#Port
EXPOSE 3306
#inject sql script
#COPY ./init.sql /docker-entrypoint-initdb.d/
Docker postgres¶
FROM postgres:17
#Environment variables
ENV POSTGRES_USER=postgres
ENV POSTGRES_PASSWORD=postgres
ENV POSTGRES_DB=postgres
#postgres configuration
EXPOSE 5432
Docker adminer¶
FROM adminer:latest
EXPOSE 8080
Docker compose¶
docker-compose.xml
services:
postgres:
build: ./postgres/
ports:
- 5432:5432
container_name: postgres
hostname: pg
mysql:
build: ./mysql/
ports:
- 3306:3306
container_name: mysql
hostname: my
adminer:
build: ./adminer/
ports:
- 8080:8080
container_name: adminer
Comandos para levantarlo¶
# hacer docker image y docker run en cada carpeta o bien
docker compose up -d #Levantar los servers
docker compose down #Bajar los servers
Resumen¶
Docker es una herramienta de virtualización basada en contenedores que permite a los desarrolladores crear, implementar y ejecutar aplicaciones de manera eficiente. Los contenedores son entornos aislados que incluyen todo lo necesario para ejecutar una aplicación, como el sistema operativo, bibliotecas y dependencias. Esto hace que las aplicaciones sean portables y fáciles de gestionar.
Componentes importantes de Docker¶
- Docker Engine: El núcleo que gestiona la construcción y ejecución de contenedores.
- Docker Images: Plantillas de solo lectura usadas para crear contenedores.
- Docker Containers: Instancias ejecutables de las imágenes.
- Docker Hub: Repositorio en la nube para compartir y descargar imágenes.
- Docker Compose: Herramienta para orquestar múltiples contenedores usando un archivo YAML.
- Docker Networking: Facilita la comunicación entre contenedores.
- Docker Volumes: Maneja el almacenamiento persistente de datos.
Uso práctico: Docker Compose¶
Docker Compose facilita la orquestación de aplicaciones complejas al coordinar múltiples contenedores. Un ejemplo típico es una aplicación web que incluye:
- Un servidor web como Nginx (frontend).
- Un servicio backend en Python.
- Una base de datos PostgreSQL.
Ejemplo real: Una startup de e-commerce podría usar Docker Compose para levantar su entorno de desarrollo. Con un solo comando (docker-compose up), podrían iniciar un servidor web para la tienda, un backend que gestione las compras y una base de datos para almacenar información del inventario y clientes. Esto ahorra tiempo y asegura consistencia entre los desarrolladores.
version: '3.8'
services:
frontend:
image: nginx:1.27.5-alpine
ports:
- "8080:80"
backend:
image: python:3.9
command: python app.py
database:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
Motivación para los estudiantes¶
Docker no solo simplifica el desarrollo al garantizar que las aplicaciones funcionen en cualquier entorno, sino que también es una herramienta clave en la industria tecnológica moderna. Por ejemplo, empresas como Netflix y Spotify usan Docker para escalar sus servicios y garantizar disponibilidad global. Aprender a usar Docker y Docker Compose les dará a los estudiantes una ventaja competitiva en el mercado laboral.
Además, al dominar Docker, podrán replicar entornos complejos en sus proyectos personales o colaborativos, reduciendo los tiempos de configuración y aumentando su productividad. ¡Empieza a experimentar con Docker hoy y prepárate para el futuro de la tecnología!