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:

docker info

3. Gestión de Imágenes

Descargar imágenes

docker pull nginx:latest
docker pull mysql:8

Inspección

docker inspect nginx
docker history nginx

Limpieza

docker image prune -a

Creación avanzada de Dockerfile

Ejemplo optimizado:

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

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

Límites de recursos:

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

5. Redes Docker

Tipos:

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

Crear red:

docker network create red_interna

Comunicación entre contenedores:

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:

docker volume create datos_mysql

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

Verificar:

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
  phpinfo();
?>

docker-compose.yml:

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:

docker compose up -d

Acceso: http://localhost:8080

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

docker-compose.yml:

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:

docker compose ps
docker compose logs
docker compose down -v

Escalado:

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:

RUN useradd appuser
USER appuser

11. Monitorización

docker stats

Herramientas:

  • Portainer
  • Prometheus
  • Grafana

12. Actividades Resueltas

Actividad 1

Crear un servidor Apache con volumen persistente.

Solución:

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

Actividad 2

Desplegar MySQL con contraseña segura.

Solución:

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:

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:

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.