Kitabı oku: «Aprender Docker, un enfoque práctico», sayfa 5
2.4. Instalación de Docker Engine en Windows Server
En los sistemas operativos Windows Server, no vamos a poder instalar Docker Engine Community Edition (CE); solo podremos instalar la versión empresarial Mirantis Container Runtime (MCR). Además, esta versión solo dispone de soporte a partir de Windows Server 2019.
Mirantis nos proporciona un script para realizar la instalación de MCR de una forma muy sencilla. Solo tenemos que abrir una consola de PowerShell como administrador y ejecutar los siguientes comandos.
En primer lugar, descargamos el script install.ps1
, de la web oficial de Mirantis:
Configuramos una directiva de ejecución de PowerShell para poder ejecutar el script que hemos descargado en la sesión actual. Este paso es opcional:
-ExecutionPolicy RemoteSigned
. Esta directiva de ejecución requiere que los scripts que se han descargado de Internet estén firmados por una entidad de confianza.
-Scope Process.
Este ámbito hace que la configuración elegida solo afecte a la sesión actual y los cambios se eliminen al cerrar la sesión de PowerShell.
-Force
. Esta opción suprime todas las solicitudes de confirmación.
Ejecutamos el script de instalación:
Puede encontrar una descripción más detallada del proceso de instalación en la web oficial de Mirantis:
Comprobación de la instalación
Para comprobar que la instalación se ha realizado de forma correcta, podemos ejecutar el comando docker version
, que nos muestra información del cliente y del servicio Docker daemon:
1. Indica que estamos utilizando el cliente de Mirantis Container Runtime.
2. Señala que estamos utilizando el servidor de Mirantis Container Runtime.
2.5. Instalación de Docker Desktop en macOS
Docker Desktop también está disponible para el sistema operativo macOS. En este caso, la aplicación solo tiene soporte para ejecutar contenedores Linux, que se ejecutan en una máquina virtual ligera. El componente encargado de ejecutar los contenedores es HyperKit, que es un hipervisor que hace uso del Hypervisor.framework de macOS.
A la hora de instalar Docker Desktop en el sistema operativo macOS, debemos tener en cuenta cuál es la arquitectura del procesador del equipo, ya que los equipos Mac pueden tener procesadores con chip de Intel (arquitectura amd64) o chip de Apple (arquitectura arm64).
Requisitos mínimos del sistema para un Mac con chip de Apple (arm64)
En este caso, el único requisito es que debe instalar Rosetta 2. Puede instalarlo ejecutando el siguiente comando desde la línea de comandos:
Requisitos mínimos del sistema para un Mac con chip de Intel (amd64)
Vamos a necesitar que el equipo cumpla los siguientes requisitos:
Sistema operativo macOS con la versión 10.14 o superior.
Al menos, debe tener 4 GB de memoria RAM.
Instalación de Docker Desktop en macOS
1. En primer lugar, tendremos que descargar y ejecutar el instalador de Docker Desktop para macOS, que está disponible desde la web oficial o desde Docker Hub. Tendrá que seleccionar el instalador que se corresponda con la arquitectura del procesador de su equipo.
2. Le aparecerá una ventana, donde tiene que arrastrar el icono de Docker a la carpeta de aplicaciones.
Figura 2.6. Este es el paso donde hay que copiar la aplicación Docker a la carpeta de aplicaciones.
3. Cuando finalice el proceso de copia de Docker Desktop a la carpeta de aplicaciones del sistema, tenemos que buscar la aplicación Docker y abrirla. Cuando la aplicación se inicie por primera vez, mostrará un tutorial de iniciación.
4. En la barra de menús de estado, aparecerá el icono de la ballena de Docker, que nos ayuda a conocer el estado del servicio y a realizar algunas operaciones, como acceder a la configuración o reiniciar el servicio.
Figura 2.7. Icono de Docker en la barra de menús de estado y menú contextual.
Puede encontrar una descripción más detallada del proceso de instalación de Docker Desktop para macOS en la web oficial de Docker:
Opciones de configuración de Docker Desktop
Para acceder a las opciones de configuración de Docker Desktop para macOS, hay que mostrar el menú contextual que aparece al pulsar sobre el icono de Docker de la barra de estado. En ese menú, tenemos que seleccionar la opción «Preferences».
Las opciones de configuración están clasificadas en cinco grupos:
General.
Resources.
Docker Engine.
Experimental Features.
Kubernetes.
En la instalación por defecto, la opción de iniciar Docker Desktop automáticamente al arrancar el sistema está desactivada. Si queremos activarla, tenemos que acceder a la configuración general y activar el checkbox de la opción «Start Docker Desktop when you log in».
Figura 2.8. Configuración general de la aplicación Docker Desktop 3.6.0 para macOS.
Comprobación de la instalación
Para comprobar que la instalación se ha realizado de forma correcta, podemos ejecutar el comando docker version
que nos muestra información del cliente Docker y del servicio Docker daemon:
1. Indica el sistema operativo y la arquitectura donde se está ejecutando el cliente. En ese caso, aparece que el cliente se ejecuta en el sistema operativo Darwin, en una arquitectura amd64
. Darwin es un sistema operativo basado en UNIX y es el componente principal de macOS.
2. Señala el sistema operativo y la arquitectura donde se está ejecutando el servicio Docker daemon. En este caso, se ejecuta en el sistema operativo Linux en una arquitectura amd64
.
2.6. Play with Docker
Existe una forma muy sencilla de utilizar Docker sin tener que realizar el proceso de instalación en una máquina. Se trata del proyecto Play with Docker (PWD), un proyecto desarrollado por Marcos Lilljedhal y Jonathan Leibiusky, que cuenta con el apoyo de Docker, Inc.
Este proyecto permite ejecutar los comandos de Docker desde un navegador web. Al acceder a la web, nos aparecerá un terminal de Alpine Linux, donde es posible crear imágenes, contenedores e incluso un cluster de Docker Swarm. Es una buena opción para aquellos usuarios que quieran iniciarse en Docker y deseen experimentar un poco:
CAPÍTULO 3
Imágenes Docker
3.1. ¿Qué es una imagen Docker?
Las imágenes Docker son la base de los contenedores Docker. Un contenedor se crea a partir de una imagen; por lo tanto, podemos decir que las imágenes son como unas plantillas de solo lectura que utilizamos para crear contenedores. Al crear un contenedor, la imagen se convierte en el sistema de archivos raíz del contenedor.
Las imágenes no tienen estado y su contenido es inmutable. Están formadas por la unión de múltiples capas o layers, donde cada una contiene las diferencias que existen entre ella misma y la capa anterior. La capa base es la primera capa que se utiliza para crear una imagen. A partir de la capa base, se van aplicando todos los cambios que contienen cada una de las capas. La unión de todas las capas forma el sistema de archivos que utilizará el contenedor.
Las imágenes se pueden crear a partir de un archivo Dockerfile
, o también se pueden crear a partir del estado de un contenedor con el comando docker commit
. Las buenas prácticas recomiendan crear las imágenes a partir de archivos Dockerfile
. Esto permite que cualquier usuario pueda conocer cómo se ha creado la imagen y cuál es su contenido.
Para compartir las imágenes con otros usuarios, se pueden publicar en un registry. El registry oficial de Docker es Docker Hub. Aunque también es posible utilizar otros servicios de registry, así como crear nuestro propio registry privado.
Las imágenes Docker cumplen la especificación del formato de imágenes desarrollado por la OCI (Open Container Initiative). Se trata de un estándar abierto cuyo objetivo es permitir la creación de herramientas que hagan uso de este formato de imágenes, para que las tecnologías de contenedores no se hallen vinculadas a una empresa ni a un proyecto específico.
3.2. ¿Qué es un repositorio de imágenes?
Un repositorio es un grupo de imágenes que están agrupadas bajo el mismo nombre. Para diferenciar las imágenes del mismo repositorio, se utilizan etiquetas o tags. A menudo, se suele confundir el nombre del repositorio con el nombre de la imagen, así que vamos a tratar de explicar la diferencia entre ambos con un ejemplo.
En Docker Hub, existe un repositorio oficial llamado mysql
, que contiene imágenes con diferentes versiones del sistema gestor de bases de datos relacionales MySQL. Las imágenes que forman este repositorio están etiquetadas con versiones como 8.0
, 5.7
o latest,
entre otras.
En este ejemplo, el nombre del repositorio sería:
mysql
Mientras que los nombres de las imágenes serían:
mysql:latest
mysql:8.0
mysql:5.7
Figura 3.1. Ejemplo de un Registry con tres repositorios de imágenes.
Podemos establecer una clasificación de repositorios de imágenes en función del lugar donde están almacenados. Según este criterio, podemos diferenciar dos tipos de repositorios de imágenes:
Repositorios locales. Estos repositorios están almacenados de forma local en una máquina donde se ha instalado el componente Docker Engine o Docker Desktop. Están formados por los repositorios de imágenes que se han creado de forma local en la máquina y por los repositorios que se han descargado de un servicio de registry.
Repositorios remotos. Son los repositorios de imágenes que están almacenados en un servicio de registry, como Docker Hub. Dentro de los repositorios remotos, podemos diferenciar entre repositorios públicos y privados.
Públicos. Son repositorios de imágenes que no tienen ninguna restricción de acceso y están disponibles a cualquier persona a nivel global.
Privados. Son repositorios de imágenes que solo están disponibles para los usuarios que los han creado, colaboradores o miembros de su organización.
3.3. ¿Qué es un tag?
Un tag es una etiqueta que se le asigna a una imagen dentro de un repositorio. Se utiliza para indicar la versión de una imagen y nos permite diferenciar, de una forma sencilla, las imágenes que forman parte de un repositorio.
En el momento de escribir este libro, podemos encontrar las siguientes etiquetas dentro del repositorio ubuntu
de Docker Hub:
21.10, impish, devel
21.04, hirsute, rolling
20.10, groovy
20.04, focal, latest
El nombre de la imagen está formado por el nombre del repositorio y la etiqueta de la imagen, de modo que la imagen ubuntu:20.04
hace referencia a la imagen que está etiquetada con el tag 20.04
dentro del repositorio ubuntu
.
La etiqueta latest
es una etiqueta especial utilizada para indicar cuál será la imagen por defecto que se va a descargar del repositorio cuando no se indique una etiqueta de forma explícita en el comando docker pull
o docker run
.
Una imagen puede tener varias etiquetas; por lo tanto, en el ejemplo del repositorio ubuntu
de Docker Hub, la imagen ubuntu:20.04
, ubuntu:focal
y ubuntu:latest
hacen referencia a la misma imagen.
Otra de las etiquetas que podemos encontrar entre las imágenes de un repositorio es la etiqueta slim
. Esta etiqueta se utiliza para indicar que la imagen contiene los mínimos paquetes necesarios para poder ejecutar la aplicación que contiene. Las imágenes con la etiqueta slim
suelen ser más ligeras que el resto.
Ejemplo de una imagen con varias etiquetas
En este ejemplo, vamos a demostrar que una imagen puede tener varias etiquetas. Para ello, vamos a descargar, con el comando docker pull
, las imágenes del repositorio ubuntu
de Docker Hub que están etiquetadas como latest
, 20.04
y focal
:
Ejecutamos el comando docker images
para obtener un listado de todas las imágenes que tenemos descargadas en la máquina donde estamos ejecutando Docker:
Observe cómo las imágenes que están etiquetadas con las versiones 20.04
, focal
y latest
comparten el mismo identificador de imagen (c29284518f49
). Esto quiere decir que, realmente, solo tenemos una imagen que está etiquetada con tres tags diferentes.
3.4. ¿Qué es el digest de una imagen?
Un digest es un identificador inmutable de una imagen. Es un hash de 64 caracteres que se obtiene al aplicar el algoritmo criptográfico SHA256 sobre el contenido del archivo de manifiesto de la imagen. El archivo de manifiesto se crea de forma automática cuando la imagen se publica en un Docker Registry de tipo v2 o se puede crear de manera explícita, con el comando docker manifest
.
Una imagen puede tener múltiples tags, pero solo puede tener un digest. Una de las ventajas que nos aporta el uso del digest es que permite identificar una imagen de forma permanente. Un digest siempre hará referencia a la misma imagen, mientras que un tag puede hacer referencia a diferentes imágenes a lo largo del tiempo.
Imagine que la imagen ubuntu:21.04
recibe actualizaciones de seguridad de forma periódica y, cada cierto tiempo, se crea una nueva imagen con ese mismo tag. Después de aplicar las actualizaciones, el contenido de la imagen va cambiando y su digest será totalmente diferente; sin embargo, el tag sigue siendo el mismo.
Cuando descargamos una imagen de Docker Hub, se muestra el digest de la imagen; por ejemplo, vamos a descargar la imagen ubuntu:21.04
para obtener su digest:
1. Este hash es el digest de la imagen ubuntu:21.04
.
El digest completo de la imagen ubuntu:21.04
es el siguiente:
3.5. ¿Qué es el namespace de un repositorio?
Un namespace o espacio de nombres permite agrupar un conjunto de repositorios de imágenes bajo el mismo nombre. Se pueden utilizar para organizar los repositorios dentro de un registro de contenedores. Otra de las ventajas que ofrecen es que permiten que puedan existir repositorios con el mismo nombre en espacios de nombres diferentes.
La ruta completa que identifica de forma única un repositorio o una imagen dentro de un registro se compone de los siguientes elementos y en el mismo orden en el que aparecen a continuación:
Observe que el namespace siempre aparece entre el nombre del registro y el repositorio. El puerto que utiliza el registro, el tag y el digest son opcionales. Cuando no se indica ni el tag ni el digest, estamos haciendo referencia a un repositorio de imágenes y, cuando se incluye alguno de los dos, estamos haciendo referencia a una imagen específica dentro de un repositorio.
Namespaces utilizados en Docker Hub
En Docker Hub, existen tres tipos de repositorios de imágenes y cada uno de ellos utiliza un namespace diferente:
Los repositorios de imágenes oficiales utilizan el namespace library
:
Ejemplos:
docker.io/library/httpd
docker.io/library/python store
, seguido del nombre de la organización:
Los repositorios de imágenes de organizaciones verificadas utilizan el namespace store
, seguido del nombre de la organización:
Ejemplos:
docker.io/store/oracle/mysql-enterprise-server
docker.io/store/elastic/heartbeat
Los repositorios de imágenes de la comunidad utilizan el nombre del usuario de Docker Hub:
Ejemplos:
docker.io/pihole/pihole
docker.io/jupyter/datascience-notebook
Namespaces anidados
Docker Hub no permite definir espacios de nombres anidados, pero algunos registros de contenedores sí. Los espacios de nombres anidados pueden ser útiles para organizar los equipos de desarrollo de una organización o para separar los entornos de desarrollo, pruebas y producción.
Suponga que, en su organización, existen dos equipos de desarrollo que van a utilizar el mismo registro de contenedores y ambos necesitan trabajar con sus propios repositorios de forma independiente. Si el registro que estamos utilizando permite definir espacios de nombres anidados, podemos crear un espacio para cada equipo dentro del espacio de la organización; por ejemplo, podríamos crear los siguientes espacios de nombres:
organization/team-a/
organization/team-b/
Si, en este mismo ejemplo, quisiéramos separar los entornos de desarrollo, pruebas y producción, podríamos crear un espacio de nombres para cada uno de ellos:
organization/dev/team-a/
organization/dev/team-b/
organization/staging/team-a/
organization/staging/team-b/
organization/prod/team-a/
organization/prod/team-b/
3.6. ¿Qué es un registry?
Un registry, o registro de contenedores, es un servicio que almacena repositorios de imágenes para facilitar su distribución.
Los usuarios pueden utilizar este servicio para descargar y publicar imágenes. Permite que los equipos de desarrollo puedan compartir sus imágenes de forma fácil y segura con otros desarrolladores del equipo. En los sistemas de integración y entrega continua (CI/CD), el registry es un componente indispensable dentro del flujo de trabajo.
Un registry utiliza una arquitectura cliente-servidor, donde una aplicación cliente se comunica con el registry a través de una API HTTP. Existe una especificación de la OCI que define cómo tiene que ser la API para facilitar y estandarizar la distribución de contenido a través de los servicios de registry. Esta especificación se conoce como OCI Distribution Specification.
Los registros de contenedores pueden ser públicos o privados:
Registros públicos. Estos registros están gestionados por un proveedor externo y están alojados en la infraestructura del proveedor. Es la solución ideal cuando buscamos una solución sencilla y lista para empezar a trabajar, sin tener que preocuparnos de ninguna configuración específica, ni de gestionar la infraestructura sobre la que se ejecuta.
Los registros públicos pueden ofrecer a sus usuarios repositorios públicos y privados.
El registro de contenedores oficial de Docker es Docker Hub, pero también existen otros registros públicos como:
Amazon Elastic Container Registry.
Azure Container Registry.
Google Cloud Container Registry.
Registros privados. Estos registros son gestionados por la propia organización que hará uso de ellos. Pueden estar alojados en la infraestructura física de la organización, lo que se conoce con el término on-premise, o también pueden estar alojados en la infraestructura cloud de un proveedor externo.
Un registro privado le proporciona a la organización un mayor control sobre el lugar donde se almacenan las imágenes, cómo acceder a ellas y cómo integrar el registro en sus flujos de trabajo.
Para crear nuestro propio registro privado, podemos utilizar el proyecto Harbor o un repositorio oficial de Docker Hub llamado registry.
Ücretsiz ön izlemeyi tamamladınız.