Serie Explorando el Universo de Contenedores: Guía Completa de Docker

Docker se ha convertido en una herramienta esencial en el mundo del desarrollo y la administración de sistemas, permitiendo la creación, distribución y ejecución de aplicaciones en entornos aislados y consistentes. En esta guía completa, exploraremos desde los conceptos básicos de Docker hasta ejemplos prácticos de diferentes casos de uso, incluyendo contenido de Docker Hub.

Introducción a Docker

Docker es una plataforma de virtualización ligera que permite empacar y distribuir aplicaciones junto con todas sus dependencias en contenedores. Un contenedor es una unidad de software que incluye todo lo necesario para ejecutar una aplicación, incluyendo código, runtime, bibliotecas y configuraciones

Ventajas de usar Docker

  • Portabilidad: Los contenedores pueden ejecutarse en cualquier máquina que tenga Docker instalado.
  • Aislamiento: cada contenedor opera en un entorno aislado, lo que evita conflictos entre aplicaciones.
  • Escalabilidad: Los contenedores se pueden replicar fácilmente para manejar cargas de trabajo variables.
  • Consistencia: Garantiza que la aplicación funcione de la misma manera en diferentes entornos.

Conceptos clave: imágenes y contenedores.

  • Imagen: Plantilla que contiene un sistema de archivos y configuraciones necesarias para ejecutar una aplicación.
  • Contenedor: Instancia en ejecución de una imagen. Es un entorno aislado.

Instalación de Docker.

Para instalar Docker, depende del sistema operativo, está disponible para Linux con cualquier distribución como Ubuntu, CentOS, Kali, etc., también disponible para Windows y MacOS. Para instalarlo solo es seguir los pasos depende del sistema operativo que se tenga en este link: https://docs.docker.com/engine/install/

Comandos Básicos de Docker

docker run

El comando ‘docker run’ se utiliza para ejecutar un contenedor a partir de una imagen. Por ejemplo:

docker run -d -p 80:8080 nginx

Este comando ejecuta un contenedor basado en la imagen “nginx” en segundo plano y mapea el puerto 8080 del contenedor al puerto 80 del host.

💡Nota: Se utiliza por lo general la flag ‘-d’ de detach, para poder seguir utilizando nuestra terminal, ya que si no se usa, toca detener el contenedor para seguir haciendo uso de la línea de comandos.

docker ps

Muestra una lista de los contenedores en ejecución.

docker ps

docker ps -a

Muestra la lista de contenedores que están en ejecución y detenidos en el transcurso del tiempo.

docker ps -a

docker images

Lista las imágenes disponibles en el sistema.

docker images

docker build

Construye una imagen a partir de un Dockerfile en el directorio actual.

docker build -t "my-app"

docker stop y docker start

Detiene e inicia un contenedor en ejecución.


docker stop "container-name"
docker start " container-name"


Creación y gestión de Imágenes

Un Dockerfile es un archivo de texto que define cómo se construira una imagen. Ejemplo de Dockerfile para una aplicación Node.js



FROM node:18.17-alpine

WORKDIR /app

COPY package.json yarn.lock ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "npm", "start" ]

Aquí Podemos ver un ejemplo donde se muestran una serie de instrucciones que tendrá nuestro DockerFile

  • FROM: nos proporciona una imagen base. En este caso tomamos la imagen 18.17-alpine, que es mucho mas ligera que un node 18.17
  • WORKDIR: aquí es donde va a alojar nuestra aplicación en el contenedor
  • COPY: añade los archivos de nuestro directorio local, todas las dependencias para que no tenga ningún error al hacer el build
  • RUN: crea la aplicación con node:18.17-alpine
  • EXPOSE: aquí es donde se va a mostrar nuestra aplicación, en este caso en el puerto 3000
  • CMD: Especifica que comando queremos ejecutar en el contenedor

💡Nota: hay otra instrucción que es el ENTRYPOINT, que viene siendo la entrada a ejecutar en el contenedor como ejemplo se vería de esta forma


FROM node:18.17-alpine

WORKDIR /app

COPY package.json yarn.lock ./

RUN npm install

COPY . .

EXPOSE 3000

ENTRYPOINT [ "npm" ]

CMD [ "start" ]


Redes en Docker

Tipos de Redes en Docker

  • Bridge: red privada interna para contenedores en el mismo host.
  • Host: Comparte la red del host con el contenedor
  • Overlay: Red multi-host para la comunicación entre contenedores en diferentes hosts.

Crear y Gestionar Redes

docker network create "my-network"

Conectar Contenedores a Redes

docker run -d --network="my-network" --name="my-container-nginx"

Persistencia de Datos

Montaje de Volúmenes en Contenedores

Permite que los datos persistan incluso después de detener o eliminar un contenedor.

docker run -d -v "my-volume":/ruta/.../.../"my-container-nginx"

Datos en el Contenedor vs datos en Volumen

Los datos en el contenedor son volátiles y se pierden al eliminar el contenedor. Los datos en un volumen persisten

Copia de datos hacia/desde Contenedores


docker cp archivo.txt "container-name":/ruta/.../.../container/
docker cp "container-name":/ruta/.../.../container/archivo.txt .


Casos de USO Prácticos

Despliegue de una aplicación Web con Nginx


version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"


Bases de Datos en Contenedores: MySQL y MongoDB


version: '3'
services:
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: mysecretpassword
  mongodb:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:


Entornos de Desarrollo Aislados

Crea entornos de desarrollo consistentes para diferentes proyectos


FROM node:14

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "start"]


Orquestación de Contenedores con Kubernetes

Kubernetes es una herramienta poderosa para la orquestación y gestión de contenedores en un entorno de producción

Explorando Docker Hub

Docker Hub es un repositorio público de imágenes de contenedores, donde individuos y empresas pueden publicar imágenes de soluciones.

Pasos para Subir una Imagen a Docker-Hub

Lo Primero que se debe tener para subir una imagen a Docker-Hub es una cuenta,

  1. Crea tu cuenta en Docker Hub:

Si aún no tienes tu cuenta en docker hub ingresa a https://hub.docker.com/ y registrate

  1. Instala Docker en tu máquina local:

Para instalar docker en tu sistemas, descargarlo e instalarlo desde el sitio web oficial de docker https://www.docker.com/get-started/

  1. Iniciar sesión en Docker Hub desde la línea de comandos

abre un terminal y utiliza el siguiente comando para iniciar sesión en Docker Hub con tu nombre de usuario y contraseña


docker login


Se te pedirá que ingreses el nombre de usuario y contraseña de Docker Hub

  1. Etiqueta tu imagen que vayas a subir

Asegúrate de que la imagen que deseas subir tenga una etiqueta adecuada. Puedes etiquetar la imagen usando el siguiente comando


docker tag "name_image":etiqueta "user_docker_hub"/"name_image":etiqueta


Ejemplo:



docker tag my_app:v1 robpalacios1/my_app:v1

  1. Sube la imagen a Docker Hub

Utiliza el siguiente comando para subir tu imagen etiquetada a Docker Hub:



docker push "user_docker_hub"/"name_image":etiqueta 

Ejemplo


docker push robpalacios1/my_app:v1


  1. Verifica la imagen en Docker Hub

Después de se hace el push de la imagen y veas que se ha completado con éxito, puedes revisar el repositorio en Docker Hub, en la sección repositories para asegurarte que la imagen está disponible


💡Nota: Como pueden ver, tengo en mi Docker Hub un repositorio de React con diferentes versiones que he hecho en el código, y solo con hacer un pull a su local pueden aportar al código, estilo GitHub con el comando docker pull robpalacios1/react-docker:<Tag>

Dónde Tag puede ser las versiones que tengo desde la 1.0.0 hasta la última que viene siendo latest

Conclusión

Docker es una tecnología que ha evolucionado la forma en que desarrollamos, desplegamos y gestionamos aplicaciones. Desde la creación de imágenes hasta la gestión de redes y volúmenes, Docker proporciona las herramientas necesarias para construir entornos consistentes y eficientes.

Roberto Palacios

September 8, 2023