La virtualización es una tecnología que permite crear varias máquinas virtuales (VMs) sobre un único hardware físico. Cada VM funciona como una máquina independiente con su propio sistema operativo y aplicaciones. Los hipervisores, como VMware, Hyper-V o VirtualBox, gestionan estas VMs, permitiendo compartir los recursos físicos del servidor (CPU, memoria, almacenamiento) entre las VMs.
Docker es una plataforma de contenedorización que permite a los desarrolladores empaquetar aplicaciones y sus dependencias en contenedores. Los contenedores son ligeros, portátiles y se ejecutan de manera consistente en cualquier entorno que soporte Docker. A diferencia de las VMs, los contenedores comparten el núcleo del sistema operativo del host, lo que los hace más eficientes en términos de recursos.
En Docker hay que diferencias dos conceptos:
Puedes instalar Docker siguiendo las instrucciones de su web. Dependiendo del sistema operativo. Por ejemplo, para instalar Docker en Ubuntu:
https://docs.docker.com/engine/install/ubuntu/
Puedes comprobar que todo se ha instalado correctamente comprobando la versión instalada:
docker --version
Docker version 27.0.3, build 7d4bcd8
Las imágenes de Docker son archivos que contienen todo lo necesario para ejecutar una aplicación: código, bibliotecas, dependencias y el sistema de archivos. Actúan como plantillas a partir de las cuales se crean contenedores.
Las imágenes se pueden descargar de registros de Docker, siendo el más popular Docker Hub. Docker Hub es un repositorio público que permite a los usuarios buscar, compartir y gestionar imágenes de Docker.
Las principales ordenes para trabajar con imágenes de Docker son:
Comando | Descripción |
---|---|
docker image pull | Descarga una imagen desde un registro (por ejemplo, Docker Hub) |
docker image ls | Lista todas las imágenes disponibles en el sistema local |
docker image rm | Elimina una imagen del sistema local |
docker image build | Construye una imagen a partir de un Dockerfile situado en la ruta especificada |
docker image push | Sube una imagen a un registro de Docker |
Para descargar imágenes de Docker Hub usamos docker image pull <imagen>. Los nombres de imágenes de Docker generalmente siguen el patrón usuario/imagen:tag:
Por ejemplo, si queremos bajarnos la versión 8.0.39 de la imagen mysql del usuario bitnami:
docker pull bitnami/mysql:8.0.39
Mientras que si quisiéramos bajarnos la última versión lts oficial de mysql:
docker pull mysql
Para listar las imágenes que tenemos descargadas en local usamos docker image ls (o alguno de sus alias como docker images):
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu-dhcp-server latest d884c8118af6 3 weeks ago 83.5MB mysql latest 5cde95de907d 4 weeks ago 586MB mysql 8.0 6c54cbcf775a 4 weeks ago 572MB linuxserver/dokuwiki latest b72ff6b0d7fb 7 weeks ago 117MB mariadb latest 4486d64c9c3b 7 weeks ago 406MB ubuntu latest 35a88802559d 8 weeks ago 78.1MB docker.cloudsmith.io/isc/docker/kea-dhcp4 2.6.0 2fe3592342d0 2 months ago 80.6MB docker.cloudsmith.io/isc/docker/kea-dhcp4 latest 2fe3592342d0 2 months ago 80.6MB docker.cloudsmith.io/isc/docker/kea-dhcp4 2.4.1 f65fe5a3c577 8 months ago 88MB docker/getting-started latest 3e4394f6b72f 19 months ago 47MB networkboot/dhcpd latest e25c872f0fca 24 months ago 139MB mariadb 10.7.1 67a24127bba8 2 years ago 411MB
La salida del comando incluye la siguiente información:
Para eliminar imágenes que tenemos descargadas en local usamos docker image rm (o su alias docker rmi):
docker rmi <image_id>
Puedes especificar el IMAGE ID o el REPOSITORY:TAG de la imagen que deseas eliminar:
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu-dhcp-server latest d884c8118af6 3 weeks ago 83.5MB
docker rmi d884c8118af6
docker image rm ubuntu-dhcp-server
La salida del comando de eliminación confirmará que la imagen ha sido eliminada. Si una imagen está siendo utilizada por algún contenedor, se deberá eliminar primero el contenedor asociado.
Para obtener instrucciones detalladas sobre cómo configurar el proxy para Docker, consulta la documentación oficial. Esta guía te proporcionará los pasos necesarios para ajustar la configuración del proxy según tus necesidades específicas.
Los contenedores de Docker son instancias ejecutables de imágenes. Mientras que las imágenes son plantillas estáticas que contienen todo lo necesario para ejecutar una aplicación, los contenedores son unidades en ejecución que proporcionan un entorno aislado y consistente para que las aplicaciones se ejecuten.
Puedes crear y gestionar contenedores utilizando una variedad de comandos. Aquí están los más importantes:
Comando | Descripción |
---|---|
docker container run | Crea y ejecuta un nuevo contenedor a partir de una imagen |
docker container start | Inicia un contenedor que ha sido detenido previamente |
docker container stop | Detiene un contenedor en ejecución |
docker container rm | Elimina un contenedor del sistema local |
docker container ls | Lista todos los contenedores en ejecución |
docker container exec | Ejecuta un comando en un contenedor en ejecución |
docker container logs | Muestra los registros de un contenedor |
docker container cp | Copia archivos o directorios entre el contenedor y el sistema de archivos del host |
Para ejecutar un contenedor a partir de una imagen, utilizamos el comando docker run. Este comando no solo crea un nuevo contenedor, sino que también lo inicia y, por defecto, ejecuta el comando especificado en la imagen (además, si no hemos descargado la imagen en local lo primero que haría sería descargarla).
El comando básico tiene el siguiente formato:
docker run [opciones] <imagen> [comando]Donde:
Algunas opciones comunes que se pueden usar con docker run incluyen:
Ejemplo de uso:
docker run -d -p 8080:80 --name mi_web nginx
En este ejemplo, el contenedor se ejecutará en segundo plano, exponiendo el puerto 80 del contenedor en el puerto 8080 del host, y se le asignará el nombre mi_web. La imagen utilizada es nginx, y se ejecutará el comando por defecto definido en esta imagen (iniciar el servidor web Nginx).
Otro ejemplo:
docker run --name mysql_web -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
En este caso, el contenedor se ejecutará en segundo plano con el nombre mysql_web. La opción -e se usa para definir variables de entorno; en este ejemplo, se establece la variable MYSQL_ROOT_PASSWORD con el valor my-secret-pw, que configura la contraseña de root para la base de datos MySQL. La imagen utilizada es mysql, y se ejecutará el comando por defecto definido en esta imagen (iniciar el servidor MySQL).
El comando docker run es fundamental para crear y ejecutar contenedores a partir de imágenes, permitiendo la configuración de múltiples aspectos del contenedor en el momento de su creación.
Los volúmenes en Docker son una forma de persistir datos generados o utilizados por los contenedores. A diferencia de los datos almacenados dentro de un contenedor, que se perderán si el contenedor se elimina, los volúmenes permiten que los datos persistan incluso si el contenedor se detiene o se elimina.
Para persistir datos y asegurar que se mantengan entre reinicios o recreaciones de contenedores, Docker ofrece dos formas principales de manejar volúmenes:
Crear un volumen nombrado:
docker volume create nombre_volumen
Inspeccionar un volumen:
docker inspect volume nombre_volumen
[ { "CreatedAt": "2024-07-08T11:33:46+02:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/datos-todo/_data", "Name": "datos-todo", "Options": null, "Scope": "local" } ]
La salida del comando docker inspect muestra detalles como el punto de montaje del volumen y su nombre.
Utilizar un volumen nombrado con un contenedor:
docker run -dp 3000:3000 --name app-cambios -v nombre_volumen:/etc/todos app-cambios
En este ejemplo, el contenedor app-cambios montará el volumen nombre_volumen en el directorio /etc/todos. Los datos almacenados en este directorio persistirán incluso si el contenedor se elimina y se vuelve a crear, siempre y cuando el volumen no sea eliminado.
Montar un directorio local en un contenedor:
docker run -dp 3000:3000 -v ./datos-todo:/etc/todos app-cambios
En este ejemplo, el directorio local ./datos-todo se monta en /etc/todos dentro del contenedor. Los datos guardados en este directorio local se reflejarán dentro del contenedor y viceversa.
¿Cuándo usar cada tipo?
La orden docker container exec permite ejecutar comandos en un contenedor en funcionamiento. Esta funcionalidad es útil para realizar tareas como la depuración, administración o inspección de un contenedor en tiempo real.
El formato básico del comando es:
docker exec [opciones] <contenedor> <comando> [argumentos]
Donde:
La opción más comun es -it, la cual ejecuta el comando en modo interactivo y asigna un terminal. Esto es útil para ejecutar shell interactivos, como bash o sh.
Por ejemplo, ejecutar bash dentro de un contenedor para abrir una sesión de shell bash dentro de él, permitiendo interacturar con él directamente.
docker exec -it mi_contenedor /bin/bash
Ejecutar un comando no interactivo:
docker exec mi_contenedor ls /app
Aquí, el comando ls /app se ejecuta dentro del contenedor mi_contenedor. Este comando no requiere interacción y muestra el contenido del directorio /app en el contenedor.
La orden docker exec es esencial para la administración y mantenimiento de contenedores en ejecución, permitiendo realizar tareas sin necesidad de detener o reiniciar el contenedor.
Ejercicio 1
Ejercicio 2
Ejercicio 3
docker exec -it mysql_smr mysql -u root -p
CREATE DATABASE prueba;
show databases;
Ejercicio 4
Ejercicio 5
Ejercicio 6
<?php phpinfo();