Instalación y configuración de Laravel con Docker Compose en Ubuntu 22.04: una guía completa
En esta guía paso a paso, aprenda a instalar y configurar Laravel usando Docker Compose en Ubuntu 22.04 y a crear un entorno de producción seguro y optimizado.

Instalación y configuración de Laravel con Docker Compose en Ubuntu 22.04: una guía completa

Este artículo te mostrará cómo instalar e implementar una aplicación Laravel en Ubuntu 22.04 usando Docker Compose. Al guiarte paso a paso en el proceso, podrás crear fácilmente un entorno de producción seguro y optimizado.
0 acciones
0
0
0
0

¿Cómo instalar y configurar Laravel con Docker Compose en Ubuntu 22.04?

En esta guía práctica y técnica, lo guiaremos a través del proceso paso a paso de instalación y configuración de una aplicación. Laravel Usando Docker Compose En el servidor Ubuntu 22.04 El objetivo de este artículo es proporcionar pautas repetibles para que los desarrolladores, los equipos de DevOps y los gerentes técnicos creen un entorno de producción seguro, escalable y mantenible.

Lista de verificación inicial

Antes de comenzar, prepare lo siguiente:

  • Un servidor Ubuntu 22.04 Con acceso root o un usuario con sudo
  • Estibador (versión estable) y Docker Compose (o use el complemento Docker Compose)
  • Puertos abiertos: 80/443 Para la web; si es necesario 3306 O 5432 Para base de datos (preferiblemente limitada a IP)
  • Espacio en disco adecuado (se recomienda SSD) y acceso a uno o más de 85 ubicaciones Global si se utilizan servicios en la nube
  • Nombre de dominio y registro DNS que apuntan a la IP del servidor

Instalación de Docker y Docker Compose en Ubuntu 22.04

Ejecute los siguientes comandos en el servidor para instalar Docker y el complemento Docker Compose:

sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/keyrings/docker.gpg
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
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER

Luego cierre la sesión y vuelva a iniciarla o nuevo grupo docker Usar.

Para comprobar la instalación:

docker --version
docker compose version

Estructura del proyecto propuesta

Se recomienda que la carpeta del proyecto se organice de la siguiente manera para facilitar el mantenimiento y el desarrollo:

  • raíz del proyecto/
    • estibador/
      • nginx/default.conf
      • php/Dockerfile
    • fuente/ — Código de Laravel (o montaje)
    • docker-compose.yml
    • .env

Dockerfile recomendado para PHP-FPM (PHP 8.1)

Un archivo con una ruta docker/php/Dockerfile Crea algo como el siguiente ejemplo:

FROM php:8.1-fpm

# Install required tools and extensions
RUN apt-get update && apt-get install -y \
    git zip unzip libpng-dev libjpeg-dev libfreetype6-dev libonig-dev libxml2-dev \
    libzip-dev libpq-dev cron curl supervisor \
  && docker-php-ext-configure gd --with-freetype --with-jpeg \
  && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql mbstring xml bcmath zip opcache \
  && pecl install redis && docker-php-ext-enable redis \
  && pecl install xdebug || true \
  && apt-get clean && rm -rf /var/lib/apt/lists/*

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# Create non-root user
RUN useradd -G www-data,root -u 1000 -d /home/appuser appuser
WORKDIR /var/www/html
USER appuser

Ejemplo de docker-compose.yml

Versión sugerida docker-compose.yml Para ejecutar la aplicación, el servidor web, la base de datos y Redis:

version: "3.8"

services:
  app:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    image: laravel_app:latest
    container_name: laravel_app
    restart: unless-stopped
    volumes:
      - ./src:/var/www/html
      - ./docker/php/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
    environment:
      - APP_ENV=production
      - APP_DEBUG=false
    networks:
      - laravel-net

  web:
    image: nginx:alpine
    container_name: laravel_web
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./src:/var/www/html:ro
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./certs:/etc/letsencrypt
    depends_on:
      - app
    networks:
      - laravel-net

  db:
    image: mysql:8.0
    container_name: laravel_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - laravel-net

  redis:
    image: redis:6-alpine
    container_name: laravel_redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    networks:
      - laravel-net

volumes:
  db_data:
  redis_data:

networks:
  laravel-net:
    driver: bridge

Archivo de configuración de Nginx (docker/nginx/default.conf)

Ejemplo de configuración de Nginx para enrutar solicitudes a PHP-FPM (aplicación):

server {
    listen 80;
    server_name example.com;

    root /var/www/html/public;
    index index.php index.html;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.ht {
        deny all;
    }
}

Nota: En arquitecturas con proxy inverso o múltiples servicios, puedes colocar Nginx en la capa de balanceador de carga o CDN.

Preparando el código e instalando dependencias

Si no tienes un proyecto Laravel, puedes crear uno nuevo con Composer:

composer create-project --prefer-dist laravel/laravel src

Luego, para construir y ejecutar contenedores:

docker compose build
docker compose up -d

Para ejecutar comandos Composer y Artisan dentro de un contenedor PHP:

docker exec -it laravel_app bash
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
php artisan config:cache
php artisan route:cache
exit

Configuración del archivo .env para Docker

Ejemplo de configuración .env compatible con docker-compose:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

CACHE_DRIVER=redis
REDIS_HOST=redis

APP_URL=https://example.com

SSL y Let's Encrypt: dos formas sencillas

Hay dos formas sencillas de habilitar HTTPS:

  • Usando Certbot en el host: Detenga Nginx temporalmente, coloque el certificado emitido en la carpeta ./certificados y montarlo en el contenedor.
  • Utilizando la solución automatizada: Herramientas como Compañero de proxy Nginx de Docker Letsencrypt O Tráfico Son adecuados para la gestión automatizada de certificados.

Ejemplo rápido con Certbot:

sudo apt install -y certbot
sudo docker compose down
sudo certbot certonly --standalone -d example.com --non-interactive --agree-tos -m [email protected]
# Copy certificates from /etc/letsencrypt/live/... to ./certs and then:
sudo docker compose up -d

Iniciar en el arranque y mantener el servicio

Para garantizar que los servicios se ejecuten después del reinicio:

sudo systemctl enable docker

Además, en docker-compose desde reiniciar: a menos que se detenga Se ha utilizado. Si es necesario, se puede crear una unidad systemd para docker-compose.

Consejos prácticos de seguridad

  • Usar un usuario no root en un contenedor PHP (usuario de la aplicación en el Dockerfile de arriba)
  • Restringir el acceso al puerto de la base de datos con firewall (UFW):
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable

Otras recomendaciones:

  • Copia de seguridad periódica del volumen de la base de datos (datos de base de datos) y almacenarlo fuera del servidor
  • Habilitación de HTTPS y HSTS
  • Uso de secretos o servicios de gestión de claves para almacenar contraseñas (secretos de Docker o servicios de gestión de claves)
  • Utilice herramientas de seguridad como falla2ban Y si es necesario WAF como ModSecurity
  • Utilice una CDN o un servicio Anti-DDoS para proteger el tráfico

Optimización del rendimiento para entornos de producción

  • Habilitación de OPcache en php.ini:
    opcache.memory_consumption=256
    opcache.validate_timestamps=0
  • Configuración de php-fpm (pm = dinámico o bajo demanda) y aumento máximo_hijos Según la memoria del servidor
  • Uso de Redis para caché y sesiones
  • Uso de una CDN para archivos estáticos
  • Escalamiento horizontal: ejecutar múltiples instancias del servicio de la aplicación con un balanceador de carga (NGINX o HAProxy)
  • Utilice trabajadores y supervisores o servicios separados para tiempo real y colas.

Trabajadores de cola y Horizon

Agregue un servicio independiente en Docker-Compose para ejecutar trabajadores de cola. Ejemplo:

worker:
  build: ...
  command: php /var/www/html/artisan queue:work --sleep=3 --tries=3
  depends_on: [app, redis]
  restart: unless-stopped

Para Laravel Horizon, es mejor utilizar un contenedor dedicado con PHP y Horizon instalados y colocarlo detrás de Nginx/autenticación.

Consejos relacionados con la ubicación y selección del centro de datos

Consejos prácticos para elegir una ubicación:

  • Para obtener la latencia más baja, elija un servidor en una ubicación cercana a sus usuarios finales o destino. El proveedor de servicios es más que... 85 ubicaciones globales Lo tiene.
  • Para jugadores o comerciantes, elija una ubicación con un ping bajo y una red BGP optimizada.
  • Utilice servidores equipados con GPU para el procesamiento y renderizado de IA.
  • Utilice servidores y CDN con protección Anti-DDoS para resistir DDoS.

Copias de seguridad, supervisión y registros

  • Registros de contenedores con registros de Docker Son accesibles; utilice ELK o Prometheus+Grafana para la agregación central.
  • Copia de seguridad diaria de la base de datos y prueba de restauración periódica
  • Monitoreo de recursos de CPU/RAM, aplicaciones y seguimiento de errores en CI/CD

Depuración común

  • Error 502 de puerta de enlace incorrecta: Verifique que php-fpm se esté ejecutando en el contenedor de la aplicación y que fastcgi_pass esté configurado en la dirección correcta (aplicación:9000) para señalar.
  • Problema de conexión a la base de datos: Verifique las variables .env, la red de Docker y los registros de MySQL.
  • Permisos de archivo: En caso de errores de permisos, establezca la propiedad de las carpetas de almacenamiento y de arranque/caché:
sudo chown -R 1000:1000 src/storage src/bootstrap/cache

Conclusión y recomendación final

Usar Docker Compose para ejecutar Laravel en Ubuntu 22.04 simplifica el desarrollo y la implementación, haciéndolos repetibles y escalables. Siguiendo esta guía, podrá configurar un entorno de producción seguro, rápido y fácil de mantener: PHP-FPM con Nginx, MySQL/MariaDB o PostgreSQL, Redis para caché y cola, y configuración y monitoreo de SSL.

Servicios relacionados

Para implementar profesionalmente esta arquitectura, puede utilizar los siguientes servicios:

  • Más que 85 ubicaciones globales Para reducir la latencia y acercar el servidor al usuario o destino
  • Servidor de gráficos (GPU) para computación y renderizado de IA
  • VPS para comercio con ping bajo y red BGP optimizada
  • VPS para juegos con ping bajo y anti-DDoS
  • Servicios de hosting y registro de dominios, CDN, soluciones de red y BGP
  • Servidor en la nube de alto rendimiento y copia de seguridad administrada

Preguntas frecuentes

También te puede gustar
Cómo instalar Cockpit en Ubuntu 24.04

Cómo instalar Cockpit en Ubuntu 24.04

Cockpit es un panel de administración web para servidores que permite monitorizar y gestionar servicios, almacenamiento, registros y usuarios de forma sencilla e intuitiva. Usar Cockpit en un VPS permite a los administradores de sistemas realizar numerosas tareas de administración del servidor sin necesidad de usar la línea de comandos. A continuación, te guiaremos paso a paso en la instalación, configuración de seguridad y acceso a Cockpit.