Aprender Docker, un enfoque práctico
- Sinopsis
- Índice
Si quiere aprender a utilizar la tecnología de contenedores que ha revolucionado el desarrollo y la distribución de aplicaciones web, ha llegado al libro indicado.
Antes de que Docker apareciese en la industria del desarrollo de software, era complicado garantizar la consistencia entre los entornos de desarrollo y producción. Era habitual encontrarse con aplicaciones que no se ejecutaban de forma correcta en el entorno de producción porque utilizaban dependencias con diferentes versiones de las que se habían utilizado en el entorno de desarrollo.
La tecnología de contenedores de software soluciona este problema, ya que permite empaquetar y distribuir una aplicación con todas las dependencias que necesita garantizando que se va a ejecutar de la misma manera sobre cualquier tipo de infraestructura. Gracias a esta forma de desarrollar y distribuir las aplicaciones, se ha conseguido eliminar las inconsistencias entre los entornos de desarrollo y producción.
Los desarrolladores de aplicaciones ya no necesitan crear máquinas virtuales pesadas en sus equipos de trabajo. Docker les permite disponer de un entorno de desarrollo mucho más ligero, que utiliza menos recursos y ofrece mayores prestaciones.
El uso de los contenedores ha permitido acelerar el proceso de desarrollo de las aplicaciones, así como facilitar la forma de distribuirlas y la automatización del despliegue en producción. Cada vez hay más equipos de desarrollo y operaciones que están utilizando la tecnología de contenedores Docker en sus flujos de trabajo. Si todavía no sabe utilizar Docker y quiere aprender para mejorar profesionalmente, no espere más, este libro le ayudará a conseguirlo.
José Juan Sánchez Hernández es ingeniero en Informática y tiene un máster en Técnicas Informáticas Avanzadas por la Universidad de Almería, donde trabajó como investigador. Sus principales líneas de investigación están en el área de la compresión y transmisión de imágenes, sobre las que ha realizado publicaciones en congresos nacionales e internacionales. También ha trabajado como analista de sistemas y programador en el ámbito de la empresa pública y privada. Actualmente desarrolla su carrera profesional como profesor de enseñanza secundaria en la especialidad de Informática y es docente en los ciclos formativos de grado superior de Administración de Sistemas Informáticos en Red y Desarrollo de Aplicaciones Web.
CAPÍTULO 1. Conceptos básicos 18
1.1. ¿Qué es Docker? 18
1.1.1. Docker como tecnología de contenedores 18
1.1.2. Docker Inc. 19
1.2. ¿Qué ventajas nos aporta el uso de Docker? 19
1.3. Breve historia de las tecnologías de aislamiento 19
1.4. ¿Qué es una máquina virtual? 20
1.5. ¿Qué es un contenedor? 20
1.6. Analogía con los contenedores de transporte marítimo 21
1.7. Diferencias entre contenedores y máquinas virtuales 21
1.8. Arquitectura de Docker 22
1.9. Cliente de Docker 23
1.9.1. Docker CLI 25
1.9.2. Docker Compose 25
1.10. Docker Engine 26
1.10.1. Docker Engine API 27
1.10.2. Docker Daemon 29
1.11. Container Runtime 29
1.11.1. containerd 29
1.11.2. runc 30
1.12. Docker Registry 31
1.12.1. Docker Hub 31
1.12.2. Otros registros 31
1.13. Objetos de Docker 32
1.13.1. Imágenes 32
1.13.2. Contenedores 32
1.13.3. Volúmenes 34
1.13.4. Redes 34
1.14. Orquestación de contenedores 35
1.15. Organizaciones y estándares 36
1.15.1. Open Container Initiative (OCI) 37
1.15.2. Cloud Native Computing Foundation (CNCF) 37
1.16. Alternativas a Docker 38
CAPÍTULO 2. Instalación de Docker 39
2.1. Docker Engine Community 39
2.2. Instalación de Docker Engine en Linux 40
2.2.1. Métodos de instalación en Ubuntu 40
2.2.2. Instalación en Ubuntu utilizando el script oficial 40
2.2.3. Instalación en Ubuntu desde los repositorios oficiales de Docker 41
2.2.4. Pasos posteriores a la instalación en Linux 46
2.3. Instalación de Docker Desktop en Windows 10 47
2.3.1. Instalación de Docker Desktop utilizando WSL 2 como backend 48
2.4. Instalación de Docker Engine en Windows Server 54
2.5. Instalación de Docker Desktop en macOS 56
2.6. Play with Docker 59
CAPÍTULO 3. Imágenes Docker 61
3.1. ¿Qué es una imagen Docker? 61
3.2. ¿Qué es un repositorio de imágenes? 61
3.3. ¿Qué es un tag? 63
3.4. ¿Qué es el digest de una imagen? 64
3.5. ¿Qué es el namespace de un repositorio? 65
3.6. ¿Qué es un registry? 66
3.7. Docker Hub 67
3.7.1. Repositorios de imágenes oficiales 68
3.7.2. Repositorios de imágenes de organizaciones verificadas 70
3.7.3. Repositorios de imágenes de la comunidad 71
3.8. El archivo Dockerfile 71
3.9. Creación de una imagen a partir de un archivo Dockerfile 82
3.10. Cómo publicar una imagen en Docker Hub 86
3.11. Capas de una imagen 90
3.12. Soporte para múltiples arquitecturas 100
3.13. Formato de las imágenes Docker 102
3.14. Buscar imágenes en Docker Hub – docker search 103
3.14.1. Buscar imágenes por nombre 104
3.14.2. Buscar imágenes utilizando filtros 105
3.15. Administración de imágenes – docker image 106
3.16. Descargar imágenes – docker pull 109
3.16.1. Descargar imágenes desde Docker Hub 110
3.16.2. Descargar imágenes desde un registry diferente a Docker Hub 111
3.17. Mostrar imágenes – docker images 112
3.17.1. Mostrar las imágenes que tenemos descargadas 113
3.17.2. Mostrar las imágenes intermedias 114
3.17.3. Mostrar el identificador de las imágenes 114
3.17.4. Mostrar el digest de las imágenes 115
3.18. Eliminar imágenes – docker rmi 116
3.18.1. Eliminar una imagen por su tag 117
3.18.2. Eliminar una imagen por su identificador 118
3.18.3. Eliminar todas las imágenes excepto las dangling images 119
3.18.4. Eliminar las dangling images 120
3.18.5. Eliminar las imágenes que no están siendo utilizadas 120
3.19. Consultar el historial de una imagen – docker history 121
3.20. Mostrar información detallada – docker inspect 122
CAPÍTULO 4. Contenedores Docker 125
4.1. Ciclo de vida de un contenedor 125
4.2. Administración de contenedores – docker container 126
4.3. Creación y ejecución de contenedores – docker run 128
4.4. Hello World! 131
4.5. Obtener el listado de contenedores – docker ps 135
4.5.1. Obtener el listado de los contenedores que están en ejecución 136
4.5.2. Obtener el listado de todos los contenedores 137
4.5.3. Obtener el identificador de los contenedores que están en ejecución 138
4.5.4. Obtener el identificador de todos los contenedores 139
4.6. Ejecutar un comando dentro de un contenedor 139
4.7. Ejecutar un contenedor en modo interactivo 140
4.8. Eliminar contenedores – docker rm 144
4.8.1. Eliminar un contenedor que está detenido 145
4.8.2. Eliminar un contenedor que está en ejecución 146
4.8.3. Eliminar un contenedor y sus volúmenes anónimos asociados 146
4.8.4. Eliminar los contenedores que están detenidos 147
4.8.5. Eliminar los contenedores que están en ejecución y detenidos 147
4.9. Mostrar la salida estándar de un contenedor – docker logs 147
4.10. Creación de un contenedor en segundo plano 149
4.11. Publicar los puertos de un contenedor 152
4.11.1. Opción -p, –publish 153
4.11.2. Opción -P, –publish-all 155
4.12. Cómo conectarnos a un contenedor en ejecución 156
4.12.1. docker attach 156
4.12.2. docker exec 158
4.13. Copiar archivos y directorios – docker cp 160
4.14. Cómo detener un contenedor – docker stop 165
4.15. Cómo iniciar un contenedor – docker start 167
4.16. Políticas de reinicio 168
CAPÍTULO 5. Almacenamiento en Docker 170
5.1. Almacenamiento en Docker 170
5.2. Bind mounts 171
5.3. Formas de crear un bind mount en un contenedor 172
5.4. Crear un bind mount de solo lectura 175
5.5. Cómo crear las rutas de los directorios en un bind mount 176
5.6. Ejemplo para compartir el código fuente de una aplicación 178
5.7. Ejemplo para compartir un archivo de configuración 181
5.8. Volúmenes 183
5.9. Administración de volúmenes – docker volume 185
5.10. Creación de un volumen 186
5.10.1. Creación de un volumen con el comando docker volume create 186
5.10.2. Creación de un volumen al crear un contenedor con docker run 187
5.11. Inspeccionar un volumen 192
5.12. Obtener el listado de volúmenes 193
5.13. Eliminar volúmenes que no están en uso 195
5.14. Eliminar volúmenes 196
5.15. Ejemplo de creación de un contenedor con MySQL 197
5.15.1. Creación de un contenedor MySQL con un volumen anónimo 197
5.15.2. Creación de un contenedor MySQL con un volumen con nombre 199
5.15.3. Inicializar un contenedor de MySQL con una base de datos 204
CAPÍTULO 6. Redes en Docker 208
6.1. Redes en Docker 208
6.1.1. Container Network Model (CNM) 208
6.1.2. libnetwork 209
6.1.3. Drivers de red 209
6.2. Redes de tipo bridge 214
6.3. Administración de redes – docker network 215
6.4. Obtener el listado de redes 216
6.5. Creación de una red 219
6.6. Conectar un contenedor a una red 224
6.6.1. Con el comando docker network connect 224
6.6.2. Con la opción –network cuando se crea un contenedor 227
6.7. Desconectar un contenedor de una red 230
6.8. Inspeccionar una red 230
6.9. Eliminar las redes que no están en uso 233
6.10. Eliminar redes 234
6.11. Cómo conectar un contenedor Adminer con MySQL 234
6.11.1. Utilizando enlaces entre contenedores con la opción –link 235
6.11.2. Utilizando una red bridge definida por el usuario 241
6.12. Cómo conectar WordPress, MySQL y phpMyAdmin 244
CAPÍTULO 7. Docker Compose 251
7.1. ¿Qué es Docker Compose? 251
7.1.1. La especificación Compose 251
7.1.2. La implementación Docker Compose 252
7.2. Instalación de Docker Compose v2 253
7.3. El archivo de configuración de Docker Compose 254
7.3.1. version 255
7.3.2. services 256
7.3.3. volumes 263
7.3.4. networks 264
7.3.5. configs 266
7.3.6. secrets 267
7.4. Comandos de docker compose 269
7.5. Ejemplo de un servicio Apache HTTP Server 271
7.6. Ejemplo de un servicio MySQL 274
7.7. Cómo utilizar archivos con variables de entorno 278
7.8. Ejemplo de una aplicación con dos servicios 280
7.9. Despliegue de una aplicación WordPress 286
7.10. Creación de un entorno de desarrollo LAMP 289
7.11. Creación de un entorno de desarrollo LEMP 294
7.12. Repositorio con proyectos de ejemplo 298
ANEXO A. docker system 299
Valoraciones
No hay valoraciones aún.