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