在 Ubuntu 22.04 上使用 Docker Compose 安装和配置 Laravel — 全面指南
本分步指南将教您如何在 Ubuntu 22.04 上使用 Docker Compose 安装和配置 Laravel,并创建一个安全且优化的生产环境。.

在 Ubuntu 22.04 上使用 Docker Compose 安装和配置 Laravel — 全面指南

本文将向您展示如何使用 Docker Compose 在 Ubuntu 22.04 上安装和部署 Laravel 应用程序。通过逐步讲解,您可以轻松创建一个安全且优化的生产环境。.
0 股票
0
0
0
0

如何在 Ubuntu 22.04 上使用 Docker Compose 安装和配置 Laravel?

在本实用技术指南中,我们将逐步引导您完成应用程序的安装和配置过程。 Laravel 使用 Docker Compose 在服务器上 Ubuntu 22.04 本文旨在为开发人员、DevOps 团队和技术经理提供可重复使用的指导原则,以创建安全、可扩展和可维护的生产环境。.

初始检查清单

开始之前,请准备以下物品:

  • 服务器 Ubuntu 22.04 拥有 root 权限或具有 sudo 权限的用户
  • Docker (稳定版本)和 Docker Compose (或者使用 docker compose 插件)
  • 打开端口: 80/443 用于网络;如有需要 3306 或者 5432 用于数据库(最好仅限于 IP 地址)
  • 充足的磁盘空间(建议使用固态硬盘)以及对一个或多个设备的访问权限 85个地点 如果使用云服务,则为全局服务
  • 指向服务器 IP 地址的域名和 DNS 记录

在 Ubuntu 22.04 上安装 Docker 和 Docker Compose

在服务器上运行以下命令以安装 Docker 和 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

然后注销并重新登录,或者 新组 Docker 使用。.

检查安装情况:

docker --version
docker compose version

拟议项目结构

为了便于维护和开发,建议按以下方式组织项目文件夹:

  • 项目根目录/
    • docker/
      • nginx/default.conf
      • php/Dockerfile
    • src/ — Laravel 代码(或挂载点)
    • docker-compose.yml
    • .env

推荐的 PHP-FPM (PHP 8.1) Dockerfile

一个带有路径的文件 docker/php/Dockerfile 创建类似以下示例的内容:

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

docker-compose.yml 示例

建议版本 docker-compose.yml 运行应用程序、Web 服务器、数据库和 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

Nginx配置文件(docker/nginx/default.conf)

将请求路由到 PHP-FPM(应用程序)的 Nginx 配置示例:

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;
    }
}

笔记: 在具有反向代理或多个服务的架构中,您可以将 Nginx 放置在负载均衡器或 CDN 层。.

准备代码并安装依赖项

如果您还没有 Laravel 项目,可以使用 Composer 创建一个新项目:

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

然后构建并运行容器:

docker compose build
docker compose up -d

在 PHP 容器内运行 Composer 和 Artisan 命令:

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

为 Docker 设置 .env 文件

与 docker-compose 兼容的 .env 配置示例:

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 和 Let's Encrypt — 两种简便方法

启用 HTTPS 有两种简单的方法:

  • 在主机上使用 Certbot: 暂时停止 Nginx 服务,将颁发的证书放入文件夹中 ./certs 并将其安装到容器上。.
  • 使用自动化解决方案: 类似工具 docker-letsencrypt-nginx-proxy-companion 或者 交通 它们适用于自动化证书管理。.

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

启动时运行并保持服务

为确保重启后服务能够正常运行:

sudo systemctl enable docker

此外,在 docker-compose 中 重启:除非已停止 它已被使用。如有需要,可以为 docker-compose 创建一个 systemd 单元。.

实用安全提示

  • 在 PHP 容器中使用非 root 用户 (应用用户 (如上所示的 Dockerfile)
  • 使用防火墙 (UFW) 限制对数据库端口的访问:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable

其他建议:

  • 定期备份数据库卷(数据库数据并将其存储在服务器外部
  • 启用 HTTPS 和 HSTS
  • 使用密钥管理服务存储密码(Docker 密钥管理服务)
  • 使用安全工具,例如 失败2禁止 如果需要的话,就像WAF一样 ModSecurity
  • 使用 CDN 或 DDoS 防护服务来保护流量

生产环境的性能优化

  • 启用 OPcache php.ini:
    opcache.memory_consumption=256
    opcache.validate_timestamps=0
  • 设置 php-fpm(pm = 动态或按需)并增加 最大子节点数 根据服务器内存
  • 使用 Redis 进行缓存和会话管理
  • 使用 CDN 传输静态文件
  • 横向扩展:使用负载均衡器(NGINX 或 HAProxy)运行应用服务的多个实例
  • 对于实时任务和队列任务,应使用不同的工作人员和主管或服务。

队列工作线程和 Horizon

在 docker-compose 文件中添加一个单独的服务来运行队列工作进程。例如:

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

对于 Laravel Horizon,最好使用安装了 PHP 和 Horizon 的专用容器,并将其置于 Nginx/authentication 之后。.

关于数据中心选址的建议

选择地点的实用技巧:

  • 为了获得最低延迟,请选择靠近最终用户或目的地的服务器。服务提供商的作用远不止于此。 全球85个地点 确实如此。.
  • 对于游戏玩家或交易者来说,选择延迟低且 BGP 网络优化的地点。.
  • 使用配备 GPU 的服务器进行 AI 处理和渲染。.
  • 使用具有 DDoS 防护功能的服务器和 CDN 来抵御 DDoS 攻击。.

备份、监控和日志

  • 容器日志 Docker 日志 易于访问;使用 ELK 或 Prometheus+Grafana 进行集中聚合。.
  • 每日数据库备份和定期恢复测试
  • 在 CI/CD 中监控 CPU/RAM 资源、应用程序和错误跟踪

常见调试

  • 502 网关错误: 检查 php-fpm 是否在应用程序容器中运行,以及 fastcgi_pass 是否设置为正确的地址(app:9000指出。.
  • 数据库连接问题: 检查 .env 变量、Docker 网络和 MySQL 日志。.
  • 文件权限: 如果出现权限错误,请设置存储文件夹和引导/缓存文件夹的所有权:
sudo chown -R 1000:1000 src/storage src/bootstrap/cache

结论和最终建议

在 Ubuntu 22.04 上使用 Docker Compose 运行 Laravel,可以简化开发和部署流程,使其可重复且可扩展。按照本指南,您可以搭建一个安全、快速且易于维护的生产环境: PHP-FPM 与 NginxMySQL/MariaDB 或 PostgreSQL,Redis 用于缓存和队列,以及 SSL 设置和监控。.

相关服务

要专业地实现这种架构,您可以使用以下服务:

  • 多于 全球85个地点 为了降低延迟并将服务器拉近与用户或目的地的距离
  • 用于人工智能计算和渲染的图形服务器(GPU)
  • 用于交易的VPS,具有低延迟和优化的BGP网络
  • 低延迟、防DDoS攻击的游戏VPS
  • 主机托管和域名注册服务、CDN、网络和 BGP 解决方案
  • 高性能云服务器和托管备份

常见问题解答

您可能也喜欢
如何在 Ubuntu 24.04 上安装 Cockpit

如何在 Ubuntu 24.04 上安装 Cockpit

Cockpit 是一个基于 Web 的服务器管理面板,它以简洁的图形化方式监控和管理服务、存储、日志和用户。在 VPS 上使用 Cockpit,系统管理员无需使用命令行即可执行许多服务器管理任务。下面,我们将逐步指导您如何安装、配置安全性和访问 Cockpit。.