Manual Avanzado de Docker

Autor: Material didáctico para Administración de Sistemas Informáticos


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ística Contenedores Máquinas Virtuales
Arranque Segundos Minutos
Consumo Bajo Alto
Kernel Compartido Independiente
Aislamiento Proceso Hardware
Portabilidad Muy alta Media

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ística Volume Bind Mount
Gestión Docker Usuario / Sistema operativo
Ubicación física /var/lib/docker/volumes Cualquier ruta del host
Portabilidad Alta Baja
Seguridad Mejor aislamiento Acceso directo al host
Rendimiento Optimizado por Docker Depende del filesystem
Backups Sencillos Manuales
Uso recomendado Producción Desarrollo / pruebas
Dependencia del host No depende de rutas locales Depende 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

Escenario Recomendación
Bases de datos Volume
Servidores en producción Volume
Desarrollo web Bind Mount
Pruebas rápidas Bind Mount
Copias de seguridad automatizadas Volume
Edición de código en tiempo real Bind 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)

Diego J. Gonzalez

This site uses Just the Docs, a documentation theme for Jekyll.