Skip to content

Manual Avanzado de Docker

1. Introducción Técnica

Docker es una plataforma de virtualización basada en contenedores que permite encapsular aplicaciones y servicios junto con sus dependencias, garantizando portabilidad, reproducibilidad y escalabilidad.

Diferencias con máquinas virtuales

CaracterísticaContenedoresMáquinas Virtuales
ArranqueSegundosMinutos
ConsumoBajoAlto
KernelCompartidoIndependiente
AislamientoProcesoHardware
PortabilidadMuy altaMedia

Docker utiliza tecnologías del kernel Linux:

  • Namespaces (aislamiento)
  • Cgroups (control de recursos)
  • UnionFS / OverlayFS

2. Arquitectura Docker

Componentes:

  • Docker Client
  • Docker Daemon (dockerd)
  • Docker Registry
  • Imágenes
  • Contenedores

Flujo: Cliente → API REST → Daemon → Registry

Comando:

bash
docker info

3. Gestión de Imágenes

Descargar imágenes

bash
docker pull nginx:latest
docker pull mysql:8

Inspección

bash
docker inspect nginx
docker history nginx

Limpieza

bash
docker image prune -a

Creación avanzada de Dockerfile

Ejemplo optimizado:

dockerfile
FROM openjdk:21-jdk-slim
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

Buenas prácticas:

  • Usar imágenes slim o alpine.
  • Minimizar capas.
  • Usar .dockerignore.
  • Evitar instalar software innecesario.

4. Gestión de Contenedores

bash
docker ps -a
docker logs contenedor
docker exec -it contenedor /bin/bash
docker stats

Límites de recursos:

bash
docker run -d --memory=512m --cpus=1 nginx

5. Redes Docker

Tipos:

  • bridge (por defecto)
  • host
  • none
  • overlay

Crear red:

bash
docker network create red_interna

Comunicación entre contenedores:

bash
docker run -d --name web --network red_interna nginx
docker run -it --network red_interna busybox ping web

6. Volúmenes y Persistencia

Tipos:

  • volume
  • bind mount
CaracterísticaVolumeBind Mount
GestiónDockerUsuario / Sistema operativo
Ubicación física/var/lib/docker/volumesCualquier ruta del host
PortabilidadAltaBaja
SeguridadMejor aislamientoAcceso directo al host
RendimientoOptimizado por DockerDepende del filesystem
BackupsSencillosManuales
Uso recomendadoProducciónDesarrollo / pruebas
Dependencia del hostNo depende de rutas localesDepende de rutas absolutas

Ejemplo MySQL persistente:

bash
docker volume create datos_mysql

docker run -d \
 --name mysql \
 -e MYSQL_ROOT_PASSWORD=asir \
 -v datos_mysql:/var/lib/mysql \
 mysql:8

Verificar:

bash
docker volume inspect datos_mysql

Recomendación práctica

EscenarioRecomendación
Bases de datosVolume
Servidores en producciónVolume
Desarrollo webBind Mount
Pruebas rápidasBind Mount
Copias de seguridad automatizadasVolume
Edición de código en tiempo realBind Mount

7. Servidor Web con Docker (Nginx + PHP)

Estructura:

web/
 ├── docker-compose.yml
 └── html/index.php

index.php:

php
<?php
  phpinfo();
?>

docker-compose.yml:

yaml
version: "3.9"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
  php:
    image: php:8-fpm
    volumes:
      - ./html:/var/www/html

Ejecución:

bash
docker compose up -d

Acceso: http://localhost:8080

8. Servidor de Bases de Datos (MySQL + Adminer)

docker-compose.yml:

yaml
version: "3.9"
services:
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: asir
      MYSQL_DATABASE: empresa
    volumes:
      - dbdata:/var/lib/mysql
  adminer:
    image: adminer
    ports:
      - 8081:8080
volumes:
  dbdata:

Acceso Adminer: http://localhost:8081

9. Docker Compose Avanzado

Comandos:

bash
docker compose ps
docker compose logs
docker compose down -v

Escalado:

bash
docker compose up -d --scale web=3

10. Seguridad

  • No usar root.
  • Escanear imágenes.
  • Limitar puertos.
  • Usar secretos.
  • Firewall (UFW).

Ejemplo usuario no root:

dockerfile
RUN useradd appuser
USER appuser

11. Monitorización

bash
docker stats

Herramientas:

  • Portainer
  • Prometheus
  • Grafana

12. Actividades Resueltas

Actividad 1

Crear un servidor Apache con volumen persistente.

Solución:

bash
docker run -d -p 8082:80 -v apache_data:/usr/local/apache2/htdocs httpd

Actividad 2

Desplegar MySQL con contraseña segura.

Solución:

bash
docker run -d \
 -e MYSQL_ROOT_PASSWORD=asir2025 \
 -v mysql_data:/var/lib/mysql \
 mysql:8

Actividad 3

Red interna entre web y base de datos.

Solución:

bash
docker network create red_app

docker run -d --name db --network red_app mysql:8
docker run -d --name web --network red_app nginx

Actividad 4

Aplicación completa con Compose.

Solución:

yaml
version: "3.9"
services:
  web:
    image: nginx
    ports:
      - "8090:80"
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: asir

13. Referencias

  • Docker Docs
  • Docker Hub
  • Kubernetes (Introducción futura)

Publicado bajo la licencia MIT.