Libro: Docker - Guía Práctica

By rogerarjona July 31, 2023, 7:51 p.m. Docker

Primeros Pasos

Docker es una plataforma de software que te permite automatizar el despliegue, escalado y gestión de aplicaciones dentro de contenedores. Los contenedores son ligeros, portables y aíslan las aplicaciones entre sí en el mismo host.

Docker nació con la intención de agilizar el proceso de desarrollo al permitir a los desarrolladores tener el mismo entorno y construirlo en poco tiempo.

Para empezar con Docker, primero debemos instalarlo en nuestro sistema operativo. La instalación varía según el sistema operativo. Una vez instalado, puedes verificar la instalación utilizando el comando:

docker --version

Después, puedes ejecutar un contenedor de prueba con:

docker run hello-world

Para una práctica de Docker, instalación y una explicación más larga de si mismo, puedes encontrar más información en Practica de Docker - Virtualizar un proyecto de Django

Contenedores

Los contenedores son instancias en tiempo de ejecución de imágenes Docker, son ligeros y portables. Cada contenedor se ejecuta de forma aislada y tiene su propio sistema de archivos, su propia red y sus propios procesos aislados.

image

Los contenedores corren aislados pero usan el kernel del sistema operativo para trabajar. Comparten el mismo host pero no comparten los recursos.

Para trabajar con contenedores, primero debes tener una imagen de Docker desde la que crear el contenedor.

Ya que los contenedores son portables, podemos usarlos para poder trabajar bajo un mismo entorno, o para realizar diferentes tipos de pruebas. El tener información aislada nos permite trabajar simultáneamente sin afectar la información de nuestra computadora o servidor.

Contenedores es una tecnología que ya existía, pero que docker mejora con la intención de brindar un mejor tiempo de desarrollo y puesta en producción.

Imágenes

Las imágenes Docker son plantillas que contienen una copia del sistema de archivos que se utiliza para crear contenedores en Docker. Las imágenes se componen de varias capas y cada cambio en una imagen añade una nueva capa.

Esto nos da a entender que parte de una imagen base (sistema operativo como ubuntu, debian, fedora, etc). Cada comando ejecutado dentro de una imagen al momento de su creación es otra capa, y esto es lo que define a una imagen.

Puedes listar todas las imágenes Docker disponibles localmente con el comando docker images.

docker image ls

Esto desplegara algo como lo siguiente:

image

Se puede aprender mas de los comandos de las imagenes, en esta pagina: https://devhints.io/docker#images

Para personalizar tus propios contenedores, puedes generar tus propias imágenes Docker. Esto se hace mediante un archivo llamado Dockerfile, que es un archivo de texto que contiene las instrucciones para construir la imagen.

Un ejemplo simple de Dockerfile para una aplicación Node.js se muestra a continuación:

FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]

El contenido anterior permite:

  1. Construir una imagen a partir de la imagen base llamada node:14
  2. Especifica con el comando WORKDIR en donde se realizaran todas las configuraciones
  3. Copia el contenido de la carpeta al directorio anterior
  4. Ejecuta el comando npm install con el comando RUN
  5. Expone el puerto 8080 del contenedor en el host

Redes

Las redes en Docker permiten que los contenedores se comuniquen entre sí y con otras redes. Docker utiliza una variedad de estrategias de red, cada una adecuada para un escenario específico. Algunas de las estrategias de red más comunes son:

  • Bridge: Es la red predeterminada cuando se crea un contenedor. Permite que todos los contenedores en la misma red se comuniquen entre sí, y pueden acceder a la red exterior a través de la máquina host.
  • Host: Elimina el aislamiento de red entre el contenedor y el host Docker, lo que significa que el contenedor comparte la red con el host.
  • Overlay: Esta es una red que se extiende a múltiples Docker hosts y permite que los contenedores en diferentes Docker hosts se comuniquen entre sí.
  • None: Desactiva toda la red para un contenedor.

La red Bridge es la más comúnmente utilizada. Aquí hay un ejemplo de cómo se puede crear una:

docker network create my-network

Esto creará una red llamada "my-network". Los contenedores que se conecten a esta red podrán comunicarse entre sí. Cuando creamos un contenedor, podemos asignarle las redes que creamos con anterioridad:

docker run --network=my-network -d --name my-container ubuntu

Este comando inicia un contenedor basado en la imagen de Ubuntu, le da el nombre "my-container", y lo conecta a la red "my-network".

Almacenamiento

Los volúmenes son la forma de almacenar los datos generados por y utilizados por los contenedores Docker. A diferencia de los bind mounts, los volúmenes son completamente gestionados por Docker. Los volúmenes son especialmente útiles para cuando necesitas compartir datos entre contenedores, necesitas almacenamiento persistente más allá del ciclo de vida del contenedor, o quieres almacenar tus datos en sistemas de almacenamiento remotos que son accesibles desde tu host Docker.

Aquí hay un ejemplo de cómo se puede usar un volumen:

docker volume create my-volume

Esto creará un volumen llamado "my-volume". Los volúmenes son almacenados en una parte del host filesystem que es gestionada por Docker (/var/lib/docker/volumes/ en Linux), aislada del sistema de archivos del host.

Una vez creado el volumen, podemos asignarselo a un contenedor:

docker run -v my-volume:/data --name my-container ubuntu

Docker Compose

Docker Compose es una herramienta para definir y administrar aplicaciones de varios contenedores Docker. Permite a los usuarios definir una serie de contenedores en un archivo YAML, incluyendo las configuraciones, las dependencias, las redes, los volúmenes, etc. Luego, con un solo comando, todos los contenedores se pueden crear, iniciar, detener o eliminar.

Para esta explicación, usaremos un ejemplo con flask y redis, ambos en contenedores separados, pero que puedan comunicarse entre si. Estos contenedores se crearan a traves de un archivo llamado docker-compose.yaml

Puede contener lo siguiente

version: '3'
services:
  web:
    image: 'flask:latest'
    command: python app.py
    volumes:
      - .:/code
    ports:
      - '5000:5000'
  redis:
    image: 'redis:latest'

Este archivo define dos servicios: web y redis.

El servicio web utiliza la imagen más reciente de Flask, monta el directorio actual del host (.) en /code dentro del contenedor, y redirige el puerto 5000 del host al puerto 5000 del contenedor. El servicio redis simplemente utiliza la imagen más reciente de Redis.

Para iniciar los servicios, navega a la carpeta que contiene tu archivo docker-compose.yml y ejecuta:

docker-compose up

Docker Compose descargará las imágenes necesarias (si aún no están disponibles localmente), creará los contenedores, y los iniciará.

Para más información: https://devhints.io/docker-compose