Cómo implementar un servidor web con Docker

DockerBeginner
Practicar Ahora

Introducción

Docker es una plataforma de contenedorización ampliamente adoptada que simplifica la implementación y gestión de aplicaciones. En este tutorial, aprenderás a implementar un servidor web utilizando Docker, explorando los beneficios de la contenedorización y configurando un entorno de desarrollo Docker.

Entendiendo Docker

¿Qué es Docker?

Docker es una plataforma de código abierto que permite a los desarrolladores construir, implementar y ejecutar aplicaciones en un entorno de contenedorización. Los contenedores son paquetes ligeros, autónomos y ejecutables que incluyen todo lo necesario para ejecutar una aplicación, incluyendo el código, el tiempo de ejecución, las herramientas del sistema y las bibliotecas. Docker proporciona una forma consistente y confiable de empaquetar y distribuir aplicaciones, lo que facilita el desarrollo, las pruebas y la implementación de software.

Beneficios del Uso de Docker

  1. Entornos Consistentes: Los contenedores Docker garantizan que las aplicaciones se ejecuten de la misma manera, independientemente de la infraestructura subyacente, proporcionando un entorno de desarrollo e implementación consistente y confiable.
  2. Mayor Eficiencia: Los contenedores Docker son ligeros y se pueden iniciar y detener rápidamente, lo que permite un uso más eficiente de los recursos del sistema en comparación con las máquinas virtuales tradicionales.
  3. Escalabilidad Mejorada: Docker facilita la escalabilidad de las aplicaciones, ya sea aumentando o disminuyendo la escala, creando y gestionando múltiples contenedores según sea necesario.
  4. Portabilidad Mejorada: Los contenedores Docker se pueden compartir e implementar fácilmente en diferentes plataformas y entornos, lo que facilita el traslado de aplicaciones entre desarrollo, pruebas y producción.

Arquitectura de Docker

La arquitectura de Docker consta de los siguientes componentes clave:

  1. Cliente Docker: La interfaz de usuario que te permite interactuar con el demonio Docker.
  2. Demonio Docker: El proceso de fondo que gestiona los objetos Docker, como imágenes, contenedores, redes y volúmenes.
  3. Imágenes Docker: Archivos inmutables que contienen el código, el tiempo de ejecución, las herramientas del sistema, las bibliotecas y las dependencias necesarias para ejecutar una aplicación.
  4. Contenedores Docker: Instancias ejecutables de imágenes Docker, que están aisladas y tienen su propio sistema de archivos, red y espacio de procesos.
  5. Registro Docker: Un repositorio para almacenar y distribuir imágenes Docker.
graph TD A[Cliente Docker] --> B[Demonio Docker] B --> C[Imágenes Docker] B --> D[Contenedores Docker] B --> E[Registro Docker]

Comenzando con Docker

Para comenzar con Docker, necesitarás instalar el motor Docker en tu sistema. El proceso de instalación varía según tu sistema operativo, pero normalmente puedes encontrar las instrucciones en el sitio web oficial de Docker.

Una vez que hayas instalado Docker, puedes empezar a utilizarlo para construir y ejecutar tus aplicaciones. Aquí hay un ejemplo simple de cómo ejecutar un servidor web Nginx usando Docker:

## Extrae la imagen Nginx del registro Docker
docker pull nginx

## Ejecuta el contenedor Nginx
docker run -d -p 80:80 --name my-nginx nginx

Este comando extrae la imagen Nginx del registro Docker y luego ejecuta un nuevo contenedor basado en esa imagen, exponiendo el puerto 80 del host al puerto 80 dentro del contenedor.

Configurando un Entorno de Desarrollo con Docker

Instalando Docker

Para configurar un entorno de desarrollo con Docker, primero necesitas instalar el motor Docker en tu sistema. Aquí te mostramos cómo hacerlo en Ubuntu 22.04:

## Actualizar el índice de paquetes
sudo apt-get update

## Instalar paquetes para permitir que apt use un repositorio a través de HTTPS
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

## Agregar la clave GPG oficial de Docker
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

## Configurar el repositorio de Docker
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Instalar Docker Engine, containerd y Docker Compose
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Configurando Docker para el Desarrollo

Después de instalar Docker, puedes configurarlo para tu entorno de desarrollo. Aquí hay algunas configuraciones comunes:

  1. Montaje de Volúmenes: Monta directorios de tu sistema host en el contenedor Docker para compartir archivos y datos.
  2. Redes: Configura redes Docker para permitir que los contenedores se comuniquen entre sí y con el sistema host.
  3. Variables de Entorno: Pasa variables de entorno al contenedor Docker para configurar la aplicación.
  4. Argumentos de Compilación: Pasa argumentos de tiempo de compilación al proceso de compilación de Docker para personalizar la imagen.

Aquí hay un ejemplo de un archivo Docker Compose que demuestra estas configuraciones:

version: "3"
services:
  web:
    build:
      context: .
      args:
        - ENV=development
    ports:
      - 8080:80
    volumes:
      - ./app:/var/www/html
    environment:
      - DB_HOST=database
  database:
    image: mysql:5.7
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
volumes:
  db-data:

Este archivo Docker Compose configura un servicio web y un servicio de base de datos, con las siguientes configuraciones:

  • El servicio web se construye a partir de un Dockerfile local, con un argumento de compilación ENV=development.
  • El servicio web monta el directorio ./app del host en el directorio /var/www/html del contenedor, lo que te permite editar el código de la aplicación directamente en el host.
  • El servicio web y el servicio de base de datos están conectados a través de una red, y el servicio web puede acceder a la base de datos utilizando la variable de entorno DB_HOST.
  • El servicio de base de datos utiliza un volumen nombrado db-data para persistir los datos de la base de datos.

Administración de Contenedores Docker

Una vez configurado tu entorno de desarrollo, puedes usar comandos de Docker para administrar tus contenedores. Aquí hay algunos comandos comunes:

  • docker run: Iniciar un nuevo contenedor
  • docker stop: Detener un contenedor en ejecución
  • docker rm: Eliminar un contenedor
  • docker logs: Ver los registros de un contenedor
  • docker exec: Ejecutar un comando dentro de un contenedor en ejecución

Por ejemplo, para iniciar el servicio web del archivo Docker Compose anterior, puedes ejecutar:

docker-compose up -d web

Esto iniciará el servicio web en modo desacoplado, permitiéndote continuar usando el terminal.

Implementar un Servidor Web con Docker

Creando un Dockerfile

Para implementar un servidor web con Docker, primero necesitas crear un Dockerfile. Un Dockerfile es un archivo de texto que contiene las instrucciones para construir una imagen Docker. Aquí hay un ejemplo de Dockerfile para un servidor web Nginx simple:

## Usa la imagen oficial de Nginx como imagen base
FROM nginx:latest

## Copia el archivo de configuración predeterminado de Nginx
COPY default.conf /etc/nginx/conf.d/default.conf

## Copia el código de la aplicación web al contenedor
COPY app/ /usr/share/nginx/html/

## Exponer el puerto 80 para el tráfico HTTP
EXPOSE 80

## Iniciar el servidor Nginx
CMD ["nginx", "-g", "daemon off;"]

Este Dockerfile:

  1. Utiliza la imagen oficial de Nginx como imagen base.
  2. Copia el archivo de configuración predeterminado de Nginx al contenedor.
  3. Copia el código de la aplicación web al directorio raíz web del contenedor.
  4. Expone el puerto 80 para el tráfico HTTP.
  5. Inicia el servidor Nginx.

Construyendo y Ejecutando la Imagen Docker

Una vez que tengas el Dockerfile, puedes construir la imagen Docker usando el comando docker build:

## Construir la imagen Docker
docker build -t my-nginx-server .

Este comando construye la imagen Docker con la etiqueta my-nginx-server usando el Dockerfile en el directorio actual.

Después de construir la imagen, puedes ejecutar un contenedor basado en la imagen usando el comando docker run:

## Ejecutar el contenedor Docker
docker run -d -p 80:80 --name my-nginx-server my-nginx-server

Este comando:

  1. Ejecuta el contenedor en modo desacoplado (-d).
  2. Mapea el puerto 80 del host al puerto 80 del contenedor (-p 80:80).
  3. Asigna el nombre my-nginx-server al contenedor.
  4. Utiliza la imagen my-nginx-server para crear el contenedor.

Escalado y Balanceo de Carga

Para escalar tu servidor web, puedes ejecutar varias instancias del contenedor Docker y usar un balanceador de carga para distribuir el tráfico entre las instancias. Aquí hay un ejemplo de cómo puedes hacerlo usando Docker Compose:

version: "3"
services:
  web:
    build: .
    ports:
      - 80:80
    deploy:
      replicas: 3
  load-balancer:
    image: nginx:latest
    ports:
      - 8080:80
    depends_on:
      - web
    configs:
      - source: nginx-config
        target: /etc/nginx/conf.d/default.conf
configs:
  nginx-config:
    file: ./nginx.conf

Este archivo Docker Compose:

  1. Construye el servicio web usando el Dockerfile en el directorio actual.
  2. Implementa tres réplicas del servicio web.
  3. Ejecuta un servicio de balanceador de carga Nginx que escucha en el puerto 8080 y redirige el tráfico a las instancias del servicio web.
  4. Monta un archivo de configuración personalizado de Nginx en el contenedor del balanceador de carga.

Al usar Docker Compose y el balanceo de carga, puedes escalar fácilmente tu servidor web y garantizar una alta disponibilidad y tolerancia a fallos.

Resumen

Al finalizar este tutorial, tendrás una comprensión sólida de Docker y cómo utilizarlo para implementar un servidor web. Aprenderás a configurar un entorno de desarrollo con Docker, crear un contenedor Docker para tu servidor web y gestionar el proceso de implementación. Este conocimiento te permitirá aprovechar el poder de Docker para tus necesidades de desarrollo e implementación de aplicaciones web.