La base de los contenedores son las imágenes, los cuales están construidos por bloques. Vamos a ir viendo como manejarlas, modificarlas, crear, almacenar y compartir nuestras imágenes. También vamos a ver los repositorios que almacenan imágenes.
Qué es una imagen Docker
Una imagen Docker se compone de un sistema de archivos en capas una sobre la otra. En la base, es un sistema de archivos de arranque, bootfs, que se asemeja al típico sistema de archivos de arranque de Linux. Un usuario Docker, normalmente nunca interactuará con el sistema de archivos de arranque. De hecho, cuando un contenedor se inicia, se mueve a la memoria, y el sistema de archivos de arranque se desmonta para liberar la memoria RAM utilizada por la imagen de disco initrd.
Una imagen Docker se compone de un sistema de archivos en capas una sobre la otra. En la base, es un sistema de archivos de arranque, bootfs, que se asemeja al típico sistema de archivos de arranque de Linux. Un usuario Docker, normalmente nunca interactuará con el sistema de archivos de arranque. De hecho, cuando un contenedor se inicia, se mueve a la memoria, y el sistema de archivos de arranque se desmonta para liberar la memoria RAM utilizada por la imagen de disco initrd.
Esto hasta ahora es más o menos como una pila típica de virtualización Linux. De hecho, Docker provee capas desde un sistema de archivos raíz, rootfs, en la parte superior del sistema de archivos de arranque. Este rootfs puede ser uno o mas sistemas operativos (por ejemplo, en un sistema de archivos de Debian o Ubuntu).
En un arranque más tradicional Linux, el sistema de archivos raíz se monta de sólo lectura y luego cambia a lectura escritura, después de arrancar y realizar una comprobación de integridad. En el mundo Docker, sin embargo, el sistema de archivos raíz permanece en modo de sólo lectura y Docker se aprovecha de una unión de montaje para añadir más sistemas de ficheros de sólo lectura en el sistema de ficheros raíz. Una unión de montaje es un montaje que permite que varios sistemas de archivos puedan ser montados en un momento, pero parecen ser un sistema de archivos. La unión de montaje superpone los sistema de archivos uno encima de otro para que el sistema de archivos resultante pueda contener archivos y subdirectorios de cualquier o todos los sistemas de archivos subyacentes. Docker llama a cada uno de estos sistemas de archivos imágenes. Las imágenes se pueden superponer una encima de la otra. La imagen de abajo se llama imagen padre, y se puede recorrer cada capa hasta llegar a la parte inferior de la pila de imágenes donde la imagen final se llama la imagen base. Por último, cuando un contenedor se pone en marcha a partir de una imagen, Docker monta un sistema de ficheros de lectura escritura en la parte superior de las capas inferiores. Aquí es donde los procesos de nuestro contenedor Docker serán ejecutados.
Las capas del sistema de archivos de docker
Cuando Docker crea un contenedor por primera vez, la capa inicial de lectura y escritura esta vacía. Cuando se producen cambios, éstos se aplican a esta capa, por ejemplo, si desea cambiar un archivo, entonces ese archivo se copia desde la capa de sólo lectura inferior a la capa de lectura y escritura. Seguirá existiendo la versión de sólo lectura del archivo, pero ahora está oculto debajo de la copia.
Este patrón se llama tradicionalmente “copiar al escribir” y es una de las características que hace que Docker sea tan poderoso. Cada capa de sólo lectura de imagen es de sólo lectura; esta imagen nunca cambia. Cuando se crea un contenedor, Docker construye desde la pila de imágenes y luego agrega la capa de lectura y escritura en la parte superior. Esa capa, combinada con el conocimiento de las capas de imagen por debajo de ella y algunos datos de configuración, forman el contenedor. Los contenedores pueden ser cambiados, tienen estado y pueden iniciarse y detenerse. Ésto, y el marco de imágenes por capas, nos permite construir rápidamente imágenes y contenedores de ejecución con nuestras aplicaciones y servicios.
Listando imágenes docker
Para comenzar con las imágenes Docker y ver que imágenes tenemos disponibles en nuestro host Docker, podemos hacerlo utilizando el comando “docker images”.
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest e9ae3c220b23 3 weeks ago 187.9 MB
Podemos ver que tenemos una imagen, de un repositorio llamado Ubuntu. Esta imagen viene de cuando ejecutamos el comando “docker run” con la imagen Ubuntu, entonces se inició automáticamente un proceso de descarga de la imagen. La imagen ha sido descargada de un repositorio, las imágenes se almacenan dentro de repositorios y en los repositorios están los registros. El registro predeterminado es el registro público gestionado por Docker Inc. , Docker Hub.
El código del registro de Docker es de código abierto. También podemos ejecutar nuestro propio registro. Docker Hub también está disponible como producto comercial detrás de un cortafuegos llamado Docker Trusted Registry (Registro Docker de confianza).
Las imágenes locales se almacenan en nuestro Docker host en el directorio /var/lib/docker. Cada imagen, está dentro de un directorio nombrado por su controlador de almacenamiento, por ejemplo, aufs o devicemapper. También están todos los contenedores en el directorio /var/lib/docker/containers.
Docker Hub
Dentro de Docker Hub las imágenes se almacenan en repositorios. Podemos pensar en un repositorio de imágenes como en un repositorio Git. Contiene imágenes, capas y metadatos sobre esas imágenes.
Cada repositorio puede contener varias imágenes (por ejemplo, el repositorio de Ubuntu contiene imágenes para Ubuntu 12.04, 12.10, 13.04, 13.10 y 14.04). Vamos a ver como obtener otra imagen desde el repositorio Ubuntu ahora.
$ docker pull ubuntu:12.04
12.04: Pulling from library/ubuntu
b45376f323f5: Pull complete
23c388b926b6: Pull complete
10f1b5844a9c: Pull complete
2a7a952931ec: Pull complete
Digest: sha256:f41afd7e2c72502f3f9194b1a84abb8fc6148c6565ab8c38900d009ba80c2ef7
Status: Downloaded newer image for ubuntu:12.04
Hemos utilizado el comando “docker pull” para obtener la imagen de Ubuntu 12.04 desde el repositorio de Ubuntu. Si ejecutamos el comando “docker images” de nuevo veremos una nueva línea:
ubuntu 12.04 2a7a952931ec 3 weeks ago 136 MB
Decimos que Ubuntu es el sistema operativo Ubuntu, pero en realidad no es el sistema operativo completo. Es una versión muy reducida con lo básico para ejecutar la distribución.
Identificamos cada imagen dentro de ese repositorio con lo que Docker denomina etiquetas. Cada imagen está siendo catalogado por las etiquetas aplicadas a la misma, por ejemplo, 12.04, 12.10, y así sucesivamente. Cada etiqueta marca en conjunto una serie de capas de imágenes que representan una imagen específica (por ejemplo, la etiqueta 12.04 recoge a todas las capas de la imagen de Ubuntu 12.04). Esto nos permite almacenar más de una imagen dentro de un repositorio.
Podemos hacer referencia a una imagen específica dentro de un repositorio sufijo el nombre del repositorio con dos puntos y nombre de etiqueta, por ejemplo:
# docker run -t -i --name nuevo_contenedor ubuntu:12.04 /bin/bash
Esto ejecutará un contenedor con la imagen de Ubuntu:12.04, la cual es un sistema operativo Ubuntu 12.04.
Podemos ver que nuestra nueva imagen 12.04 aparece dos veces con el mismo ID en el resultado de “docker images”. Esto es porque la imágenes pueden tener más de una etiqueta. Esto hace que sea más fácil para ayudar a las imágenes de marca y hacer que sean más fáciles de encontrar. En este caso, el ID de imagen es en realidad un etiquetado con 12.04 y precise, el número de versión y el nombre en clave de la liberación de Ubuntu respectivamente.
Siempre es buena idea construir un contenedor con etiquetas específicas. De esa manera, sabremos exactamente cual es la fuente de nuestro contenedor.
Hay dos tipos de repositorios: repositorios de usuarios, que contienen las imágenes aportadas por los usuarios Docker, y repositorios de primer nivel, que son controlados por el equipo de Docker.
Un repositorio de usuario requiere un nombre de usuario y un repositorio, por ejemplo, jalapuente/miweb.
- Nombre de usuario: jalapuente
- Nombre de repositorio miweb
Alternativamente, un repositorio de nivel superior sólamente tiene un nombre como el repositorio de Ubuntu. Los repositorios de nivel superior son administrador por Docker Inc y por los proveedores seleccionados que proporcionan imágenes base, para poder construir sobre ellas (por ejemplo, el equipo de Fedora proporciona una imagen de fedora). Los repositorios de alto nivel también representan un compromiso por parte de los vendedores y Docker Inc de que las imágenes contenidas en ellas están bien construidas y seguras hasta la fecha.
Las imágenes aportadas por usuarios son construidas por los miembros de la comunidad Docker. Se deben utilizar bajo nuestro propio riesgo: no se validan o verifican en modo alguno por Docker Inc.
Obteniendo imágenes
Cuando ejecutamos un contenedor a partir de imágenes con el comando “docker run”, si la imagen no está almacenada localmente, entonces Docker la descargará desde Docker Hub. Por defecto, si no se específica una etiqueta específica, Docker descargará la última etiqueta, por ejemplo:
$ docker run -t -i --name nuevo_contenedor ubuntu /bin/bash
Descargará la imagen ubuntu:latest si no está ya presente en el host.
Alternativamente, podemos usar el comando “docker pull” para obtener las imágenes nosotros mismos de forma preventiva. Usando el comando “docker pull”, nos ahorra algún tiempo el lanzamiento de un contenedor de una nueva imagen. Vamos a ver que ahora como obtener la imagen base fedora:20.
$ docker pull fedora:20
Podemos ver esta nueva imagen en nuestro anfitrión Docker con el comando “docker images”. Esta vez, sin embargo, vamos a restringir nuestras imágenes para que sólo aparezcan las imágenes de fedora. Para ello, podemos especificar el nombre de la imagen después del comando imágenes Docker.
$ docker images fedora
Buscando imágenes
Podemos también buscar todas las imágenes públicas disponibles en Docker Hub usando el comando “docker search”
$ docker search aspnet
y nos aparecería una relación de todas las imágenes disponibles en Docker Hub que contengan la palabra “aspnet”.
También podríamos ver las imágenes disponibles en “https://hub.docker.com”. como resultado de la búsqueda nos devuelve, además de los nombres de repositorio, una descripción de la imagen. Las estrellas o popularidad de la imagen nos indican si es una imagen oficial y “automatizada”, es decir, si la imagen ha sido construida por un proceso automático.
No hay comentarios:
Publicar un comentario