Docker
Docker es una plataforma y motor de contenedores para empaquetar, distribuir y ejecutar aplicaciones como imagenes y contenedores de forma portable y reproducible.
Definicion
Docker es una plataforma y motor de contenedores para empaquetar, distribuir y ejecutar aplicaciones como imagenes y contenedores de forma portable y reproducible.
Contexto
- La contenerizacion empaqueta app + dependencias para evitar conflictos de entorno.
- Docker se integra con flujos DevOps/CI/CD y orquestadores como Kubernetes.
- Conceptos base y contexto: Virtualization Fundamentals - Hypervisors, Containers, Kubernetes.
- Hardening y defensa: Container Hardening (Docker).
Desarrollo (MIT-style)
1) Conceptos base
- Imagen: plantilla con filesystem y dependencias.
- Contenedor: instancia en ejecucion de una imagen.
- Dockerfile: instrucciones para construir imagen.
- Docker Engine: API/daemon en el host que ejecuta contenedores.
2) Sintaxis basica (familias de comandos)
- Ejecutar contenedores (p. ej.,
docker run). - Gestion/inspeccion de contenedores (p. ej.,
docker ps). - Administrar imagenes (
docker image ls,pull,rm,build). - Estadisticas/info del daemon (segun necesidad).
3) Gestion de imagenes
Pull
docker pull nginx- Si no indicas etiqueta, se asume
latest. - Etiquetas:
ubuntu:22.04,ubuntu:20.04, etc.
Listar imagenes
docker image lsEliminar imagen
docker image rm ubuntu:22.04Subcomandos utiles:
docker image build(construir)docker image history(historial)docker image inspect(detalles)docker image prune(limpiar)
4) Ejecutar contenedores
Sintaxis:
docker run [OPTIONS] IMAGE_NAME [COMMAND] [ARGUMENTS...]Ejemplo interactivo:
docker run -it helloworld /bin/bashOpciones comunes:
-dejecutar en background.-itinteractivo + pseudo‑TTY.-v /host:/containermontar volumen.-p host:containerpublicar puertos.--rmborrar contenedor al terminar.--name nombreasignar nombre legible.
Listar contenedores:
docker ps# o todos:docker ps -a5) Dockerfiles (instrucciones basicas)
Formato:
INSTRUCTION argumentoInstrucciones esenciales:
FROMimagen base.RUNejecutar comandos en build.COPYcopiar archivos al contenedor.WORKDIRdefinir directorio de trabajo.CMDcomando al iniciar contenedor.EXPOSEdocumentar puerto a publicar.
Ejemplo minimo:
FROM ubuntu:22.04WORKDIR /RUN touch helloworld.txtBuild:
docker build -t helloworld .Ejemplo con Apache:
FROM ubuntu:22.04RUN apt-get update -y && apt-get install apache2 -yEXPOSE 80CMD ["apache2ctl", "-D","FOREGROUND"]6) Optimizacion de Dockerfiles
- Instalar solo lo esencial.
- Limpiar cache (APT, docs) para reducir tamano.
- Usar bases minimalistas (p. ej., Alpine).
- Reducir capas: encadenar comandos
RUN.
Antes (5 capas):
RUN apt-get update -yRUN apt-get upgrade -yRUN apt-get install apache2 -yRUN apt-get install net-tools -yDespues (2 capas):
RUN apt-get update -y && apt-get upgrade -y && \ apt-get install apache2 -y && apt-get install net-tools7) Docker Compose
Permite orquestar multiples contenedores con un solo archivo docker-compose.yml.
Comandos comunes:
docker-compose updocker-compose startdocker-compose downdocker-compose stopdocker-compose build
Instrucciones frecuentes en docker-compose.yml:
version,services,build,image,ports,volumes,environment,networks.
Ejemplo basico:
version: '3.3'services: web: build: ./web networks: - ecommerce ports: - '80:80' database: image: mysql:latest networks: - ecommerce environment: - MYSQL_DATABASE=ecommerce - MYSQL_USERNAME=root - MYSQL_ROOT_PASSWORD=hellowordnetworks: ecommerce:8) Docker Socket (docker.sock)
Docker opera en modelo cliente/servidor:
- Cliente envia comandos.
- Servidor/daemon ejecuta acciones via socket.
Riesgo: si expones el socket sin control, un atacante puede crear/detener/inspeccionar contenedores y obtener control del host.
Ejemplos
- Nginx:
Terminal window docker pull nginxdocker run -d --name web -p 80:80 nginx - Listar y limpiar imagenes:
Terminal window docker image lsdocker image rm ubuntu:22.04 - Build local:
Terminal window docker build -t helloworld .
Pitfalls / Errores comunes
- Asumir que contenedor = VM (aislamiento limitado).
- Publicar puertos innecesarios (
-p) o montar volumes sensibles. - Dejar el docker.sock expuesto.
- Dockerfiles inflados con paquetes innecesarios.
- Usar
latesten prod sin control de version.
Diagrama
flowchart LR C[Docker Client] --> S[docker.sock] S --> D[Docker Daemon] D --> I[Imagen] D --> CT[Contenedor]
Referencias
- TryHackMe — Intro Docker: https://tryhackme.com/room/introtodockerk8pdqk
- TryHackMe — Intro Containerisation: https://tryhackme.com/room/introtocontainerisation
- Linux Fundamentals (THM): https://tryhackme.com/module/linux-fundamentals
- Docker Docs: https://docs.docker.com/
- Docker run reference: https://docs.docker.com/engine/reference/run/