Оглавление
José Juan Sánchez Hernández. Aprender Docker, un enfoque práctico
Índice general
Lista de siglas y acrónimos
Acerca de este libro
CAPÍTULO 1. Conceptos básicos. 1.1. ¿Qué es Docker?
1.1.1. Docker como tecnología de contenedores
1.1.2. Docker, Inc
1.2. ¿Qué ventajas nos aporta el uso de Docker?
1.3. Breve historia de las tecnologías de aislamiento
1.4. ¿Qué es una máquina virtual?
1.5. ¿Qué es un contenedor?
1.6. Analogía con los contenedores de transporte marítimo
1.7. Diferencias entre contenedores y máquinas virtuales
1.8. Arquitectura de Docker
1.9. Cliente de Docker
Ejemplo de ejecución del comando docker pull
Ejemplo de ejecución del comando docker run
1.9.1. Docker CLI
1.9.2. Docker Compose
1.10. Docker Engine
1.10.1. Docker Engine API
Ejemplo
1.10.2. Docker daemon
1.11. Container runtime
1.11.1. containerd
1.11.2. runc
1.12. Docker Registry
1.12.1. Docker Hub
1.12.2. Otros registros
1.13. Objetos de Docker
1.13.1. Imágenes
1.13.2. Contenedores
Contenedores Linux y contenedores Windows
1.13.3. Volúmenes
1.13.4. Redes
1.14. Orquestación de contenedores
Docker Swarm
Kubernetes
1.15. Organizaciones y estándares
1.15.1. Open Container Initiative (OCI)
1.15.2. Cloud Native Computing Foundation (CNCF)
1.16. Alternativas a Docker
CAPÍTULO 2. Instalación de Docker. 2.1. Docker Engine Community
2.2. Instalación de Docker Engine en Linux
2.2.1. Métodos de instalación en Ubuntu
2.2.2. Instalación en Ubuntu utilizando el script oficial
2.2.3. Instalación en Ubuntu desde los repositorios oficiales de Docker
Configuración del repositorio oficial de Docker
Instalación de Docker Engine
Comprobación de la instalación
2.2.4. Pasos posteriores a la instalación en Linux
Configuración del usuario
Configuración de Docker Engine para que se inicie automáticamente
2.3. Instalación de Docker Desktop en Windows 10
Hyper-V
WSL 2
2.3.1. Instalación de Docker Desktop utilizando WSL 2 como backend
Requisitos mínimos del sistema
Instalación de WSL 2 en Windows 10
Instalación de Docker Desktop en Windows 10
Opciones de configuración de Docker Desktop
Contenedores Linux y contenedores Windows
Comprobación de la instalación
2.4. Instalación de Docker Engine en Windows Server
Comprobación de la instalación
2.5. Instalación de Docker Desktop en macOS
Requisitos mínimos del sistema para un Mac con chip de Apple (arm64)
Requisitos mínimos del sistema para un Mac con chip de Intel (amd64)
Instalación de Docker Desktop en macOS
Opciones de configuración de Docker Desktop
Comprobación de la instalación
2.6. Play with Docker
CAPÍTULO 3. Imágenes Docker. 3.1. ¿Qué es una imagen Docker?
3.2. ¿Qué es un repositorio de imágenes?
3.3. ¿Qué es un tag?
Ejemplo de una imagen con varias etiquetas
3.4. ¿Qué es el digest de una imagen?
3.5. ¿Qué es el namespace de un repositorio?
Namespaces utilizados en Docker Hub
Namespaces anidados
3.6. ¿Qué es un registry?
3.7. Docker Hub
3.7.1. Repositorios de imágenes oficiales
Namespace para los repositorios de imágenes oficiales
3.7.2. Repositorios de imágenes de organizaciones verificadas
Namespace para los repositorios de imágenes verificadas
3.7.3. Repositorios de imágenes de la comunidad
Namespace para los repositorios de imágenes de la comunidad
3.8. El archivo Dockerfile
FROM
ARG
ENV
LABEL
RUN
COPY
ADD
EXPOSE
VOLUME
WORKDIR
HEALTHCHECK
USER
SHELL
ENTRYPOINT
CMD
3.9. Creación de una imagen a partir de un archivo Dockerfile
Ejemplo ‒ Creación de una imagen con una aplicación Python
3.10. Cómo publicar una imagen en Docker Hub
Creación de un Docker ID
Inicio de sesión desde la línea de comandos
Creación de una imagen local que incluya el nombre del usuario de Docker Hub
Publicar una imagen local en un repositorio de Docker Hub
3.11. Capas de una imagen
Ejemplo ‒ Análisis de las capas de la imagen hola-mundo:latest
Ejemplo ‒ Análisis de las capas de la imagen alpine:latest
Cómo se comparten capas entre imágenes
Aclaración sobre los identificadores de las capas de una imagen
3.12. Soporte para múltiples arquitecturas
3.13. Formato de las imágenes Docker
3.14. Buscar imágenes en Docker Hub ‒ docker search
Opciones
3.14.1. Buscar imágenes por nombre
Limitar el número de resultados de una búsqueda
Mostrar el texto de la descripción sin truncar
3.14.2. Buscar imágenes utilizando filtros
Filtrar por el número de estrellas
Filtrar solo imágenes oficiales
Filtrar solo imágenes con build automatizado
3.15. Administración de imágenes – docker image
Comandos
Equivalencia entre comandos
3.16. Descargar imágenes – docker pull
Opciones
Sintaxis nueva
3.16.1. Descargar imágenes desde Docker Hub. Cómo descargar una imagen etiquetada como latest
Cómo descargar una imagen indicando una etiqueta
Cómo descargar una imagen indicando un digest
3.16.2. Descargar imágenes desde un registry diferente a Docker Hub
Descarga de imágenes desde un registro privado
Descarga de imágenes desde Microsoft Container Registry
Descarga de imágenes desde Red Hat Container Catalog
3.17. Mostrar imágenes – docker images
Opciones
Sintaxis nueva
3.17.1. Mostrar las imágenes que tenemos descargadas
3.17.2. Mostrar las imágenes intermedias
3.17.3. Mostrar el identificador de las imágenes
3.17.4. Mostrar el digest de las imágenes
Diferencia entre DIGEST e IMAGE ID
3.18. Eliminar imágenes – docker rmi
Opciones
Sintaxis nueva
Ejemplo
3.18.1. Eliminar una imagen por su tag
3.18.2. Eliminar una imagen por su identificador
Ejemplo
Cómo eliminar una imagen con múltiples tags
3.18.3. Eliminar todas las imágenes, excepto las dangling images
3.18.4. Eliminar las dangling images
3.18.5. Eliminar las imágenes que no están siendo utilizadas
3.19. Consultar el historial de una imagen – docker history
Opciones
Sintaxis nueva
Ejemplo
3.20. Mostrar información detallada – docker inspect
Sintaxis nueva
Ejemplo
CAPÍTULO 4. Contenedores Docker. 4.1. Ciclo de vida de un contenedor
4.2. Administración de contenedores – docker container
Equivalencia entre comandos
4.3. Creación y ejecución de contenedores – docker run
Opciones
Sintaxis nueva
Formas de uso
4.4. Hello World!
Análisis del archivo Dockerfile para Linux
Análisis del archivo Dockerfile para Windows
Creación de un contenedor Linux
Creación de un contenedor Windows
4.5. Obtener el listado de contenedores – docker ps
Opciones
Sintaxis nueva
4.5.1. Obtener el listado de los contenedores que están en ejecución
Ejemplo
4.5.2. Obtener el listado de todos los contenedores
Ejemplo
4.5.3. Obtener el identificador de los contenedores que están en ejecución
Ejemplo
4.5.4. Obtener el identificador de todos los contenedores
Ejemplo
4.6. Ejecutar un comando dentro de un contenedor
Ejemplo
4.7. Ejecutar un contenedor en modo interactivo
Ejemplo de un contenedor en modo interactivo con Ubuntu
Opción --rm
Opción --name
4.8. Eliminar contenedores – docker rm
Opciones
Sintaxis nueva
4.8.1. Eliminar un contenedor que está detenido
Ejemplo
4.8.2. Eliminar un contenedor que está en ejecución
Ejemplo
4.8.3. Eliminar un contenedor y sus volúmenes anónimos asociados
4.8.4. Eliminar los contenedores que están detenidos
4.8.5. Eliminar los contenedores que están en ejecución y detenidos
4.9. Mostrar la salida estándar de un contenedor – docker logs
Opciones
Sintaxis nueva
Ejemplo
4.10. Creación de un contenedor en segundo plano
Ejemplo de un contenedor en segundo plano con un servidor web
4.11. Publicar los puertos de un contenedor
4.11.1. Opción -p, --publish
Ejemplo
4.11.2. Opción -P, --publish-all
Ejemplo
4.12. Cómo conectarnos a un contenedor en ejecución
4.12.1. docker attach
Opciones
Sintaxis nueva
Ejemplo
4.12.2. docker exec
Sintaxis nueva
Cómo crear un nuevo terminal en un contenedor que está en ejecución
Ejemplo
4.13. Copiar archivos y directorios – docker cp
Opciones
Sintaxis nueva
Ejemplo de cómo copiar un archivo de un contenedor al host de Docker
Ejemplo de cómo copiar un archivo del host de Docker a un contenedor
4.14. Cómo detener un contenedor – docker stop
Opciones
Sintaxis nueva
Ejemplo
4.15. Cómo iniciar un contenedor – docker start
Opciones
Sintaxis nueva
Ejemplo
4.16. Políticas de reinicio
Ejemplo
CAPÍTULO 5. Almacenamiento en Docker. 5.1. Almacenamiento en Docker
5.2. Bind mounts
¿Cuándo se recomienda utilizar un bind mount?
5.3. Formas de crear un bind mount en un contenedor
Opción -v, --volume
Opción --mount
Diferencias entre la opción -v y --mount
5.4. Crear un bind mount de solo lectura
5.5. Cómo crear las rutas de los directorios en un bind mount
Linux y macOS
Windows
5.6. Ejemplo para compartir el código fuente de una aplicación
5.7. Ejemplo para compartir un archivo de configuración
5.8. Volúmenes
¿Cuándo se recomienda utilizar un volumen?
5.9. Administración de volúmenes – docker volume
Comandos
5.10. Creación de un volumen. 5.10.1. Creación de un volumen con el comando docker volume create
Opciones
Ejemplo de creación de un volumen con nombre
Ejemplo de creación de un volumen anónimo
5.10.2. Creación de un volumen al crear un contenedor con docker run
Opción -v, --volume
Ejemplo de creación de un volumen con nombre con la opción -v
Ejemplo de creación de un volumen anónimo con la opción -v
Opción --mount
Ejemplo de creación de un volumen con nombre con la opción --mount
Ejemplo de creación de un volumen anónimo con la opción --mount
5.11. Inspeccionar un volumen
Opciones
Ejemplo
5.12. Obtener el listado de volúmenes
Opciones
Ejemplo
5.13. Eliminar volúmenes que no están en uso
Opciones
Ejemplo
5.14. Eliminar volúmenes
Opciones
Ejemplo
5.15. Ejemplo de creación de un contenedor con MySQL
5.15.1. Creación de un contenedor MySQL con un volumen anónimo
5.15.2. Creación de un contenedor MySQL con un volumen con nombre
Ejercicio propuesto
5.15.3. Inicializar un contenedor de MySQL con una base de datos
Ejemplo para importar una base de datos en un contenedor de MySQL
CAPÍTULO 6. Redes en Docker. 6.1. Redes en Docker
6.1.1. Container Network Model (CNM)
6.1.2. libnetwork
6.1.3. Drivers de red
Drivers de red para contenedores Linux
Drivers de red para contenedores Windows
6.2. Redes de tipo bridge
Diferencias entre la red bridge por defecto y las redes bridge definidas por el usuario
6.3. Administración de redes – docker network
Comandos
6.4. Obtener el listado de redes
Opciones
Ejemplo para obtener el listado de redes
Ejemplo para mostrar el identificador completo de las redes
Ejemplo de cómo aplicar filtros en el listado de redes
Ejemplo de cómo formatear la salida del comando con una plantilla de Go
6.5. Creación de una red
Opciones
Ejemplo de creación de una red bridge definida por el usuario
Ejemplo de creación de una red bridge definida por el usuario con opciones avanzadas
6.6. Conectar un contenedor a una red
6.6.1. Con el comando docker network connect
Opciones
Ejemplo para conectar un contenedor a una red
Ejemplo para crear un alias de red de un contenedor
6.6.2. Con la opción --network cuando se crea un contenedor
Ejemplo para conectar un contenedor a una red con la opción --network
Ejemplo para crear un alias de red de un contenedor con la opción --network-alias
6.7. Desconectar un contenedor de una red
Opciones
Ejemplo
6.8. Inspeccionar una red
Opciones
Ejemplo
6.9. Eliminar las redes que no están en uso
Opciones
Ejemplo
6.10. Eliminar redes
Ejemplo
6.11. Cómo conectar un contenedor Adminer con MySQL
6.11.1. Utilizando enlaces entre contenedores con la opción --link
Creación de un alias de red con la opción --link
Uso de la variable de entorno ADMINER_DEFAULT_SERVER
Inspeccionamos la red bridge por defecto
6.11.2. Utilizando una red bridge definida por el usuario
Creación de un alias con la opción --network-alias
Inspeccionamos la red bridge que hemos creado
6.12. Cómo conectar WordPress, MySQL y phpMyAdmin
Creación de la red bridge
Creación de un volumen para MySQL
Creación de un contenedor con MySQL
Creación de un volumen para WordPress
Creación de un contenedor con WordPress
Creación de un contenedor con phpMyAdmin
CAPÍTULO 7. Docker Compose. 7.1. ¿Qué es Docker Compose?
7.1.1. La especificación Compose
7.1.2. La implementación Docker Compose
7.2. Instalación de Docker Compose v2
Instalación de Docker Compose v2 en Linux como un plugin de Docker CLI
7.3. El archivo de configuración de Docker Compose
Nombre del archivo de configuración
Secciones del archivo de configuración
7.3.1. version
7.3.2. services
Claves de configuración para los servicios
image
build
command
entrypoint
container_name
ports
volumes
networks
environment
env_file
depends_on
restart
profiles
7.3.3. volumes
Ejemplo
7.3.4. networks
Ejemplo
7.3.5. configs
Ejemplo
7.3.6. secrets
Ejemplo
7.4. Comandos de Docker Compose
Lista de comandos más utilizados con docker compose
7.5. Ejemplo de un servicio Apache HTTP Server
Contenido del directorio de trabajo
Contenido del archivo docker-compose.yml
Crear y ejecutar los servicios en segundo plano
Consultar la lista de contenedores que están en ejecución
Diferencia entre docker ps y docker compose ps
Consultar la salida estándar (STDOUT)
Ejecutar un comando en un contenedor que está en ejecución
Detener y eliminar todos los servicios
7.6. Ejemplo de un servicio MySQL
Contenido del directorio de trabajo
Contenido del archivo docker-compose.yml
environment
Crear y ejecutar los servicios en segundo plano
Consultar la lista de contenedores que están en ejecución
Detener y eliminar todos los servicios
7.7. Cómo utilizar archivos con variables de entorno
Definir variables de entorno en archivos .env
Contenido del archivo .env
Contenido del directorio de trabajo
Contenido del archivo docker-compose.yml
Cómo utilizar archivos con variables de entorno que no se llamen .env
7.8. Ejemplo de una aplicación con dos servicios
Servicio: mysql
Servicio: phpmyadmin
Contenido del directorio de trabajo
Contenido del archivo .env
Contenido del archivo docker-compose.yml
depends_on
restart
7.9. Despliegue de una aplicación WordPress
Redes
Contenido del directorio de trabajo
Contenido del archivo .env
Contenido del archivo docker-compose.yml
7.10. Creación de un entorno de desarrollo LAMP
Contenido del directorio de trabajo
Contenido del archivo .env
Contenido del archivo database.sql
Contenido del directorio src
Servicio: apache
Servicio: mysql
Servicio: phpmyadmin
Contenido del archivo docker-compose.yml
7.11. Creación de un entorno de desarrollo LEMP
Contenido del directorio de trabajo
Servicio: nginx
Servicio: php-fpm
Servicios: mysql y phpmyadmin
Contenido del archivo docker-compose.yml
7.12. Repositorio con proyectos de ejemplo
ANEXO A. docker system
Comandos
Mostrar el espacio de disco utilizado por Docker
Eliminar los objetos que no se están utilizando para liberar espacio de disco
Obtener información detallada del sistema
Obtener información en tiempo real de los eventos que ocurren en el Docker daemon