Introducción

Docker

Objetivos de este tema


  • Entender qué es docker
  • Crear contenedores
  • Crear Imágenes
  • Trabajar con entornos dockerizados para desarrollo
  • Crear imágenes con DockerFile
  • Crear servicios con docker compose
Referencias

Fuentes de Información


Resumen de un poco de historia
El desarrollo de Docker comenzó en 2010 , impulsado por Solomon Hykes , quien trabajaba como ingeniero en una empresa que más tarde se renombraría como Docker Inc .
Ahí se creó inicialmente Docker como una plataforma de contenedores , y con el tiempo se convirtió en una tecnología y una marca ampliamente reconocida para la virtualización basada en contenedores , algo que después de 2013 cuando Solomon lo presentó en una conferencia al munso, cambió totalmente el enfoque del desarrollo.
Solomon Hykes dejó Docker Inc. en 2018 para centrarse en nuevos proyectos.
En 2017, Docker Inc. lanzó el Moby Project , un proyecto de código abierto que descompone Docker en varios componentes modulares y reutilizables.
El objetivo de Moby es permitir a los desarrolladores utilizar estos componentes de manera independiente para crear sus propias soluciones de contenedores personalizadas. En este proyecto, se desglosó Docker en componentes más pequeños y reutilizables
Actualmente, Docker sigue existiendo como un producto comercial y una plataforma completa que integra estos componentes en un paquete fácil de usar para crear y gestionar contenedores.
En otras palabras, Docker es la plataforma que los usuarios finales utilizan para trabajar con contenedores, mientras que Moby funciona como un conjunto de herramientas de código abierto que sirve como base de Docker y permite a los desarrolladores crear soluciones a medida.

Referencias

Fuentes de Información


Historia de Docker: Innovación y Comunidad en la Contenerización

La historia de Docker es un proceso de innovación y colaboración que ha incidido de forma muy clara y contundente en el mundo del desarrollo de software, popularizando el uso de contenedores.

Orígenes y dotCloud (2008)

Docker tuvo sus orígenes en 2008 como un proyecto interno dentro de dotCloud , una empresa de plataforma como servicio fundada por Solomon Hykes .

Su objetivo era mejorar la eficiencia y portabilidad de las aplicaciones al empaquetarlas en contenedores que pudieran ejecutarse de forma consistente en diferentes entornos.

Lanzamiento Público de Docker (2013)

En 2013, Docker fue presentado al público y se lanzó como software de código abierto bajo la licencia Apache 2.0.

Esta decisión fue clave, ya que permitió el crecimiento de una comunidad global en torno a Docker, impulsando su desarrollo y su adopción.

La facilidad con la que los contenedores Docker podían crearse y desplegarse ayudó a que se convirtiera en una herramienta popular entre desarrolladores y empresas.

El día de la presentación de Salomon Hykes Una reacción a la Presentación

Proyecto Moby (2017): Modularización y Flexibilidad

Para modularizar y estandarizar la construcción de sistemas de contenedores, en 2017 Docker, Inc. lanzó el Proyecto Moby .

Moby Project es una plataforma abierta que proporciona componentes básicos para crear soluciones personalizadas de contenerización.

Docker sigue siendo la implementación más popular basada en Moby, pero Moby en sí mismo permite que otros desarrolladores construyan sus propias versiones y herramientas adaptadas a necesidades específicas.

Docker como Producto Comercial

Docker, Inc. ha desarrollado Docker como un producto comercial que incluye herramientas avanzadas y soporte técnico, facilitando la adopción y administración de contenedores en entornos empresariales.

Esta versión comercial se complementa con una comunidad de código abierto, lo que permite que Docker sea accesible tanto para individuos como para grandes empresas.

Impacto de la Comunidad y Ecosistema de Código Abierto

La comunidad de desarrolladores ha sido fundamental en la evolución de Docker. Contribuciones de código, mejoras de rendimiento y soluciones innovadoras aportadas por la comunidad global han consolidado a Docker como la tecnología de contenedorización líder en la actualidad.

La adopción de Docker ha sido tal que se ha convertido en un estándar para el empaquetado y despliegue de aplicaciones .

Popularización de Contenedores e Integración con Kubernetes

Docker popularizó la idea de los contenedores, transformándolos en una forma eficiente de empaquetar y distribuir aplicaciones.

Su integración con otras tecnologías, especialmente Kubernetes , ha permitido crear ecosistemas de contenedores más complejos y escalables, adecuados para entornos de microservicios y despliegues en la nube.

El Futuro de Docker

Docker continúa evolucionando y adaptándose a las tendencias emergentes, como la computación en la nube y el edge computing .

A medida que el desarrollo de software se orienta cada vez más hacia infraestructuras dinámicas y escalables, Docker se posiciona como una tecnología clave en la implementación de aplicaciones modernas.

1 - Conceptos sobre docker

Objetivos

Conceptos que se adquirirán aquí


  • Qué es docker
  • Imágenes Vs Contenedores
  • Obtener una imagen: run, pull, search
  • Crear un contenedor: create, start, stop, rm, run
  • Arrancar un contenedor: start, run
  • Detener un contenedor: stop
  • Eliminar un contenedor vs Imagenes: rm, rmi
  • Visualizar imágenes y contenedores: images, ps, ps -a
  • Mapear puertos y volúmenes: -p, -v
  • Crear una imagen a partir de un contenedor: commit, build
Docker
Docker es una plataforma de virtualización basada en contenedores.
Docker
La idea de Docker es ejecutar una o varias aplicaciones en **entornos aislados** (es decir, una forma de virtualizar). Esto facilita su despliegue y portabilidad.
  • PUNTOS FUNDAMENTALES

  • La idea es tener un contenedor (un paquete ejecutable) que contiene todo lo necesario para ejecutar una aplicación, incluyendo el código, las dependencias y las configuraciones, de forma totalmente aislada del sistema en el cual se está ejecutando. Esto permite que la aplicación se ejecute de manera consistente en cualquier entorno.

  • Este archivo contenedor no incluye un sistema operativo completo propio , pero funciona como si lo tuviera, ejecutándose de forma aislada e independiente del sistema anfitrión .

    Utiliza el kernel del anfitrión y configura los componentes necesarios para simular el entorno del sistema operativo deseado o requerido, aunque siempre dentro del tipo de sistema operativo del anfitrión.

  • Compatibilidad de sistema operativo : Los contenedores dependen del sistema anfitrión, por lo que los contenedores Linux solo se ejecutan en anfitriones Linux.

    Sin embargo, gracias a tecnologías comoc WSL y Hyper-V , es posible ejecutar contenedores Linux en Windows.

    También existen soluciones emergentes para ejecutar contenedores de Windows en Linux, aunque con limitaciones.

Docker ejecutándose bajo el kernel

Resumen
En sistemas Windows necesitas un “puente” que proporcione un kernel Linux, porque los contenedores siempre dependen de un kernel del mismo tipo que fueron creados.

El proceso de empaquetado

En Docker, el proceso de empaquetado agrupa el código fuente y todas las dependencias necesarias para que el software funcione, creando una entidad unificada en forma de archivo de contenedor.

Para crear un contenedor necesitamos partir de una plantilla base que contenga lo necesario para este entorno de ejecución aislada. Esta plantilla la conocemos como imagen

Un contenedor es, en esencia, una instancia ejecutable que virtualiza el software dentro de un entorno específico.

A partir de un contenedor, se pueden crear imágenes en cualquier momento, permitiendo así capturar el estado del entorno y los cambios realizados.

Creación y actualización de contenedores

A partir de una imagen específica, es posible iniciar un contenedor de forma muy rápida, en cuestión de segundos o menos.

Si realizamos cambios en el contenedor, estos se guardan en capas incrementales, lo que permite visualizar los cambios y restaurar versiones anteriores del entorno, si es necesario.

2 - Instalación

Objetivos

Qué veremos aquí


  • Instalar docker en ubuntu
  • Instalar docker en windows
  • Instalar docker con vagrant

Referencias para instalar ubuntu

Instalar Docker

Páginas oficiales


Proceso de instalación en Ubuntu

  1. Paquetes necesarios durante la instalación : usaremos certificados (ca-certificates) . Descargamos con curl , usaremos claves públicas y privadas (gnupg-agent) y conoceremos la versión de nuestro sistema (lsb-release) , lo que nos permitirá hacer una instalación genérica.
1
sudo apt-get install ca-certificates curl gnupg-agent lsb-release
  1. Añadimos la clave GPG oficial de Docker
1
2
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. Añadimos el repositorio stable (Proporciona últimas versiones). Otras opciones (modificar stable por la opción deseada):

    • test : Versiones listas para probar.
    • nightly : Actualizaciones de la próxima versión.
1
2
3
4
5
echo \
"deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Actualizamos el índice de los paquetes apt e instalamos Docker : el cliente de Docker docker-ce-cli, el demonio de Docker docker-ce y el runtime de contenedores que gestiona su ejecución containerd.io. La construcción y administración de contenedores e imágenes la gestiona el demonio docker-ce.
1
2
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. Agregamos el usuario actual al grupo de Docker (para poder usar Docker sin sudo), de lo contrario, no podremos hacerlo:
1
sudo usermod -aG docker $USER
  1. Cambiamos al grupo de Docker en la sesión actual. Nota: para que el cambio aplique a otras sesiones, será necesario cerrar sesión o reiniciar.
1
newgrp docker
  1. Probamos la instalación listando los comandos disponibles de Docker:
1
docker help

Instalación de Docker en Windows

  1. Descargar Docker Desktop Installer : Para instalar Docker en Windows, descarga el fichero Docker Desktop Installer.exe y ejecútalo. También puedes usar el siguiente comando en la línea de comandos:

    1
    
    Start-Process '.\Docker Desktop Installer.exe' install

    Docker no se instala directamente sobre Windows. Necesita una capa de virtualización ya que Docker corre sobre Linux.

  2. Opciones de virtualización : Durante la instalación, elige entre Hyper-V o WSL.

    • Si dockerizarás sistemas Windows, usa Hyper-V.
    • Para otros casos, se recomienda WSL por eficiencia. Ésta debe de ser la opción seleccionada en nuestro caso.

    Más información en la documentación oficial de Docker.


Arrancar el Servicio

  1. Activar Docker Desktop : Tras la instalación, Windows no activa Docker automáticamente. Debes hacerlo manualmente:
    • Busca la aplicación Docker Desktop y ejecútala.
    • La primera vez, Docker te informará sobre el uso gratuito para pequeñas empresas.
    • Una vez abierta puedes configurarla para que se arranque automáticamente cada vez que arranque el sistema

Crear contenedores de Windows

  1. Configuración para contenedores de Windows : Para crear contenedores de Windows, necesitas activarlos en el demonio.

    • Ve al servicio Docker y abre el menú contextual.
    • Selecciona la opción switch to Windows containers….

    En este curso, no configuraremos contenedores de Windows.


Interfaz Gráfica en Windows

  1. Uso de la interfaz gráfica : Docker Desktop en Windows proporciona una interfaz gráfica para gestionar contenedores, imágenes y configuraciones de manera visual.
  2. En cualquier caso, recomendamos que abras un power shell en windows y realices las acciones en el terminal.

Configuración de Docker Desktop

  1. Personalización de Docker Desktop : Docker Desktop permite ajustar configuraciones avanzadas para personalizar el rendimiento y los recursos asignados.

3 - Contenedores e imágenes

Contenedores e imágnes

Imagen y contenedor en docker

La imagen

la imagen
La imagen es un archivo que contiene todas las librerías, dependencias y configuraciones necesarias para ejecutar un entorno aislado con sus propios servicios y procesos. Sirve como base para crear uno o varios contenedores, los cuales obtendrán configuraciones de red y direcciones IP independientes al momento de su creación.

El contenedor

El contenedor es una capa de lectura y escritura que se añade a una imagen, permitiendo interactuar con ella y ponerla en ejecución.

Imagen obtenida de https://iesgn.github.io/curso_docker_2021/sesion2/organizacion.html

Contenedor e imagen

La unión hace la fuerza

El funcionamiento de Docker se basa en crear un contenedor a partir de una imagen, por lo que los conceptos de imagen y contenedor están intrínsecamente relacionados (no se pueden usar de manera individual).

Compentes de la arqutectura docker

Descripcion de la imagen

Cliente de Docker:

  • Docker CLI permite ejecutar comandos para interactuar con Docker,
  • Docker Compose ** se utiliza para definir y manejar aplicaciones de múltiples contenedores.
  • Docker Engine Envía comandos al motor de Docker para su ejecución.

Docker Engine:

Compuesta por Docker Engine API y Docker daemon ,los cuales son componentes fundamentales del motor de Docker. * Docker Engine API es la interfaz de comunicación entre el cliente y el motor. * Docker daemon gestiona los contenedores y las imágenes.

Podemos ver en la imagen, áreas para imágenes y contenedores , donde queda explícito que Docker Engine se encarga de manejar tanto las imágenes como la ejecución de los contenedores.

  • Container Runtime es el entorno en el que los contenedores se ejecutan.

Docker Registry:

Docker Register API ** y Repositorio de imágenes , que podemos considerar componentes esperados en esta sección.

  • Docker Registry ** es el servicio para almacenar y distribuir imágenes de contenedores, siendo Docker Hub es un ejemplo de un registro público.
  • Repositorio de imágenes muestra en su relación con Docker Engine quien puede extraer y subir imágenes este repositorio

4 - Docker en línea de comandos

Docker

Actuando en el terminal


  • Cómo usar docker en línea de comandos
  • Crear contenedores
  • Descargar imágenes
  • Modificar contenedores y persistirlos en imágenes
  • Usar contenedores
  • Subir a docker hub imágenes

1. Obteniendo una Imagen

Obtención de Imágenes
Las imágenes en Docker son las bases para crear contenedores .
Puedes obtener diferentes versiones de una imagen usando etiquetas.
Comandos a estudiar


  • docker pull
  • docker images
  • docker search
  1. Descarga una imagen :

    1
    
    docker pull ubuntu:latest
    En este caso estamos descargando una imagen llamada ubuntu en su versión más reciente ( latest ).

  2. Ver imágenes disponibles :

    1
    
    docker images

  3. Consultar ayuda :

    1
    
    docker help images

  4. Buscar imágenes

Buscar todas las imágenes que contengan ubuntu cuya distribución empiece por 1

1
  docker search ubuntu:1


2. Estados del Contenedor

Antes de empezar con los comandos, es importante tener muy claro los estados que puede tener un contenedor , ya que nos ayudará a entender qué estamos haciendo en un momento determinado con un contenedor y por qué podemos realizar ciertas acciones y no otras.

Por ejemplo, no podremos ejecutar comandos en un contenedor si este no está en el estado running o en estado de ejecución.

Estados del Contenedor
Un contenedor en Docker puede estar en los siguientes estados:

Estados de un contenedor

  • Created : El contenedor ha sido creado, pero aún no se está ejecutando.
  • Running : El contenedor está activo y operativo.
  • Paused : El contenedor está en pausa, con todos los procesos detenidos, pero puede reanudarse.
  • Stopped : El contenedor se detuvo de manera controlada.
  • Exited : Similar al estado "stopped", pero indica que el contenedor terminó de manera inesperada.
  • Deleted : El contenedor ha sido eliminado y ya no está disponible.

Para ver los estados de cada contenedor:

1
docker ps -a

Para ver los contenedores que actualmente están en estado Running o Up :

1
docker ps

Los estados se irán comentando según avancemos con los comandos.


2. Crear un Contenedor

contenedor
Un contenedor es una instancia ejecutable de una imagen, que contiene todo el entorno necesario para correr aplicaciones de forma aislada. El comando **create** tiene varias opciones, pero no lo vamos a utilizar, no obstante lo comentamos
Comandos a estudiar


  • docker create
  • docker start
  • docker run

  1. Crear contenedor :
  • El comando docker create permite crear contenedores sin ejecutarlos inmediatamente .

1
2
3
docker create --name ls ubuntu:latest ls
docker create -i -t --name bash ubuntu:latest bash
docker create --name update ubuntu:latest apt-get update
Un contenedor en estado created, no puede ejecutar nada, tenemos que hacerlo usando start para pasarlo a estado up o running

Observa la siguiente secuencia 1de comandos y entiéndela


3. Crear un contenedor con run

docker run
Permite crear un contenedor a partir de una imagen y ponerlo en ejecución En caso de que la imagen no esté descargada, la descarga automáticamente

  • Este es uno de los comandos que más vamos a utilizar
  • Es un comando que tiene muchas opciones, puedes verlas con el comando help
    docker help run
    

3. Ejecutando y Administrando Contenedores

  1. Ver contenedores creados :

    1
    
    docker ps -a

  2. Ejecutar contenedores creados :

  • Para ejecutar un contenedor creado, usa el comando docker start con opciones para ver su salida en consola.
1
2
3
docker start -a ls
docker start -i bash
docker start -a update

Como vemos, con docker start , inicio un contenedor en estado creado ( created ).

Con el uso de las opciones -a (adjuntar salida) y -i (entrada interactiva) puedo interactuar con el contenedor al iniciarlo.

En el apartado 5, vemos cómo ejectuar comandos en un contenedor que esté en estado running o up (ver estados del contenedor e el apartado siguiente)


5. Ejecución de Comandos en el Contenedor

  1. Ejecutar comandos con docker exec :

    • Usa docker exec para ejecutar comandos en un contenedor que ya esté en ejecución.
    1
    
    docker exec -ti web bash

6. Forward de Puertos

docker run -p XXXX:XXXX

  1. Redireccionamiento de puertos entre anfitrión y contenedor :

    • Para acceder al servidor web desde la red, configura un puerto en el anfitrión que redirija al puerto 80 del contenedor.
    1
    
    docker run -ti -p 8080:80 --name web ubuntu:latest

7. Compartiendo Carpetas

Mapeo de Directorios
Puedes mapear una carpeta local en el directorio de trabajo del contenedor para compartir archivos.

  1. Crear un volumen compartido :
    1
    
    docker run -ti -p 8080:80 --name web -v /home/usuario/docker:/var/www/html ubuntu:latest

Si la carpeta no existe, Docker la crea automáticamente.


8. Crear una Imagen desde un Contenedor

Crear imagen desde contenedor
Para conservar el estado de un contenedor y replicarlo, crea una imagen con `docker commit`.
  1. Crear imagen :
    1
    
    docker commit container_name nombre_imagen:tag

9. Comandos para Manejar Volúmenes

  1. Crear y administrar volúmenes :

    • Comandos útiles para gestionar volúmenes en Docker:
    1
    2
    3
    4
    
    docker volume create [nombre]
    docker volume ls
    docker volume inspect nombre
    docker volume rm nombre

Los volúmenes permiten persistir datos y compartirlos entre contenedores o con el sistema anfitrión.

9. Otros Comandos Importantes en Docker

  1. Comandos útiles en Docker : Existen varios comandos para gestionar contenedores e imágenes. Aquí algunos de los más importantes:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    docker inspect
    docker pause
    docker unpause
    docker rm
    docker stop
    docker rmi
    docker login
    docker push
    docker pull
    docker import
    docker export

    Para obtener ayuda detallada sobre cada comando:

    1
    
    docker help


10. Inspección de Contenedores

Comando inspect
El comando `docker inspect` proporciona información detallada del contenedor, como directorios mapeados y puertos abiertos.
  1. Inspeccionar un contenedor :

    1
    
    docker inspect [opciones] nombre_contenedor

    Nota: Con la opción -s, obtienes información adicional sobre el tamaño de los archivos.


11. Pausar y Reiniciar un Contenedor

  1. Pausar y reanudar : Los comandos docker pause y docker unpause congelan y reinician un contenedor en un estado específico.

    1
    2
    
    docker pause
    docker unpause

    Práctica: Arranca un contenedor, abre un terminal y pausa el contenedor. Observa cómo afecta el terminal y reanúdalo.


12. Borrar un Contenedor

  1. Detener y borrar contenedores :

    • docker stop tiene una opción -t para especificar el tiempo de espera antes de detener el contenedor.
    1
    2
    
    docker stop [opciones]
    docker rm [opciones]

    Nota: pause y stop no son lo mismo. pause detiene momentáneamente el contenedor sin interrumpir el proceso, mientras que stop finaliza la ejecución.


13. Borrar Todos los Contenedores

  1. Comando para borrar múltiples contenedores :

    1
    2
    
    docker stop $(docker ps -a -q)
    docker rm $(docker ps -a -q)

    En PowerShell, utiliza paréntesis en lugar de $().


14. Ver Imágenes y Borrarlas

Gestión de Imágenes
Para borrar una imagen, no debe tener contenedores asociados, independientemente de su estado.
  1. Comandos para imágenes :

    1
    2
    
    docker images
    docker rmi nombre_imagen

15. Exportar e Importar Imágenes

Exportación e Importación de Imágenes
Los comandos `docker export` y `docker import` permiten guardar una imagen en un archivo `.tar` y restaurarla posteriormente.
  1. Exportar un contenedor a un archivo tar :

    1
    
    docker export -o web.tar web
  2. Importar una imagen desde un archivo :

    1
    
    docker import web.tar

    Ejercicio: Exporta el contenedor web a un archivo tar, revisa su tamaño, y crea una imagen web:v2 a partir del archivo.


16. Trabajando con Docker Hub

Docker Hub
Docker Hub permite almacenar, compartir y descargar imágenes de contenedores.
  1. Comandos esenciales para Docker Hub :

    1
    2
    3
    4
    
    docker login
    docker search
    docker pull nombre_imagen
    docker push nombre_imagen

17. Creando una Cuenta y Usando Docker Hub

  1. Crear una cuenta en Docker Hub :

    • Puedes descargar imágenes sin cuenta usando docker pull o docker run.
    • Inicia sesión con docker login para subir tus propias imágenes.
  2. Subir imágenes al repositorio :

    • Usa docker push para subir una imagen. Recuerda: el nombre de usuario debe ser parte del nombre de la imagen.

18. Estadísticas de Contenedores

docker stats
El comando `docker stats` muestra estadísticas en tiempo real del uso de recursos por los contenedores.
  1. Ver estadísticas de todos los contenedores activos :
    1
    
    docker stats

19. Espacio en Disco

docker system df
El comando `docker system df` proporciona información sobre el uso de disco por imágenes, contenedores y volúmenes.
  1. Revisar el uso de disco por Docker :
    1
    
    docker system df

20. Logs de Contenedores

docker logs
Con `docker logs`, puedes revisar los registros de un contenedor para solucionar problemas o revisar su estado.
  1. Ver logs de un contenedor específico :
    1
    
    docker logs container_name

Nota: Usa --tail para ver solo las últimas líneas.


21. Gestión de Redes

docker network
Docker permite gestionar redes personalizadas para conectar contenedores.
  1. Listar redes disponibles :

    1
    
    docker network ls

  2. Crear una red personalizada :

    1
    
    docker network create my_custom_network


22. Renombrar Contenedores

docker rename
Usa `docker rename` para renombrar un contenedor existente.
  1. Renombrar un contenedor :
    1
    
    docker rename old_name new_name

23. Limpieza de Recursos

docker system prune
El comando `docker system prune` elimina contenedores, imágenes y volúmenes que no se estén utilizando.
  1. Ejecutar limpieza de recursos :
    1
    
    docker system prune -f

Nota: Añade la opción --volumes para eliminar también volúmenes.

5 - Fichero de ejecución para crear imágenes DockerFile

Dockerfile
Un Dockerfile es un fichero de texto que contiene una serie de instrucciones para crear una imagen de Docker.
Este fichero tiene un formato específico y necesita, como mínimo, la instrucción FROM para indicar la imagen base a partir de la cual construiremos nuestra propia imagen personalizada.

Construcción del Dockerfile

img_1.png Para ejecutar las instrucciones del Dockerfile, utilizamos el comando docker build :

1
docker build [OPTIONS] PATH | URL | -

Podemos usar la opción PATH para especificar la ubicación del Dockerfile.

Si el fichero tiene otro nombre , lo indicamos con la opción -f .


Instrucciones principales

  • FROM: Establece la imagen base.
  • RUN: Ejecuta comandos durante la construcción de la imagen.
  • CMD: Especifica el comando predeterminado para el contenedor.
  • LABEL: Añade metadatos a la imagen.
  • EXPOSE: Define los puertos que se abrirán.
  • ENV: Establece variables de entorno.
  • COPY y ADD: Copian archivos al contenedor.
  • WORKDIR: Define el directorio de trabajo.
  • VOLUME: Crea un punto de montaje persistente.
  • ENTRYPOINT: Establece el comando principal del contenedor.
  • ARG: Declara argumentos para la construcción.

Ejemplo: Imagen base (FROM)

1
FROM ubuntu:latest

Esta instrucción es obligatoria y debe ser la primera, salvo comentarios o ARG .


Ejemplo: Ejecución de comandos (RUN)

Instalación de paquetes

Instalación de paquetes

Lo primero que debemos hacer es ejecutar apt-get update , lo que actualiza las cabeceras de los repositorios para garantizar que los paquetes disponibles estén actualizados.
Observa que se utiliza la opción -y para confirmar automáticamente las instalaciones, evitando la necesidad de interacción manual, algo que no está permitido durante la construcción del contenedor .

1
2
RUN apt-get update && apt-get install -y apache2
RUN apt-get install -y php git zip

Ejecución de scripts

1
RUN bash script.sh

Cada instrucción RUN genera una capa.

Modificar una capa afecta a las siguientes, por lo que conviene agrupar comandos para optimizar.


Declaración de variables: ENV y ARG

ENV

1
2
3
FROM ubuntu:latest
ENV USER=developer
RUN echo "Usuario actual: $USER"

ARG

1
2
3
ARG VERSION=latest
FROM ubuntu:$VERSION
RUN echo "Versión base: $VERSION"

Construcción con argumentos personalizados:

1
docker build --build-arg VERSION=20.04 -t mi_imagen .

Ejemplo: Personalización con RUN

Podemos ejecutar comandos de administración, instalación y scripts predefinidos:

1
2
3
RUN mkdir -p /var/www/app && chown -R www-data:www-data /var/www/app
RUN apt-get update && apt-get install -y composer
RUN composer install --no-scripts --no-autoloader

Práctica sugerida: Crear un Dockerfile

  1. Partir de la imagen base ubuntu:latest.
  2. Instalar los paquetes necesarios:
    • apache2
    • vim
    • git
    • zip
1
2
FROM ubuntu:latest
RUN apt-get update && apt-get install -y apache2 vim git zip

Declaración de variables: ENV vs ARG

img_2.png Diferencias clave:

  • ENV: Define variables accesibles dentro del contenedor en tiempo de ejecución.
  • ARG: Define argumentos disponibles solo durante la construcción de la imagen.

Ejemplo de uso: ARG

1
2
3
ARG VERSION=latest
FROM ubuntu:$VERSION
RUN echo $VERSION > version.txt

Construcción personalizada:

1
docker build --build-arg VERSION=18.10 -t web:v1 .

Ejemplo de uso: ENV

1
2
3
FROM ubuntu:latest
ENV USER=manuel
RUN echo "Usuario configurado: $USER"

Solución de problemas: Instalación de PHP

Problema

Al instalar PHP, puede requerirse configurar la zona horaria (tzone), lo que interrumpe la construcción al no poder interactuar con el contenedor. img_3.png

Solución

Configurar el entorno en modo no interactivo:

1
2
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y php libapache2-mod-php

Configurar la zona horaria:

1
2
RUN ln -snf /usr/share/zoneinfo/Europe/Madrid /etc/localtime && \
echo "Europe/Madrid" > /etc/timezone

Etiquetas (LABEL)

Podemos agregar metadatos útiles a la imagen:

1
2
3
4
FROM ubuntu:latest
LABEL maintainer="example@example.com"
LABEL version="1.0"
LABEL description="Imagen personalizada para aplicaciones web"

Ver etiquetas en el contenedor:

1
docker inspect --format '{{.Config.Labels}}' container_name

Gestión de archivos: COPY y ADD

Ejemplo: Crear usuarios desde un script

Archivos necesarios:

  1. usuarios.txt:

    1
    2
    3
    4
    5
    
    maria
    nives
    luis
    lourdes
    manuel

  2. crea_usuarios.sh:

    1
    2
    3
    4
    
    while IFS= read -r line
    do
    useradd -m $line -p $line
    done < usuarios.txt

Dockerfile:

1
2
3
4
FROM ubuntu:latest
COPY crea_usuarios.sh /
ADD usuarios.txt /
RUN bash crea_usuarios.sh

Comandos: CMD y ENTRYPOINT

CMD

1
CMD ["echo", "Hola desde Docker"]

ENTRYPOINT

1
ENTRYPOINT ["apachectl", "-D", "FOREGROUND"]

Ambos comandos definen lo que ejecutará el contenedor al iniciarse.


Volúmenes (VOLUME)

Define un volumen para la persistencia de datos. Es una instrucción declarativa que indica que, en los contenedores creados a partir de esta imagen, los datos ubicados en esta carpeta deberían almacenarse de forma persistente en un volumen.

1
2
FROM ubuntu:latest
VOLUME ["/var/www/html"]

Uso con variables de entorno:

1
2
ENV WEB_DIR=/var/www/html
VOLUME $WEB_DIR

Directorio de trabajo (WORKDIR)

Definir el directorio predeterminado:

1
2
3
4
FROM ubuntu:latest
WORKDIR /var/www/html
COPY script.sh /
ENTRYPOINT bash script.sh

Exponer puertos (EXPOSE)

Define los puertos que el contenedor utilizará para aceptar conexiones.

Es una instrucción declarativa (en una instrucción declarativa indicamos una intención, mientras que en una instrucción activa realizamos la acción real).
Indica qué puertos estarán disponibles dentro del contenedor, aunque no los publica automáticamente en el host.
Para hacerlos accesibles desde fuera, deben mapearse explícitamente al ejecutar el contenedor, por ejemplo con la opción -p.

1
2
3
4
FROM php:8.3-apache

# El contenedor escuchará internamente en el puerto 80
EXPOSE 80

Ejemplo de uso, (myimage sería la imagen generado por el Dockerfile anterior):

1
2
# Publicamos el puerto 80 del contenedor en el 8080 del host
docker run -d -p 8080:80 myimage

El contenedor escucha en el puerto 80, pero el acceso externo se realiza a través del 8080.

1
2
3
4
FROM ubuntu:latest
ENV WEB_PORT=80 
MYSQL_PORT=3306
EXPOSE $WEB_PORT $MYSQL_PORT

Extensiones de PHP en Docker (docker-php-ext-*)

Las imágenes oficiales de PHP incluyen herramientas para gestionar extensiones de forma sencilla.

Estas utilidades permiten compilar, activar, configurar o instalar extensiones adicionales directamente dentro del contenedor durante el proceso de construcción de la imagen.

De este modo, puedes añadir soporte para bases de datos (pdo_mysql, mysqli), gráficos (gd), internacionalización (intl), depuración (xdebug), cachés (redis, apcu) u otras librerías sin necesidad de compilar PHP manualmente.

Es una instrucción activa, ya que ejecuta acciones reales durante la construcción de la imagen (instala o habilita extensiones).


Comandos principales
Comando Función principal Tipo
docker-php-ext-install Compila e instala extensiones incluidas en el código fuente de PHP (por ejemplo pdo_mysql, gd, intl) Activa
docker-php-ext-enable Activa extensiones ya instaladas, normalmente tras usar pecl install Activa
docker-php-ext-configure Configura opciones previas a la compilación de una extensión Activa
pecl install Instala extensiones externas (no incluidas en el core de PHP) Activa

🧱 Ejemplo básico

1
2
3
4
FROM php:8.3-apache

# Instalar extensiones PHP nativas
RUN docker-php-ext-install mysqli pdo pdo_mysql

🌍 Ejemplo con dependencias

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM php:8.3-apache

# Instalar librerías del sistema necesarias
RUN apt-get update && apt-get install -y \
libjpeg-dev libpng-dev libwebp-dev libfreetype6-dev \
&& docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype \
&& docker-php-ext-install gd mysqli pdo pdo_mysql intl \
&& docker-php-ext-enable gd

# Limpieza para reducir tamaño de la imagen
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

💡 Notas

  • Estas herramientas solo están disponibles en las imágenes oficiales de PHP (php:8.3-apache, php:8.3-fpm, etc.).
  • Es recomendable limpiar la caché y combinar comandos en una sola capa para reducir el tamaño final de la imagen.
  • Si la extensión no está incluida en PHP, puede instalarse mediante pecl install nombre y activarse con docker-php-ext-enable.

👉 En resumen, estas utilidades facilitan la instalación y configuración de extensiones PHP durante la construcción de imágenes Docker, de forma similar a cómo apt-get install gestiona paquetes del sistema.

Conclusión

6 - Gestión de archivos y directorios

⭐ Comandos

Repaso de comandos usados en Dockefiler Docerfile es un fichero de comandos para generar una imagen

Crear la imagen a partir del fichero de especificación Dockerfile

docker build ubicación_fichero_Dockerfile

Crea una imagen a partir del fichero Dockerfile ubicado en el mismo directorio de dónde lanzo el comando

docker build -t web_old:v1 .

Especificar la imagen base

FROM

Especifica que la imagen sean ubuntu:latest

FROM ubuntu:latest

Especificar una instrucción a ejectuar dentro de la imagen

RUN

Que se instale apache2, el editor vim y la herramientas para monitoreo de redes net-tools en la imagen

FROM ubuntu:latest
RUN apt update && apt install -y \
apache2
vim
net-tools


Especificar argumentos

ARG

Establece argumentos para la construcción de la imagen del Dockerfile actual. Establece el tag de la versión como un argumenteo $version

ARG version=latest
FROM ubuntu:$version
RUN echo "Valor de version -$version" version.txt

Especificando

ARG

Establece argumentos para la construcción de la imagen del Dockerfile actual. Establece el tag de la versión como un argumenteo $version

ARG version=latest
FROM ubuntu:$version
RUN echo "Valor de version -$version" >> version.txt

Especificar variables de entorno (disponibles en la construcción y en la imagen cuando se construya)

ENV

Establece una variable llamada $user, comprueba que existe en la imagen creada

ARG version=latest
FROM ubuntu:$version
ENV user=manuel
RUN echo "Valor de usuario -$user" >version.txt
  • A contunuación creamos el contenedor y vemos el contenido del fichero
docker build -t web:v1 .
docker run web:v1 cat version.txt


Copiar ficheros del contesto a la imagen

COPY

Copia un fichero llamado index.php a una imagen basada en ubuntu:latest, que tenga apache y php

FROM ubuntu:latest
ARG DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y \
    apache2\
    php\
    libapache2-mod-php
COPY index.php /var/www/html/index.php    
  • El contenido del fichero index.php
<?php
phpinfo();
?>
  • La construcción del contenedor
docker run -d -p 8000:80 --name web_old web_old:v1 sh -c "service apache2 start && tail -f /dev/null"
  • Abrimo apache y vemo el index.php img.png

ADD: Copiar ficheros del contesto a la imagen.

CMD ejecuta un comando cuando se inicia el contenedor.

ADD CMD

ADD Copia un fichero llamado https://github.com/MAlejandroR/json_tv/blob/main/tv.json en una imagen

FROM ubuntu:latest
ARG DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y \
    apache2\
    php\
    libapache2-mod-php\
    php-json
ADD https://raw.githubusercontent.com/MAlejandroR/json_tv/main/tv.json  /var/www/html/tv.json
COPY index.php /var/www/html
RUN chmod 775 /var/www/html/*
CMD sh -c "service apache2 start && tail -f /dev/null"
  • El contenido del fichero index.php
<?php
$tv = file_get_contents("tv.json");
$cadenas = json_decode($tv, true);
foreach ($cadenas as $cadena) {
    echo "<h1>{$cadena['name']}</h1>";
    foreach ($cadena['channels'] as $canal){
        echo "
        <a href='{$canal['web_old']}'>
            <img src = '{$canal['logo']}'>
        </a>";
    }
    echo "<hr style='background-color:green;height:10px' />";
}
?>
  • La construcción del contenedor
docker run -d -p 8000:80 --name web_old web_old:v1 
  • Solicitamos el recurso en un navegador y vemos el resultado
    img_1.png

Especificar el puerto que voy a mapear o realizar el forware

EXPOSE

Establece que vas a realizar un forwar sobre el puerto 80

FROM ubuntu:latest
ARG DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y \
    apache2\
    php\
    libapache2-mod-php\
    php-json
ADD https://raw.githubusercontent.com/MAlejandroR/json_tv/main/tv.json  /var/www/html/tv.json
COPY index.php /var/www/html
RUN chmod 775 /var/www/html/*
EXPOSE 80
CMD sh -c "service apache2 start && tail -f /dev/null"

Crear etiquetas en la imagen

LABEL

Añade 3 etiquetas, tu identificación maintainer description version

FROM ubuntu:latest
ARG DEBIAN_FRONTEND=noninteractive
LABEL maintainer="manuel Romero <manuelromeromiguel@gmail.com>"
LABEL description="Imagen de contenedor con Apache, PHP y un archivo JSON"
LABEL version="1.0"
RUN apt update && apt install -y \
    apache2\
    php\
    libapache2-mod-php\
    php-json
ADD https://raw.githubusercontent.com/MAlejandroR/json_tv/main/tv.json  /var/www/html/tv.json
COPY index.php /var/www/html
RUN chmod 775 /var/www/html/*
EXPOSE 80
CMD sh -c "service apache2 start && tail -f /dev/null"

7 - Docker compose

Si quiero desarrollar una aplicación web, puedo necesitar tener en el sistema:

  • Un servidor web: p.e apache
  • Un intérprete de código: p.e php
  • Un servidor de bases de datos: p.e mysql
    • Una herramienta para gestionar: p.e phpmyadmin

Ante esta situación qué hacemos

* Podría tener un contenedor con todos los servicios.
* Pero vaya lío tener todo en un contenedor
* ¿Podría tener un contenedor con cada servicio?

Qué me va a permtir docker compose
  • Docker compose me va a permitir especificar en un fichero los servicios que necesito
  • Va a crear un contenedor por cada servicio
  • Va a crear una red interna para que dichos servicios se vean entre sí
  • Me va a permitir, mediante comandos poder gestionar todos los servicios de manera individual
  • Todo centralizado en un comando de docker : compose.
  • Evitamos tener que tener varios ficheros Dockerfile y gestionarlos uno por uno para que se ejecuten .
  • La ejecución de docker-compose va a generar contenedores con servicios.

Fichero de configuración

  • Es un fichero llamado docker-compose.yaml o (docker-compose.yml)

    • yaml o yml es un tipo de fichero de declarativo , cuya configuracioń y sintaxis es muy sencilla. yaml viene de YAML Ain’t Markdown Language (Yaml no es un lenguaje de marcado) especificando que no es como XML o HTML:

    * Tiene en cuenta la indentación creando bloques . *Asigno valores a variables utilizando : (dos puntos), debiendo de haber una separación entre los dos puntos y el valor

    • Para crear listas usa los guiones

    Es un fichero muy fácil de entender

Creando el fichero 1.- Vamos a ver la construcción del fichero docker-compose.yaml .
2.- Posteriormente veremos cómo ejecutar el fichero y construir nuestro entorno de desarrollo .

Sintaxis del fichero

El fichero docker-compose va a tener opciones de configuración que podemos jerarquizar

Es un fichero de configuración con formato yaml

Sintaxis YAML (https://es.wikipedia.org/wiki/YAML): La indentación establece la agrupación. Si queremos establecer una lista, usamos guiones Hay que dejar un espacio entre los dos puntos y el valor.

Tema 3: Docker Compose

Docker Compose es una herramienta que permite definir y ejecutar aplicaciones multicontenedor con un archivo de configuración llamado docker-compose.yml.


Introducción a Docker Compose

Docker Compose
Docker Compose es una herramienta que nos permite gestionar sistemas dockerizados, facilitando la configuración y ejecución de aplicaciones multicontenedor de forma sencilla y ordenada, utilizando un único archivo YAML.

Beneficios de Docker Compose


¿Cómo funciona Docker Compose?

Docker Compose utiliza un archivo docker-compose.yml para definir servicios, redes y volúmenes necesarios para una aplicación.

Estructura básica de un archivo docker-compose.yml
services:
    web:
        image: nginx:latest
        ports:
            - "8080:80"
    db:
        image: mysql:5.7
        environment:
            - MYSQL_ROOT_PASSWORD: example
            - MYSQL_DATABASE: test

Sintaxis del archivo YAML

El archivo docker-compose.yml utiliza la sintaxis YAML, la cual es declarativa y fácil de entender.

Ejemplo de sintaxis básica en YAML:

1
2
3
4
5
services:
    web:
        image: nginx:latest
        ports:
            - "8080:80"


Opciones principales del archivo docker-compose.yml

  1. services: Define los contenedores que forman parte de la aplicación.
  2. volumes: Especifica volúmenes para persistir datos.
  3. networks: Configura redes internas para los servicios.

Ejemplo práctico: Servidor web y base de datos

Creamos una configuración para un servidor web con Nginx y una base de datos MySQL.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
services:
web:
    image: php:8.4-apache
    ports:
        - "8080:80"
    
    db:
        image: mysql
        environment:
            - MYSQL_ROOT_PASSWORD: root
            - MYSQL_DATABASE: ejemplo
            - MYSQL_USER: usuario
            - MYSQL_PASSWORD: contraseña

Ejecución:

  1. Levantar los servicios:

    1
    
    docker compose up -d

  2. Verificar contenedores activos:

    1
    
    docker compose ps

  3. Detener los servicios:

    1
    
    docker compose down


Referencias

Documentación oficial

Fuentes de Información


8 - Docker Prácticas

> Ejercicios para practicar con docker

8.1 - Crea imágenes

Descargar, ver y borrar imágenes

  • Comandos a usar
docker pull
docker images
docker rmi nombre_imagen
docker rmi (docker images)
1. Descarga una imagen llamada ubuntu_latest

2. Descarga una imagen llamada manolo/web:v1

3. Verficia que las has descargado listándolas

4. Borra la imagen llamada manolo/web:v10

5. Verifica que la has borrado

6. Vuelve a cargar una imagen llamada manolo/web:v10

7. Borra todas las imágemes

8. Verifica que no tienes ninguna imagen

8.2 - Crea Contenedores

Crear y usar contenedores

  • Comandos a usar
docker create
docker start
docker exec
docker run 
docker run --name
docker run --name xxx --hostname xxx -p xxxx:xx v xx:xxx nombre_imagen

Crea, lista y borra contenedores

  • Comandos a usar
docker create
docker start
docker exec 
> docker ps -a
docker rm nombre_contenedor
docker rm (docker ps -a- q)

Si estás en linux o en mac

 docker rm $(docker ps -a -q)

1. Crea 5 contenedor a partir de la imagen ubuntu:latest sin especificar nombre


2. Verifica que los has creado


3. Verifica que los has creado


4. Borra todos los contenedores y verificalo



5. Crea un contenedor llamado web a partir de la imagen ubuntu:latest


6. Arranca el contenedor


7. Observa su estado


8. Borra todos los contenedores


9. Crea un contenedor llamado web que permita ejecutar comandos en un terminal de forma interactiva a partir de la imagen ubuntu_latest


10. Arranca el contenedor


11. Ejecuta de forma interactiva (-i) en un terminal (-t) un comado bash


12. Para el contenedor


13. Revisa su estado


14. Borra todos los contenedores


15. Crea un contenedor llamado web que se quede arrancado a partir de la imagen ubuntu_latest


16. Instala apache2 y php en el contendor web


17. Arranca el servicio de apache


18. Borra el contendor web


19. Crea igual que antes el contenedor web, pero mapeando el puerto 8000:80


20. Instala apache2 y php en el contendor web

>

8.3 - Contenedores

Contenedores => imágenes

❗ Como crear nuestras imágenes

En esta sección realizaremos acciones para pasar crear nuestras imágenes a partir de contenedores

Una imagen es la plantilla para un contenedor, y contiene un sistema de archivos con una determinada versión de sistema operativo a partir del sistema operativo del anfitrión, y una serie de programas o servicios que se han añadido
La forma de construir una imagen es en capas, según le vamos añadiendo elementos.
La idea es tener un contenedor según nuestra necesidad, y con él, crear una imagen
:

  • Comandos a usar
docker commit
docker push
docker export
docker import

1. Crea una imagen llamada web:v1 a partir del conenedor web


2. Verifica que has creado la imagen


3. Crea con run, un contenedor, pero compartiendo una carpeta


4. Crear un fichero tar llamado web.tar con el contenedor


5. Crea una imagen llamada web:v2 a partir del fichero web.tar


6. Confirma que lo has creado


7. Crea un contenedor llamado web2 a patir de la imagen web:v2


7. Hazte una cuenta en docker hub

7. Accede en línea de comandos a tu cuenta


7. Sube la imagen web:v1 que tienes en tu sistema


9 - Anexos para el módulo

Objetivos

Repaso de conceptos


  • Incluímos aquí anexos y referencias necesarias para el cilo
  • Introducimos Comandos linux

9.1 - Comandos linux

Comanso básicos de linux
Objetivos

Qué veremos aquí


  • Conocer básicos de linux
  • Diferenciar entre comandos de usuario y de administrador
  • Poder usar la terminal para moverse por el sistema de archivos

Comandos de linux

9.2 - Comandos docker

Repaso docker
Objetivos

Qué veremos aquí


  • Un listado básico con concpetos vistos

Conceptos básicos de Docker

Concepto Descripción
Docker Plataforma para crear, ejecutar y administrar contenedores. Permite virtualización ligera y portable.
Formas de uso A través de línea de comandos (CLI) o mediante interfaces gráficas como Docker Desktop o Portainer.
Virtualización Entorno aislado con su propio sistema de ficheros, red e IP.
Diferencia con MV Un contenedor no incluye un sistema operativo completo ni reserva hardware. Comparte el kernel del host, por lo que es más ligero y eficiente.
Imagen Fichero base, inmutable, con el entorno de usuario (librerías y dependencias) de un sistema operativo y de la aplicación. El kernel lo aporta siempre el host.
Contenedor Instancia en ejecución de una imagen. Se crea con una capa de lectura/escritura. Siempre ejecuta una aplicación principal; si esta finaliza, el contenedor se detiene.
Estados de un contenedor Los más comunes son Up (ejecutándose) y Exited (detenido). Un contenedor solo presta servicio si está en estado Up.
docker run Comando que crea y lanza un contenedor a partir de una imagen.
- Si la imagen no existe localmente, la descarga (docker pull).
- Internamente combina:
  • docker pull (si la imagen no está)
  • docker create (crea el contenedor)
  • docker start (lo arranca)
  • docker exec (ejecuta el comando indicado en el contenedor).

Ejemplo:

# Comando resumido con docker run
docker run --name web ubuntu:latest bash

# Equivalente a ejecutar paso a paso:
docker pull ubuntu:latest                # Descarga la imagen si no existe
docker create --name web ubuntu:latest   # Crea el contenedor
docker start web                         # Lo arranca
docker exec web bash                     # Ejecuta bash dentro del contenedor

Estados de un contenedor según cómo se cree

Comando Proceso principal (PID 1) Estado tras docker ps ¿Puedo entrar después? Explicación breve
docker run --name c1 ubuntu:latest bash (sin tty/stdin) Exited inmediato ❌ No bash detecta que no hay terminal y termina.
docker run -it --name c2 ubuntu:latest bash (con tty/stdin) Up mientras dure la sesión ✅ Sí (ya estás dentro) Sesión interactiva con bash.
docker run -dit --name c3 ubuntu:latest bash (detached, tty) Up ✅ Con docker exec Contenedor sigue en background; puedes entrar con exec.
docker run --name c4 ubuntu:latest sleep infinity sleep infinity Up ✅ Con docker exec Proceso nunca termina, mantiene el contenedor vivo.
docker run --name c5 ubuntu:latest touch 1.txt touch 1.txt Exited inmediato ❌ No El comando se ejecuta y termina, contenedor muere.

Regla de oro: un contenedor vive mientras viva su proceso principal.

  • Usa -it si quieres trabajar directamente con un shell.
  • Usa -dit si quieres dejarlo corriendo y conectarte más tarde con docker exec.
  • Si el proceso termina → el contenedor pasa a Exited.

Opciones más comunes de docker run

Opción Ejemplo Explicación breve
--name docker run --name web ubuntu:latest Asigna un nombre al contenedor (en lugar de ID aleatorio).
-h / --hostname docker run -h servidor1 ubuntu:latest Define el hostname interno del contenedor.
-p docker run -p 8080:80 httpd Publica un puerto (host:contenedor).
-v (Linux → Linux) docker run -v /home/manuel/web:/var/www/html httpd Monta el directorio local en /var/www/html del contenedor (caso típico con Apache).
-v (Windows → Linux) docker run -v C:\Users\Manuel\web:/var/www/html httpd En Windows, rutas con C:\... se montan en /var/www/html del contenedor.
-d docker run -d httpd Ejecuta en segundo plano (detached).
-it docker run -it ubuntu bash Interactivo con terminal (stdin+tty).
--network docker run --network mi_red httpd Conecta el contenedor a una red Docker específica.
--rm docker run --rm ubuntu echo "hola" El contenedor se elimina automáticamente al salir.
--env / -e docker run -e MYSQL_ROOT_PASSWORD=1234 mysql Define variables de entorno.
--restart docker run --restart=always httpd Política de reinicio automático (ej: tras fallo o reinicio del host).

Notas prácticas sobre -v:

  • En Linux, se usan rutas absolutas (/home/usuario/...).
  • En Windows con Docker Desktop, se usan rutas de la forma C:\Users\....
  • Para Apache, el mapeo típico es al directorio raíz /var/www/html.