Herramientas

Docker

#cloud#defense

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

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

Terminal window
docker pull nginx
  • Si no indicas etiqueta, se asume latest.
  • Etiquetas: ubuntu:22.04, ubuntu:20.04, etc.

Listar imagenes

Terminal window
docker image ls

Eliminar imagen

Terminal window
docker image rm ubuntu:22.04

Subcomandos utiles:

  • docker image build (construir)
  • docker image history (historial)
  • docker image inspect (detalles)
  • docker image prune (limpiar)

4) Ejecutar contenedores

Sintaxis:

Terminal window
docker run [OPTIONS] IMAGE_NAME [COMMAND] [ARGUMENTS...]

Ejemplo interactivo:

Terminal window
docker run -it helloworld /bin/bash

Opciones comunes:

  • -d ejecutar en background.
  • -it interactivo + pseudo‑TTY.
  • -v /host:/container montar volumen.
  • -p host:container publicar puertos.
  • --rm borrar contenedor al terminar.
  • --name nombre asignar nombre legible.

Listar contenedores:

Terminal window
docker ps
# o todos:
docker ps -a

5) Dockerfiles (instrucciones basicas)

Formato:

INSTRUCTION argumento

Instrucciones esenciales:

  • FROM imagen base.
  • RUN ejecutar comandos en build.
  • COPY copiar archivos al contenedor.
  • WORKDIR definir directorio de trabajo.
  • CMD comando al iniciar contenedor.
  • EXPOSE documentar puerto a publicar.

Ejemplo minimo:

FROM ubuntu:22.04
WORKDIR /
RUN touch helloworld.txt

Build:

Terminal window
docker build -t helloworld .

Ejemplo con Apache:

FROM ubuntu:22.04
RUN apt-get update -y && apt-get install apache2 -y
EXPOSE 80
CMD ["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 -y
RUN apt-get upgrade -y
RUN apt-get install apache2 -y
RUN apt-get install net-tools -y

Despues (2 capas):

RUN apt-get update -y && apt-get upgrade -y && \
apt-get install apache2 -y && apt-get install net-tools

7) Docker Compose

Permite orquestar multiples contenedores con un solo archivo docker-compose.yml.

Comandos comunes:

  • docker-compose up
  • docker-compose start
  • docker-compose down
  • docker-compose stop
  • docker-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=helloword
networks:
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 nginx
    docker run -d --name web -p 80:80 nginx
  • Listar y limpiar imagenes:
    Terminal window
    docker image ls
    docker 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 latest en 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

  1. TryHackMe — Intro Docker: https://tryhackme.com/room/introtodockerk8pdqk
  2. TryHackMe — Intro Containerisation: https://tryhackme.com/room/introtocontainerisation
  3. Linux Fundamentals (THM): https://tryhackme.com/module/linux-fundamentals
  4. Docker Docs: https://docs.docker.com/
  5. Docker run reference: https://docs.docker.com/engine/reference/run/