Ejercicios prácticos de despliegue y gestión con Docker

1. Orquestación de Nginx mediante Docker Compose

Para automatizar el despliegue de un servidor Nginx con contenido personalizado y persistencia de datos, se utiliza un archivo docker-compose.yml. En este ejemplo, vinculamos un archivo HTML local y definimos un volumen para la configuración del servidor.

# Estructura del archivo docker-compose.yml
services:
  servidor-web:
    build:
      context: ./infra-nginx/
      dockerfile: Dockerfile.web
    image: custom-nginx:stable
    container_name: nginx-instancia-01
    restart: on-failure
    pull_policy: if_not_present
    ports:
      - "9090:80"
    volumes:
      - web_config:/etc/nginx/
      - ./sitio/index.html:/usr/share/nginx/html/index.html
    networks:
      - red-privada

networks:
  red-privada:
    driver: bridge

volumes:
  web_config:

2. Implementación de un sitio WordPress con MySQL

El despliegue de WordPress requiere una base de datos relacional. Mediante el uso de variables de entorno, podemos vincular ambos servicios de forma segura.

services:
  cms-wordpress:
    image: wordpress:6.4
    container_name: wordpress-app
    links:
      - motor-bd:mysql-alias
    environment:
      WORDPRESS_DB_HOST: mysql-alias
      WORDPRESS_DB_USER: admin_user
      WORDPRESS_DB_PASSWORD: password123
      WORDPRESS_DB_NAME: blog_db
    ports:
      - "8085:80"

  motor-bd:
    image: mysql:8.0
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: password123
      MYSQL_DATABASE: blog_db

3. Creación de contenedores con acceso SSH

En ciertos entornos de desarrollo, es necesario acceder al contenedor vía SSH, ya sea mediante contraseña o claves públicas.

Configuración basada en contraseña:

FROM centos:7
RUN yum -y update && \
    yum -y install openssh-server openssh-clients passwd net-tools && \
    ssh-keygen -A
RUN echo "admin_root" | passwd --stdin root
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Configuración con acceso por clave pública (sin contraseña):

FROM centos:7
RUN yum -y install openssh-server passwd && \
    ssh-keygen -A && \
    mkdir -p /root/.ssh
COPY id_rsa.pub /root/.ssh/authorized_keys
RUN chmod 700 /root/.ssh && \
    chmod 600 /root/.ssh/authorized_keys && \
    chown -R root:root /root/.ssh/
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

4. Ejecución de MySQL desde la línea de comandos

Para levantar una base de datos MySQL rápidamente, se deben pasar las credenciales obligatorias como variables de entorno al comando docker run.

docker run -d --name db-instancia \
  --restart always \
  -p 33061:3306 \
  -e "MYSQL_ROOT_PASSWORD=secreto123" \
  -e "MYSQL_DATABASE=tienda_db" \
  mysql:latest

5. Comunicación entre contenedores mediante el parámetro --link

El uso de --link permite que un contenedor se comunique con otro utilizando un alias en lugar de una dirección IP estática, lo cual es vital si los contenedores se reinician y obtienen IPs distintas.

Paso 1: Lanzar la base de datos

docker run -d --name bd-backend -e "MYSQL_ROOT_PASSWORD=admin" -e "MYSQL_DATABASE=cms_data" mysql

Paso 2: Vincular la aplicación web

docker run -d --name app-frontal \
  -p 80:80 \
  --link bd-backend:db_enlace \
  -e WORDPRESS_DB_HOST=db_enlace \
  -e WORDPRESS_DB_USER=root \
  -e WORDPRESS_DB_PASSWORD=admin \
  -e WORDPRESS_DB_NAME=cms_data \
  wordpress

6. Portabilidad: Comandos Save y Load

Estos comandos son fundamentales para transferir imágenes en etnornos sin conexión a Internet (Air-gapped).

  • docker save -o mi_imagen.tar nombre_imagen:tag: Exporta la imagen a un archivo comprimido.
  • docker load -i mi_imagen.tar: Importa la imagen desde el archivo al repositorio local de Docker.

7. Persistencia de cambios con Docker Commit

Cuando se realizan modificaciones manuales dentro de un contenedor en ejecución (como instalar dependencias específicas), se puede generar una nueva imagen a partir de ese estado actual.

docker commit -m "Instalación de herramientas de red" -a "Admin" id_contenedor nueva_imagen:v1

Etiquetas: Docker docker-compose Nginx wordpress MySQL

Publicado el 7-16 16:31