Este tutorial detala el proceso de despliegue de un entorno de aplicaciones utilizando Docker, incluyendo una base de datos MySQL, una aplicación Spring Boot y un servidor Nginx como proxy enverso.
1. Instalación y Configuración de Docker
Primero, asegúrate de tener las hreramientas necesarias y configura el repositorio de Docker en tu sistema.
# Crear directorio de trabajo
mkdir aplicaciones-docker
cd aplicaciones-docker
# Instalar herramientas de sistema
yum install -y yum-utils device-mapper-persistent-data lvm2
# Configurar el repositorio de Docker de Aliyun
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Solución a posibles errores de yum
# rm -f /var/run/yum.pid
# Instalar Docker CE
yum -y install docker-ce
# Iniciar el servicio Docker
systemctl start docker
2. Descarga de Imágenes Docker Esenciales
Descarga las imágenes necesarias para tu despliegue.
docker pull nginx
docker pull openjdk
docker pull mysql/mysql-server:5.7
3. Configuración de Red Docker Personalizada
Crea una red Docker para que tus contenedores puedan comunicarse.
# Crear una red con un rango de subred específico (prueba con 172.33.0.0/16 o ajusta si es necesario)
docker network create --subnet=172.33.0.1/16 red-aplicacion
4. Despliegue de la Base de Datos MySQL
Prepara los directorios para la configuración y los datos de MySQL, y luego ejecuta el contenedor.
# Crear directorios para la configuración, datos y scripts de MySQL
mkdir -p mysql/{config,datos,scripts}
# Copia tu archivo de configuración 'my.cnf' al directorio 'config'
# Copia tu script SQL 'datos_iniciales.sql' al directorio 'scripts'
# Crear y ejecutar el contenedor MySQL
docker run -itd \
-v /ruta/a/aplicaciones-docker/mysql/config/my.cnf:/etc/my.cnf \
-v /ruta/a/aplicaciones-docker/mysql/datos:/var/lib/mysql \
-v /ruta/a/aplicaciones-docker/mysql/scripts:/scripts \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=tu_contrasena_segura \
--name contenedor-mysql \
--net red-aplicacion \
mysql/mysql-server:5.7
4.1. Configuración Inicial de MySQL
Accede al contenedor de MySQL para realizar configuraciones iniciales y cargar datos.
# Entrar al contenedor MySQL
docker exec -it contenedor-mysql bash
# Iniciar sesión en MySQL
mysql -uroot -ptu_contrasena_segura
# Habilitar el acceso remoto para el usuario root (ajusta según tus necesidades de seguridad)
grant all on *.* to root@'%' identified by 'tu_contrasena_segura';
flush privileges;
# Crear la base de datos de tu aplicación
create database nombre_basedatos;
# Usar la base de datos
use nombre_basedatos;
# Cargar los datos iniciales desde tu script SQL
source /scripts/datos_iniciales.sql
# Salir de MySQL
exit
# Salir del contenedor
exit
Verifica que el contenedor de MySQL sigue en ejecución:
docker ps
5. Despliegue de la Aplicación Spring Boot
Crea un Dockerfile para tu aplicación Spring Boot y construye la imagen.
# Regresar al directorio principal de aplicaciones
cd /ruta/a/aplicaciones-docker
# Copia tu archivo JAR de la aplicación Spring Boot al directorio
# cp /ruta/a/tu/app.jar .
# Crear el archivo Dockerfile
cat <<eof> Dockerfile
FROM openjdk:latest
WORKDIR /proyecto
COPY tu_aplicacion.jar /proyecto
CMD ["java", "-jar", "tu_aplicacion.jar", "--spring.datasource.url=jdbc:mysql://contenedor-mysql:3306/nombre_basedatos"]
EOF
# Construir la imagen Docker de la aplicación
docker build -t mi-app-springboot:v1 .
</eof>
5.1. Ejecución de Contenedores Spring Boot
Lanza los contenedores de tu aplicación Spring Boot dentro de la red personalizada.
# Ejecutar instancias de la aplicación (sin exponer puertos)
docker run -itd --name app-instancia-1 --net red-aplicacion mi-app-springboot:v1
docker run -itd --name app-instancia-2 --net red-aplicacion mi-app-springboot:v1
# Ejecutar una instancia exponiendo el puerto para acceso externo
docker run -itd --name app-instancia-3 --net red-aplicacion -p 8080:8080 mi-app-springboot:v1
# Accede a tu aplicación a través del puerto expuesto, por ejemplo:
# curl http://localhost:8080/tu/endpoint
6. Despliegue del Servidor Nginx
Configura Nginx para que actúe como proxy inverso y sirva contenido estático.
# Crear directorios para la configuración y el contenido web de Nginx
mkdir -p nginx/{configuracion,html}
# Copia tu archivo de configuración de Nginx (ej. 'mi_proxy.conf') al directorio 'configuracion'
# Coloca tus archivos HTML y otros recursos estáticos en el directorio 'html'
# Crear y ejecutar el contenedor Nginx
docker run -itd \
-v /ruta/a/aplicaciones-docker/nginx/configuracion:/etc/nginx/conf.d \
-v /ruta/a/aplicaciones-docker/nginx/html:/etc/nginx/html \
-p 80:80 \
--name contenedor-nginx \
--net red-aplicacion \
nginx
Ahora deberías poder acceder a tu contenido estático o a tus aplicaciones a través del puerto 80 del host, configurado por Nginx.
7. Gestión del Firewall (Opcional)
Asegúrate de que tu firewall no esté bloqueando el acceso a los puertos necesarios.
# Comprobar el estado del firewall
systemctl status firewalld
# Para detener temporalmente el firewall (usar con precaución)
# systemctl stop firewalld