He estado utilizando Docker durante varios meses para estructurar el proceso de desarrollo/entrega de proyectos web. Les propongo a los lectores de "Habr" la traducción de un artículo introductorio sobre Docker — .
¿Qué es Docker?
Docker es una plataforma abierta para desarrollar, entregar y operar aplicaciones. Docker está diseñado para facilitar el despliegue de tus aplicaciones. Con Docker, puedes separar tu aplicación de tu infraestructura y tratar la infraestructura como una aplicación gestionada. Docker ayuda a desplegar tu código más rápidamente, probar más rápido, lanzar aplicaciones más rápido y reducir el tiempo entre escribir y ejecutar código. Docker lo hace mediante una plataforma ligera de virtualización de contenedores, utilizando procesos y herramientas que ayudan a gestionar y desplegar tus aplicaciones.
En su núcleo, Docker permite ejecutar casi cualquier aplicación, aisladamente y de manera segura dentro de un contenedor. Este aislamiento seguro te permite ejecutar múltiples contenedores simultáneamente en un solo host. La naturaleza ligera del contenedor, que se ejecuta sin la sobrecarga de un hipervisor, te permite aprovechar al máximo tu hardware.
La plataforma y las herramientas de virtualización de contenedores pueden ser útiles en los siguientes casos:
- Embalaje de tu aplicación (y de los componentes utilizados) en contenedores Docker;
- Distribución y entrega de estos contenedores a tus equipos para desarrollo y pruebas;
- Despliegue de estos contenedores en tus entornos de producción, tanto en centros de datos como en la nube.
¿Para qué puedo usar Docker?
Despliegue rápido de tus aplicaciones
Docker es ideal para organizar el ciclo de desarrollo. Docker permite a los desarrolladores utilizar contenedores locales con aplicaciones y servicios. Esto, a su vez, facilita la integración con el proceso de integración y despliegue continuo (continuous integration and deployment workflow).
Por ejemplo, tus desarrolladores escriben código localmente y comparten su stack de desarrollo (conjunto de imágenes de Docker) con sus colegas. Cuando están listos, envían el código y los contenedores a un entorno de prueba y ejecutan las pruebas necesarias. Desde el entorno de prueba, pueden enviar el código y las imágenes a producción.
Despliegue y lanzamiento más sencillo
La plataforma basada en contenedores Docker permite portar fácilmente su carga de trabajo. Los contenedores Docker pueden ejecutarse en su máquina local, tanto en máquinas reales como virtuales en un centro de datos, así como en la nube.
La portabilidad y la naturaleza liviana de Docker permiten gestionar dinámicamente su carga de trabajo con facilidad. Puede usar Docker para implementar o apagar su aplicación o servicios. La velocidad de Docker permite hacer esto casi en tiempo real.
Altas cargas y más cargas útiles.
Docker es liviano y rápido. Ofrece una alternativa sostenible y rentable a las máquinas virtuales basadas en hipervisores. Es especialmente útil en condiciones de alta carga, como al crear su propia nube o plataforma como servicio (platform-as-service). Pero también es beneficioso para aplicaciones pequeñas y medianas, cuando desea obtener más de los recursos disponibles.
Componentes principales de Docker.
Docker consta de dos componentes principales:
- Docker: plataforma de virtualización de código abierto;
- Docker Hub: nuestra plataforma como servicio para distribuir y gestionar contenedores Docker.
¡Nota! Docker se distribuye bajo la licencia Apache 2.0.
Arquitectura de Docker.
Docker utiliza una arquitectura cliente-servidor. El cliente Docker se comunica con el daemon Docker, que se encarga de crear, ejecutar y distribuir sus contenedores. Ambos, cliente y servidor pueden funcionar en el mismo sistema, puede conectar el cliente a un daemon Docker remoto. El cliente y el servidor se comunican a través de un socket o mediante una API RESTful.

Daemon Docker.
Como se muestra en el diagrama, el daemon se ejecuta en la máquina host. El usuario no interactúa directamente con el servidor, sino que utiliza el cliente para ello.
Cliente Docker.
El cliente Docker, programa Docker, es la principal interfaz con Docker. Recibe comandos del usuario e interactúa con el daemon Docker.
Dentro de Docker.
Para entender de qué se compone Docker, necesita conocer tres componentes:
- imágenes (images)
- registros (registries)
- contenedores
Imágenes
La imagen de Docker es una plantilla de solo lectura. Por ejemplo, una imagen puede contener el sistema operativo Ubuntu con Apache y una aplicación sobre él. Las imágenes se utilizan para crear contenedores. Docker permite crear fácilmente nuevas imágenes, actualizar las existentes, o puede descargar imágenes creadas por otras personas. Las imágenes son un componente de la construcción de Docker.
Registro
El registro de Docker almacena imágenes. Hay registros públicos y privados desde los cuales se pueden descargar o subir imágenes. El registro público de Docker es . Allí se encuentra una enorme colección de imágenes. Como saben, las imágenes pueden ser creadas por ustedes o pueden utilizar imágenes creadas por otros. Los registros son un componente de la distribución.
Contenedores
Los contenedores son similares a carpetas. En los contenedores se encuentra todo lo necesario para que funcione una aplicación. Cada contenedor se crea a partir de una imagen. Los contenedores pueden ser creados, iniciados, detenidos, trasladados o eliminados. Cada contenedor está aislado y es una plataforma segura para la aplicación. Los contenedores son un componente del funcionamiento.
¿Cómo funciona Docker?
Hasta ahora sabemos que:
- podemos crear imágenes que contienen nuestras aplicaciones;
- podemos crear contenedores a partir de imágenes para ejecutar aplicaciones;
- podemos distribuir imágenes a través de Docker Hub u otro registro de imágenes.
Veamos cómo se combinan estos componentes.
¿Cómo funciona una imagen?
Ya sabemos que una imagen es una plantilla de solo lectura de la cual se crea un contenedor. Cada imagen consta de un conjunto de capas. Docker utiliza para combinar estas capas en una sola imagen. El sistema de archivos en unión permite que archivos y directorios de diferentes sistemas de archivos (de diferentes ramas) se superpongan de manera transparente, creando un sistema de archivos coherente.
Una de las razones por las que Docker es ligero es por el uso de esas capas. Cuando modifican una imagen, por ejemplo, actualizando una aplicación, se crea una nueva capa. Así, sin reemplazar toda la imagen ni reconstruirla, como podrían tener que hacerlo con una máquina virtual, solo se agrega o actualiza una capa. Y no necesitan distribuir toda la nueva imagen, solo la actualización, lo que permite distribuir imágenes de manera más sencilla y rápida.
En la base de cada imagen se encuentra una imagen base. Por ejemplo, ubuntu, la imagen base de Ubuntu, o fedora, la imagen base de la distribución Fedora. También puedes usar las imágenes como base para crear nuevas imágenes. Por ejemplo, si tienes una imagen de apache, puedes usarla como imagen base para tus aplicaciones web.
¡Nota! Docker normalmente toma imágenes del registro Docker Hub.
Las imágenes de Docker pueden crearse a partir de estas imágenes base, y los pasos para crear estas imágenes los llamamos instrucciones. Cada instrucción crea una nueva imagen o capa. Las instrucciones serán las siguientes acciones:
- ejecutar un comando
- agregar un archivo o directorio
- crear una variable de entorno
- indicar qué ejecutar cuando se inicia el contenedor de esta imagen
Estas instrucciones se almacenan en un archivo Dockerfile. Docker lee esto Dockerfile, cuando construyes la imagen, ejecuta estas instrucciones y devuelve la imagen final.
¿Cómo funciona el registro de docker?
El registro es un almacén de imágenes de docker. Después de crear la imagen, puedes publicarla en el registro público Docker Hub o en tu registro personal.
Con el cliente de docker, puedes buscar imágenes ya publicadas y descargarlas en tu máquina con docker para crear contenedores.
Docker Hub proporciona almacenes públicos y privados de imágenes. La búsqueda y descarga de imágenes de almacenes públicos está disponible para todos. El contenido de los almacenes privados no aparece en los resultados de búsqueda. Solo tú y tus usuarios pueden obtener estas imágenes y crear contenedores a partir de ellas.
¿Cómo funciona un contenedor?
Un contenedor consiste en un sistema operativo, archivos de usuario y metadatos. Como sabemos, cada contenedor se crea a partir de una imagen. Esta imagen le dice a docker qué hay en el contenedor, qué proceso iniciar cuando se inicia el contenedor y otros datos de configuración. La imagen de Docker es de solo lectura. Cuando docker inicia un contenedor, crea una capa de lectura/escritura encima de la imagen (usando un sistema de archivos en unión, como se mencionó anteriormente), donde puede ejecutarse la aplicación.
¿Qué sucede cuando se inicia un contenedor?
Ya sea mediante un programa docker, o a través de la API RESTful, el cliente de docker le dice al demonio de docker que inicie el contenedor.
$ sudo docker run -i -t ubuntu /bin/bash
Vamos a desglosar este comando. El cliente se inicia con el comando docker, con la opción run, que dice que se lanzará un nuevo contenedor. Los requisitos mínimos para iniciar el contenedor son los siguientes atributos:
- qué imagen usar para crear el contenedor. En nuestro caso
ubuntu - el comando que deseas ejecutar cuando se inicie el contenedor. En nuestro caso
/bin/bash
¿Qué ocurre detrás de escena cuando ejecutamos este comando?
Docker hace lo siguiente, en orden:
- descarga la imagen de ubuntu: docker verifica si la imagen
ubuntuestá en la máquina local, y si no está, la descarga de . Si la imagen existe, la utiliza para crear el contenedor; - crea el contenedor: cuando se obtiene la imagen, docker la utiliza para crear el contenedor;
- inicializa el sistema de archivos y monta un nivel de solo lectura: el contenedor se ha creado en el sistema de archivos y se ha añadido el nivel de solo lectura a la imagen;
- inicializa la red/puente: crea una interfaz de red que permite a docker comunicarse con la máquina host;
- Configuración de la dirección IP: encuentra y asigna la dirección;
- Inicia el proceso especificado: inicia tu aplicación;
- Procesa y emite la salida de tu aplicación: se conecta y registra la entrada estándar, salida y el flujo de errores de tu aplicación, para que puedas rastrear cómo funciona tu aplicación.
Ahora tienes un contenedor funcional. Puedes gestionar tu contenedor, interactuar con tu aplicación. Cuando decidas detener la aplicación, elimina el contenedor.
Tecnologías utilizadas
Docker está escrito en Go y utiliza algunas características del núcleo de Linux para implementar la funcionalidad mencionada anteriormente.
Espacios de nombres (namespaces)
Docker utiliza la tecnología de namespaces para organizar entornos de trabajo aislados, que llamamos contenedores. Cuando iniciamos un contenedor, docker crea un conjunto de espacios de nombres para ese contenedor.
Esto crea un nivel aislado, cada aspecto del contenedor se ejecuta en su propio espacio de nombres, y no tiene acceso al sistema externo.
Una lista de algunos espacios de nombres que usa docker:
- pid: para la aislamiento de procesos;
- net: para gestionar interfaces de red;
- ipc: para gestionar recursos IPC. (ICP: Comunicación Entre Procesos);
- mnt: para gestionar puntos de montaje;
- utc: para aislar el núcleo y controlar la generación de versiones (UTC: sistema de tiempo compartido Unix).
Grupos de control (control groups)
Docker también utiliza esta tecnología cgroups o grupos de control. La clave para el funcionamiento de la aplicación en aislamiento es proporcionar a la aplicación solo los recursos que desea ofrecer. Esto garantiza que los contenedores sean buenos vecinos. Los grupos de control permiten dividir los recursos disponibles del hardware y, si es necesario, establecer límites y restricciones. Por ejemplo, limitar la cantidad de memoria que puede usar un contenedor.
Sistema de Archivos Unión
El Sistema de Archivos Unión o UnionFS es un sistema de archivos que funciona creando capas, lo que lo hace muy liviano y rápido. Docker utiliza UnionFS para crear bloques a partir de los cuales se construye el contenedor. Docker puede utilizar varias variantes de UnionFS, incluyendo: AUFS, btrfs, vfs y DeviceMapper.
Formatos de contenedores
Docker combina estos componentes en un contenedor, que llamamos formato de contenedor. El formato utilizado por defecto se llama libcontainer. Además, Docker soporta el formato tradicional de contenedores en Linux a través de . En el futuro, es posible que Docker admita otros formatos de contenedores, por ejemplo, integrándose con BSD Jails o Solaris Zones.
Fuente: habr.com
