Trata de contextualizar docker con un poco de historia y su evolución
Trata de sus orígenes,
Como técnicos/as en tecnologías, es bueno que conozcamos algo de historia de la tecnología con la que trabajamos
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.
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.
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
Importante
Asegúrate de leer y entender bien los siguientes párrafos
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.
Nota aclaratoria: Docker en Windows
En Linux los contenedores usan directamente el kernel del anfitrión.
En Windows, en cambio, para ejecutar contenedores Linux, Docker utiliza tecnologías como WSL2 o Hyper-V:
WSL2 (Windows Subsystem for Linux 2): es una compatibilidad de Windows que incluye un kernel Linux real integrado, no es exactamente una máquina virtual clásica, sino una capa optimizada para ejecutar Linux dentro de Windows.
Hyper-V: es la plataforma de virtualización de Windows, y en este caso sí funciona como una máquina virtual ligera que corre Linux para que los contenedores puedan ejecutarse.
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.
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.
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.
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
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
Probamos la instalación
listando los comandos disponibles de Docker:
1
docker help
Instalación de Docker en Windows
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:
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
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
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.
En cualquier caso, recomendamos que abras un power shell en windows y realices las acciones en el terminal.
Configuración de Docker Desktop
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.
Notas
No se emula hardware, sino únicamente servicios y software (como el sistema de archivos, el sistema operativo y los servicios). Por lo tanto, un contenedor no es una máquina virtual, aunque tenga su propia IP. Sin embargo, puede considerarse como un dispositivo o nodo independiente dentro de la red.
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
Notas
El contenedor se crea a partir de una imagen y siempre dependerá de ella. Esto significa que no podremos eliminar la imagen mientras exista un contenedor asociado a ella.
Notas
El contenedor almacena los cambios realizados sobre la imagen, funcionando como pequeños incrementos sobre un archivo base. Este enfoque lo convierte en un sistema muy robusto, ágil y ligero.
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).
Nota
Todo contenedor siempre dependerá de una única imagen.
Nota
Una imagen puede ser la base de uno o muchos contenedores.
Cada contenedor es un sistema independiente de los demás, con su propia IP y un entorno completamente aislado.
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
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
).
Cuidado
Para generar contenedores en producción No se recomiendo usar esta etiqueta, ya que podría estar cambiando de versión del sistema base del contenedor.
Ver imágenes disponibles
:
1
docker images
Consultar ayuda
:
1
docker help images
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
Crear contenedor
:
El comando
docker create
permite crear contenedores
sin ejecutarlos inmediatamente
.
Puedes descargar imágenes sin cuenta usando docker pull o docker run.
Inicia sesión con docker login para subir tus propias imágenes.
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.
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.
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.
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.
Listar redes disponibles
:
1
docker network ls
Crear una red personalizada
:
1
docker network create my_custom_network
22. Renombrar Contenedores
docker rename
Usa `docker rename` para renombrar un contenedor existente.
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.
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.
¿Para qué sirve?
La idea es partir de una imagen base y personalizarla según nuestras necesidades.
Una vez creada la nueva imagen, podremos utilizarla para levantar contenedores.
Construcción del Dockerfile
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
FROMubuntu: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 apache2RUN 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.
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.
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
FROMphp:8.3-apache# El contenedor escuchará internamente en el puerto 80EXPOSE80
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 hostdocker run -d -p 8080:80 myimage
El contenedor escucha en el puerto 80, pero el acceso externo se realiza a través del 8080.
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)
FROMphp:8.3-apache# Instalar librerías del sistema necesariasRUN 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 imagenRUN 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
Resumen
Sabemos crear imágenes personalizadas con Dockerfile.
Sabemos usar instrucciones clave como RUN, CMD, ENTRYPOINT y más.
Aprendimos a gestionar volúmenes y persistencia de datos.
Configuramos variables de entorno y puertos expuestos.
Sabemos subir y gestionar imágenes en Docker Hub.
6 - Gestión de archivos y directorios
⭐ Comandos
Repaso de comandos usados en DockefilerDocerfile es un fichero de comandos para generar una imagen
Crear la imagen a partir del fichero de especificación Dockerfile
docker buildubicació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 .
Warning
la opción -t permite especificar el nombere de la imagen
el punto final ’.’ especifica la ubicación del fichero Dockerfile, el directorio actual
Para ver más opciones del comando build ver
_docker help build
Especificar la imagen base
FROM
Especifica que la imagen sean ubuntu:latest
FROMubuntu:latest
Comentarios
Debe de ser la primera instrucción
Su aparición es obligatoria
Solo le pueden preceder comentarios ’#’ y la instrucción ARG
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
Uso el mismo ejemplo anterior especicando que voy a compartir el puerto 80
Este comando es informativo, no obliga a nada ni por ponerlo se comparte el puertoç
Es recomendado en las buenas prácticas
docker build -t web - -build-arg=18:01 .
Crear etiquetas en la imagen
LABEL
Añade 3 etiquetas, tu identificación maintainerdescriptionversion
FROMubuntu:latestARGDEBIAN_FRONTEND=noninteractive
LABELmaintainer="manuel Romero <manuelromeromiguel@gmail.com>"LABELdescription="Imagen de contenedor con Apache, PHP y un archivo JSON"LABELversion="1.0"RUN apt update && apt install -y \
apache2\
php\
libapache2-mod-php\
php-jsonADD https://raw.githubusercontent.com/MAlejandroR/json_tv/main/tv.json /var/www/html/tv.jsonCOPY index.php /var/www/htmlRUN chmod 775 /var/www/html/*EXPOSE80CMD sh -c "service apache2 start && tail -f /dev/null"
Comentarios
Puedes crear tus propias etiquetas.
maintainer, description, version se usan de forma estándar.
docker build -t web - -build-arg=18:01 .
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
Ventajas de Docker Compose
Facilita la creación y gestión de entornos complejos.
Centraliza la configuración de varios contenedores en un único archivo.
Automatiza la creación de redes internas para la comunicación entre servicios.
Simplifica la administración de contenedores relacionados.
¿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.
Características de YAML
La indentación establece la agrupación.
Se usan dos puntos : para asignar valores a variables.
1. Crea 5 contenedor a partir de la imagen
ubuntu:latest
sin especificar nombre
2. Verifica que los has creado
Revisa con cuidado
🔍 Reflexiona
Observa que te tienen que salir en estado created
Has de intentar enteder qué implica este estado y ver que en este contenedor no puedo ejecutar nada hasta que no
esté en estado Up
Observa igualmente el nombre que el sistema le a asignado al contenedor
3. Verifica que los has creado
Revisa con cuidado
🔍 Reflexiona
Observa que si solo escribes docker ps no sale nada
Esto es porque docker ps solo muestar los contenedores que están en estado Up
4. Borra todos los contenedores y verificalo
5. Crea un contenedor llamado
web
a partir de la imagen
ubuntu:latest
parámetros
:woman_detective: revisa los parámetros
Puedes ver los parámetros de un comando con docker help comando
seguimos usando el comando create para crear contenedores
6. Arranca el contenedor
7. Observa su estado
parámetros
🔍 estados del contenedor
Entender los estados del contenedor al principio cuesta
Un contenedor, cuando lo arrancamos ejectua el servicio o programa que tenga asignado estado Up y luego se detiene
estado Exited
Al revisar este ejercicio verás que el contenedor pasa directamente a estado Exited, y es porque el contenedor al
estar creado a partir de la imagen ubuntu:latest sí que tiene asociado un commando (revisa la columna COMMAND)
Pero como no tiene ningún terminal asociado para interactuar con él, no hace nada y muere
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
Usa Help
:woman_detective: revisa los parámetros
Puedes ver los parámetros de un comando con docker help comando
En este caso docker help create
En este caso lo podemos asociar con el comando -t para terminal y -i para ineteractive
10. Arranca el contenedor
Parámetros
:woman_detective: revisa los parámetros
Para arrancar docker start
11. Ejecuta de forma interactiva (-i) en un terminal (-t) un comado bash
Parámetros
:woman_detective: revisa los parámetros
Revisa el comando docker exec
Los parámetros -i y -t
el orden es primero especificar el contenedor y luego el comando
bash es un programa que sirve para interpretar comandos, como cuando abrimos un shell en windows
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
Los estados del contenedor
🕵️♂️
Si queremos dejar el contenedor en estado Up debemos usar el comando docker run
No es necesario, pero mejor especifica el comando al final (bash)
Aunque el orden de los parámetros no es importante, la solución tiene uno concreto, pero eso podría cambiar
16. Instala apache2 y php en el contendor web
instando: apt update
📚
Una vez dentro lo primero que hay que hacer es apt update
se pueden instalar todos los paquetes a la vez
con -y no nos preguntará si queremos instalarlo
php implica dos paquetes php, el intérprete, y el módulo que viene con apache para que apache sepa que un determinado recurso que tiene extensión php, tiene que llamar al intérprete para que lo ejectue, este es el paquete libapache2-mod-php
17. Arranca el servicio de apache
parando y arrancando
▶️ 🛑
*Prueba a pararlo (stop), a ver su estado (status) y volverlo a arrancar (start|restart)
18. Borra el contendor web
Warning
💡
Antes de elimniar el contenedor tiene que estar parado
19. Crea igual que antes el contenedor web, pero mapeando el puerto
8000:80
Recuerda
⚠️ Muy importante
Es muy importante que entiendas el concepto
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
:
1. Crea una imagen llamada
web:v1
a partir del conenedor
web
Revisa
🔍 verifica antes
Revisa que tienes ese contenedor creado en el ejercicio anterior
En este ejercicio teníamos apache y php y tenemos realizado el forward del puerto 8000:80
2. Verifica que has creado la imagen
3. Crea con run, un contenedor, pero compartiendo una carpeta
Recuerda
📝 Revisa los comandos
Mira la ayuda del comando run , revisa la opción -v
La carpeta en local la crearemos en el directorio actual y la llamaremos app
En el docker la carpeta serán /var/www/html que es dónde apache va a ir buscar los recursos cuando se los soliciten su DocumentRoot
Ten cuidado con el caracter de separar directorios, en windows es "\" en linux y mac es "/"
4. Crear un fichero tar llamado web.tar con el contenedor
Interesante
#####🌟 Puede ser que quieras tener tu imagen en un fichero
Con este comando vamos a crear un fichero tar a partir de un contenedor
El contenedor tiene que estar parado stop.
Con la opción -o especificamos el nombre del fichero tar
Lo que se almacena en el fichero tar es la imagen del contenedor, es decir me guardo una image, luego cuando lo exporte, __exportaré una imagen de la cual tendré que crear un contenedor 📝 Muy interesante reflexionar y entender este pequeño escenario
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
Warning
Realiza el forward de los puertos 8002:80 (seguramente el 8000 esté ocupado)
Mapea o crea el volumen de capetas .\app:/var/www/html
🔍 En la solución he puesto el nombre que corresponde a mi namespace, que es el nombre de usuario de docker hub, manolo, para especificar en nameespace, cada una tendréis el vuetro propio.
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 rundocker run --name web ubuntu:latest bash
# Equivalente a ejecutar paso a paso:docker pull ubuntu:latest # Descarga la imagen si no existedocker create --name web ubuntu:latest # Crea el contenedordocker start web # Lo arrancadocker 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.