Kitabı oku: «Aprender Docker, un enfoque práctico»

Yazı tipi:



Aprender Docker, un enfoque práctico

Primera edición, 2022

© 2022 José Juan Sánchez Hernández

© MARCOMBO, S.L. 2022

www.marcombo.com

Diseño de la cubierta: ENEDENÚ DISEÑO GRÁFICO

Corrección: Mónica Muñoz

Maquetación: Reverté-Aguilar

Directora de producción: M.a Rosa Castillo

Docker y el logotipo de Docker son marcas comerciales o marcas comerciales registradas de Docker, Inc. en los Estados Unidos y/o en otros países. Docker, Inc. y otras partes también pueden tener derechos de marca registrada en otros términos utilizados en este libro.

Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a Cedro (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra.

ISBN: 978-84-267-3448-8

Producción del ePub: booqlab

A mis padres, José y María; a mi mujer, Noelia y a mi hija, María

Í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

1.9.1. Docker CLI

1.9.2. Docker Compose

1.10. Docker Engine

1.10.1. Docker Engine API

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

1.13.3. Volúmenes

1.13.4. Redes

1.14. Orquestación de contenedores

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

2.3.1. Instalación de Docker Desktop utilizando WSL 2 como backend

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

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?

3.4. ¿Qué es el digest de una imagen?

3.5. ¿Qué es el namespace de un repositorio?

3.6. ¿Qué es un registry?

3.7. Docker Hub

3.7.1. Repositorios de imágenes oficiales

3.7.2. Repositorios de imágenes de organizaciones verificadas

3.7.3. Repositorios de imágenes de la comunidad

3.8. El archivo Dockerfile

3.9. Creación de una imagen a partir de un archivo Dockerfile

3.10. Cómo publicar una imagen en Docker Hub

3.11. 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

3.14.1. Buscar imágenes por nombre

3.14.2. Buscar imágenes utilizando filtros

3.15. Administración de imágenes – docker image

3.16. Descargar imágenes – docker pull

3.16.1. Descargar imágenes desde Docker Hub

3.16.2. Descargar imágenes desde un registry diferente a Docker Hub

3.17. Mostrar imágenes – docker images

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

3.18. Eliminar imágenes – docker rmi

3.18.1. Eliminar una imagen por su tag

3.18.2. Eliminar una imagen por su identificador

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

3.20. Mostrar información detallada – docker inspect

CAPÍTULO 4 Contenedores Docker

4.1. Ciclo de vida de un contenedor

4.2. Administración de contenedores – docker container

4.3. Creación y ejecución de contenedores – docker run

4.4. Hello World!

4.5. Obtener el listado de contenedores – docker ps

4.5.1. Obtener el listado de los contenedores que están en ejecución

4.5.2. Obtener el listado de todos los contenedores

4.5.3. Obtener el identificador de los contenedores que están en ejecución

4.5.4. Obtener el identificador de todos los contenedores

4.6. Ejecutar un comando dentro de un contenedor

4.7. Ejecutar un contenedor en modo interactivo

4.8. Eliminar contenedores – docker rm

4.8.1. Eliminar un contenedor que está detenido

4.8.2. Eliminar un contenedor que está en ejecución

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

4.10. Creación de un contenedor en segundo plano

4.11. Publicar los puertos de un contenedor

4.11.1. Opción -p, --publish

4.11.2. Opción -P, --publish-all

4.12. Cómo conectarnos a un contenedor en ejecución

4.12.1. docker attach

4.12.2. docker exec

4.13. Copiar archivos y directorios – docker cp

4.14. Cómo detener un contenedor – docker stop

4.15. Cómo iniciar un contenedor – docker start

4.16. Políticas de reinicio

CAPÍTULO 5 Almacenamiento en Docker

5.1. Almacenamiento en Docker

5.2. Bind mounts

5.3. Formas de crear un bind mount en un contenedor

5.4. Crear un bind mount de solo lectura

5.5. Cómo crear las rutas de los directorios en un bind mount

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

5.9. Administración de volúmenes – docker volume

5.10. Creación de un volumen

5.10.1. Creación de un volumen con el comando docker volume create

5.10.2. Creación de un volumen al crear un contenedor con docker run

5.11. Inspeccionar un volumen

5.12. Obtener el listado de volúmenes

5.13. Eliminar volúmenes que no están en uso

5.14. Eliminar volúmenes

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

5.15.3. Inicializar un contenedor de MySQL con una base de datos

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

6.2. Redes de tipo bridge

6.3. Administración de redes – docker network

6.4. Obtener el listado de redes

6.5. Creación de una red

6.6. Conectar un contenedor a una red

6.6.1. Con el comando docker network connect

6.6.2. Con la opción --network cuando se crea un contenedor

6.7. Desconectar un contenedor de una red

6.8. Inspeccionar una red

6.9. Eliminar las redes que no están en uso

6.10. Eliminar redes

6.11. Cómo conectar un contenedor Adminer con MySQL

6.11.1. Utilizando enlaces entre contenedores con la opción --link

6.11.2. Utilizando una red bridge definida por el usuario

6.12. Cómo conectar WordPress, MySQL y 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

7.3. El archivo de configuración de Docker Compose

7.3.1. version

7.3.2. services

7.3.3. volumes

7.3.4. networks

7.3.5. configs

7.3.6. secrets

7.4. Comandos de Docker Compose

7.5. Ejemplo de un servicio Apache HTTP Server

7.6. Ejemplo de un servicio MySQL

7.7. Cómo utilizar archivos con variables de entorno

7.8. Ejemplo de una aplicación con dos servicios

7.9. Despliegue de una aplicación WordPress

7.10. Creación de un entorno de desarrollo LAMP

7.11. Creación de un entorno de desarrollo LEMP

7.12. Repositorio con proyectos de ejemplo

ANEXO A docker system

Lista de siglas y acrónimos


ACI Azure Container Instances
API Application Programming Interface
CI/CD Continuous Integration/Continuous Delivery
CLI Command Line Interface
CMS Content Management System
CNCF Cloud Native Computing Foundation
CNM Container Network Model
CRI Container Runtime Interface
DCE Docker Community Edition
DEE Docker Enterprise Edition
ECS Elastic Container Service
HTTP Hypertext Transfer Protocol
HTTPS Hypertext Transfer Protocol Secure
IPAM Internet Protocol Address Management
ISO International Organization for Standardization
JSON JavaScript Object Notation
MAC Media Access Control
MCR Mirantis Container Runtime
OCI Open Container Initiative
PaaS Platform as a Service
RC Release Candidate
REST Representational State Transfer
SDK Software Development Kit
SDN Software Defined Networking
SLAT Second Level Address Translation
UUID Universally Unique Identifier
VM Virtual Machine
VMM Virtual Machine Monitor
WSL Windows Subsystem for Linux

Acerca de este libro

Este libro está dirigido a estudiantes, profesores, profesionales y a todas aquellas personas que quieran conocer qué es la tecnología de contenedores Docker y todavía no sepan cómo empezar a utilizarla en su entorno de trabajo.

El libro está dividido en siete capítulos, que lo ayudarán a tener una visión global de todos los componentes que forman el ecosistema Docker y a conocer con detalle cómo utilizar cada uno de los principales objetos de Docker: imágenes, contenedores, volúmenes y redes.

En el primer capítulo, encontrará los conceptos básicos que debe conocer antes de entrar en materia. La lectura de este capítulo es fundamental para entender con mayor claridad el resto del libro. El capítulo 2 lo ayudará a conocer los detalles del proceso de instalación de Docker Engine para Linux y Docker Desktop para Windows y macOS.

El capítulo 3 está dedicado al estudio de las imágenes Docker. Aquí aprenderemos lo que es un repositorio, un tag o un digest de una imagen. Veremos cómo podemos crear una imagen, cómo publicarla en Docker Hub y todos los comandos básicos para poder gestionar las imágenes en un host de Docker.

En el capítulo 4, estudiaremos los comandos necesarios para gestionar el ciclo de vida básico de un contenedor. En el capítulo 5, se analizan todas las posibilidades que nos ofrece Docker para implementar persistencia de datos entre un contenedor y el host de Docker. Aprenderemos las diferencias entre un bind mount y un volumen, además de los comandos necesarios para gestionarlos.

En el capítulo 6, estudiaremos los diferentes tipos de redes que existen en Docker y los comandos básicos para poder gestionarlas. El último capítulo está dedicado a la herramienta Docker Compose, donde se explica cómo gestionar y ejecutar aplicaciones con múltiples contenedores Docker de una forma muy sencilla.

CAPÍTULO 1
Conceptos básicos
1.1. ¿Qué es Docker?

Cuando hablamos de Docker, podemos referirnos a la tecnología que permite desarrollar, desplegar y ejecutar aplicaciones en entornos aislados denominados «contenedores». O también podemos referirnos a la empresa Docker, Inc., que es la que desarrolla esta tecnología.

1.1.1. Docker como tecnología de contenedores

Docker permite empaquetar las aplicaciones en contenedores que incluyen todo lo necesario para que se puedan ejecutar en un entorno de manera aislada. Cada contenedor almacena el código fuente de la aplicación, los archivos de configuración y todas las dependencias software que necesita. Esta estrategia permite que las aplicaciones se puedan ejecutar de la misma manera sobre cualquier infraestructura que tenga soporte para Docker, tanto de forma local como en la nube.

Con la tecnología de contenedores para aplicaciones, ya no es necesario preocuparse por el software que está instalado en la máquina donde se ejecuta el contenedor, porque todo lo que necesita la aplicación está incluido dentro del propio contenedor. Esta forma de trabajar resuelve el problema de «it works on my machine», donde una aplicación puede funcionar correctamente en el entorno de desarrollo, pero tiene errores en el entorno de producción, porque los dos entornos no son idénticos y contienen versiones de software diferentes.

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. Esto ha permitido acelerar el proceso de desarrollo de las aplicaciones, ha facilitado la forma de distribuirlas y ha acelerado la automatización del despliegue en producción.

1.1.2. Docker, Inc.

Docker, Inc. es una empresa tecnológica estadounidense que fue fundada por Solomon Hykes en 2008 como dotCloud. En sus orígenes, ofrecía servicios de PaaS (Platform as a Service) y, en marzo de 2013, liberó como un proyecto open source un componente de su plataforma al que llamó Docker. Este proyecto tuvo una gran aceptación y supuso un cambio significativo en la forma de desarrollar, distribuir y desplegar software.

En octubre de 2013, dotCloud pasó a llamarse Docker, Inc. y, a partir de ese momento, fue cuando la empresa decidió centrarse en el desarrollo de su tecnología de contenedores.

1.2. ¿Qué ventajas nos aporta el uso de Docker?

Las principales ventajas que nos aporta el uso de Docker son las siguientes:

Soluciona el problema «it works on my machine».

Permite tener un entorno de desarrollo limpio, seguro y portátil.

Facilita la automatización de pruebas, integración y empaquetado.

Posibilita empaquetar una aplicación con todas las dependencias que necesita (código fuente, librerías, configuración, etc.) para ser ejecutada en cualquier plataforma.

Se eliminan inconsistencias entre los entornos de desarrollo, pruebas y producción.

El proceso de despliegue es rápido y repetible.

1.3. Breve historia de las tecnologías de aislamiento

Antes de Docker, ya existían implementaciones de aislamiento de recursos, como chroot (1982), FreeBSD jail (2000), Solaris Zones (2004), cgroups (2006) o Linux Containers (LXC), en el año 2008.

En primer lugar, apareció la llamada del sistema chroot, que fue desarrollada para la versión 7 de UNIX (1979) y, posteriormente, se incorporó a la versión 4 de BSD (1980). Esta operación permite cambiar el directorio raíz del sistema de archivos de un proceso y de sus procesos hijos aislando, de esta manera, su ejecución e impidiendo que puedan acceder a los archivos que están por encima del nuevo directorio raíz.

Años más tarde, FreeBSD se basó en la idea de chroot para desarrollar FreeBSD jail (2000), una implementación que permitía dividir un sistema en varios subsistemas llamados «jaulas» o jails. Todas las jaulas comparten el mismo kernel del sistema operativo anfitrión. Cada jaula puede tener un directorio raíz aislado del resto de sistema de archivos, su propio grupo de usuarios, su propio nombre de host y su propia dirección IP.

En 2004, se liberó el proyecto Solaris Zones, que permitía aislar la ejecución de los procesos del resto del sistema metiéndolos en zonas o sandboxes. Cada zona se comporta como un servidor virtual completamente aislado.

En 2006, los ingenieros de Google empezaron a trabajar en lo que más tarde se llamaría cgroups o «grupos de control». Los grupos de control son un mecanismo que permiten controlar la asignación de recursos a los procesos. Permiten definir jerarquías en las que se agrupan los procesos y establecer cuáles serán los límites de uso de los recursos del sistema (CPU, memoria, red, etc.). Esta funcionalidad se integró en el kernel de Linux en la versión 2.6.24 aunque, años más tarde, fue rediseñada y la versión que se encuentra actualmente en el kernel es conocida como cgroup v2.

Linux Containers, o LXC (2008), es un método de virtualización a nivel de sistema operativo que permite ejecutar aplicaciones en entornos aislados que comparten el kernel de Linux del sistema operativo anfitrión. Utiliza las características del kernel de cgroups para controlar la asignación de recursos a los procesos y namespaces para supervisar a qué recursos pueden acceder los procesos.

Las primeras versiones de Docker utilizaban LXC para ejecutar contenedores, pero fue reemplazado por una herramienta interna a la que llamaron libcontainer. Actualmente, libcontainer forma parte de runc, un runtime de contenedores que cumple con las especificaciones OCI (Open Container Initiative) del que hablaremos más adelante.

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
653 s. 656 illüstrasyon
ISBN:
9788426734488
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi: