使用Docker容器化Laravel与PostgreSQL的完整教程

12次阅读

使用 Docker 容器化 Laravel 与 PostgreSQL 的完整教程

本教程详细指导如何利用 docker 和 docker compose 容器化 laravel 应用程序与 postgresql 数据库。文章涵盖了优化的 dockerfile 配置,用于构建 laravel 应用镜像;以及一份完整的 docker-compose.yml 文件,用于编排 laravel 应用、postgresql 数据库和网络。此外,教程还提供了 laravel 环境配置、容器启动与管理命令,并分享了重要的注意事项与最佳实践,旨在帮助开发者高效搭建和部署开发环境。

1. 引言

在现代 Web 开发中,Docker 已成为部署和管理应用程序及其依赖的强大工具。通过容器化,我们可以确保开发、测试和生产环境的一致性,极大地简化了环境配置和团队协作。本教程将指导您如何使用 Docker 和 Docker Compose 将 Laravel 应用与 PostgreSQL 数据库进行容器化,构建一个高效、可移植的开发环境。

2. 项目结构概述

在开始之前,请确保您的 Laravel 项目已经准备就绪。我们将创建两个核心文件:Dockerfile 用于构建 Laravel 应用程序的 Docker 镜像,以及 docker-compose.yml 用于定义和运行 Laravel 应用与 PostgreSQL 数据库服务。这些文件通常放置在 Laravel 项目的根目录下。

. ├── app/ ├── bootstrap/ ├── config/ ├── database/ ├── public/ ├── resources/ ├── routes/ ├── storage/ ├── tests/ ├── vendor/ ├── .env ├── composer.json ├── composer.lock ├── artisan ├── Dockerfile              <-- Laravel 应用的 Dockerfile └── docker-compose.yml      <-- Docker Compose 配置文件

3. Dockerfile 配置 (Laravel 应用容器)

Dockerfile 用于定义如何构建您的 Laravel 应用程序镜像。以下是一个针对 Laravel 7.x/8.x (PHP 7.4) 和 PostgreSQL 优化的 Dockerfile 示例。

# 使用官方 PHP-FPM 镜像作为基础,版本为 7.4 FROM php:7.4-fpm  # 设置容器内的工作目录 WORKDIR /app  # 安装系统依赖:# git, curl: 常用的版本控制和网络工具 # libpng-dev, libonig-dev, libxml2-dev, libzip-dev, zip, unzip: PHP 扩展所需的库 # postgresql-client, libpq-dev: PostgreSQL 客户端工具和 PHP PostgreSQL 扩展所需的开发库 # python3, python3-pip: 如果您的项目需要 Python 脚本或数据科学工具 (可选) RUN apt-get update && apt-get install -y      git      curl      libpng-dev      libonig-dev      libxml2-dev      libzip-dev      zip      unzip      vim      postgresql-client      libpq-dev      python3      python3-pip &&      rm -rf /var/lib/apt/lists/* &&      ln -s /usr/bin/python3 /usr/bin/python  # 安装可选的 Python 包 (如果需要,可根据项目需求调整) # RUN pip3 install --no-cache-dir pandas scikit-learn numpy  # 安装并启用 PHP 扩展:# pdo_pgsql: PostgreSQL 数据库驱动 # mbstring: 多字节字符串支持 # exif: 处理图像元数据 # pcntl: 进程控制 (通常用于队列) # bcmath: 任意精度数学 # gd: 图像处理库 (需要 libpng-dev) # zip: Zip 文件处理 (需要 libzip-dev) RUN docker-php-ext-install -j$(nproc) pdo_pgsql mbstring exif pcntl bcmath gd zip &&      docker-php-ext-enable gd zip  # 安装 Node.js 和 npm (如果您的 Laravel 项目使用 Laravel Mix 或其他前端构建工具,则需要) # 这里安装的是 Node.js 16.x 版本 RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -      && apt-get install -y nodejs &&      rm -rf /var/lib/apt/lists/*  # 安装 Composer (PHP 依赖管理器) RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer  # 将本地项目文件复制到容器的工作目录 COPY . .  # 安装 Laravel 项目依赖 # 先删除旧的 vendor 目录和 composer.lock 以确保清洁安装 # 使用 --no-dev 和 --optimize-autoloader 进行生产环境优化安装 RUN rm -rf vendor composer.lock &&      composer install --no-dev --optimize-autoloader  # 设置 Laravel 存储和缓存目录的权限,确保 Web 服务器可以写入 RUN chmod -R 775 storage bootstrap/cache &&      chown -R www-data:www-data /app  # 如果项目使用 Laravel Mix,安装 Node.js 依赖并编译前端资源 (可选) # RUN npm install && npm run prod  # 暴露 PHP-FPM 的默认端口 EXPOSE 9000  # 启动 PHP-FPM 服务 CMD ["php-fpm"]

Dockerfile 解释:

  • FROM php:7.4-fpm: 选择 PHP 7.4 FPM 作为基础镜像。FPM (FastCGI Process Manager) 是生产环境中运行 PHP 应用的推荐方式,它与 Nginx 等 Web 服务器配合使用。
  • WORKDIR /app: 设置容器内的工作目录,所有后续命令都将在此目录下执行。
  • RUN apt-get update && apt-get install -y …: 更新包列表并安装必要的系统依赖。这包括 PostgreSQL 客户端工具 (postgresql-client) 和 PHP 扩展所需的开发库 (libpq-dev, libpng-dev 等)。
  • RUN docker-php-ext-install …: 安装并启用 PHP 扩展,如 pdo_pgsql (PostgreSQL 数据库驱动)、gd (图像处理) 等,这些是 Laravel 应用可能需要的。
  • RUN curl … | bash – && apt-get install -y nodejs: 安装 Node.js和 npm,如果您的 Laravel 项目需要 前端 构建(例如使用 Laravel Mix)。
  • RUN curl … | php — … composer: 安装 Composer,用于管理 PHP 依赖。
  • COPY . .: 将当前目录(您的 Laravel 项目)下的所有文件复制到容器的 /app 目录。
  • RUN composer install –no-dev –optimize-autoloader: 安装 Laravel 项目的 PHP 依赖。–no-dev 排除开发依赖,–optimize-autoloader 优化 Composer 自动加载器,这对于生产环境非常有用。
  • RUN chmod -R 775 storage bootstrap/cache && chown -R www-data:www-data /app: 设置 Laravel 的 storage 和 bootstrap/cache 目录的权限,确保 Web 服务器用户 (www-data) 可以写入。
  • EXPOSE 9000: 声明容器将监听 9000 端口,这是 PHP-FPM 的默认端口。
  • CMD [“php-fpm”]: 定义容器启动时执行的命令,即启动 PHP-FPM 服务。

4. Docker Compose 配置 (服务编排)

docker-compose.yml 文件用于定义和运行多容器 Docker 应用程序。我们将在这里定义 Laravel 应用服务和 PostgreSQL 数据库服务。

version: '3.8' # 推荐使用较新的 Compose 文件格式版本  services:   # Laravel 应用服务   laravel_app:     container_name: laravel-app-container     build:       context: . # Dockerfile 所在的上下文路径,通常是当前目录       dockerfile: Dockerfile # 指定 Dockerfile 的名称     command: 'php artisan serve --host=0.0.0.0 --port=8000' # 启动 Laravel 开发服务器     restart: unless-stopped # 容器异常退出时自动重启     volumes:       - .:/app # 将当前目录挂载到容器的 /app 目录,实现代码热重载       - /app/vendor # 匿名卷,防止宿主机的 vendor 目录覆盖容器内的依赖       - /app/node_modules # 匿名卷,防止宿主机的 node_modules 目录覆盖容器内的依赖     ports:       - "80:8000" # 将宿主机的 80 端口映射到容器的 8000 端口     environment: # 环境变量,用于 Laravel 连接数据库       DB_CONNECTION: pgsql       DB_HOST: postgres_db # 数据库服务名称作为主机名       DB_PORT: 5432       DB_DATABASE: your_laravel_db # 替换为您的数据库名称       DB_USERNAME: your_user # 替换为您的数据库用户名       DB_PASSWORD: your_password # 替换为您的数据库密码     depends_on:       - postgres_db # 确保 postgres_db 服务在 laravel_app 之前启动     networks:       - app_network # 连接到自定义网络    # PostgreSQL 数据库服务   postgres_db:     container_name: postgres-db-container     image: postgres:13 # 使用 PostgreSQL 13 官方镜像     restart: unless-stopped     environment: # 数据库环境变量       POSTGRES_DB: your_laravel_db # 替换为您的数据库名称       POSTGRES_USER: your_user # 替换为您的数据库用户名       POSTGRES_PASSWORD: your_password # 替换为您的数据库密码     volumes:       - postgres_data:/var/lib/postgresql/data # 数据持久化卷     ports:       - "5432:5432" # 将宿主机的 5432 端口映射到容器的 5432 端口 (可选,用于外部访问)     networks:       - app_network # 连接到自定义网络  # 定义数据卷,用于 PostgreSQL 数据持久化 volumes:   postgres_data:  # 定义自定义网络,使服务之间可以相互通信 networks:   app_network:     driver: bridge # 默认的桥接网络

docker-compose.yml 解释:

  • version: ‘3.8’: 指定 Compose 文件格式版本。
  • services: 定义应用程序包含的服务。
    • laravel_app:
      • build: 指示 Docker Compose 使用当前目录下的 Dockerfile 构建镜像。
      • command: 覆盖 Dockerfile 中的 CMD,直接运行 Laravel 的开发服务器。
      • restart: unless-stopped: 容器在非手动停止的情况下会自动重启。
      • volumes:
        • .:/app: 将宿主机的当前目录挂载到容器的 /app 目录。这意味着您在本地修改代码,容器内会立即反映,无需重建镜像。
        • /app/vendor 和 /app/node_modules: 这些是匿名卷,用于防止宿主机上的 vendor 和 node_modules 目录覆盖容器内已安装的依赖。当您在容器内运行 composer install 或 npm install 时,这些依赖会安装到这些匿名卷中,而不是直接映射到宿主机。
      • ports: – “80:8000”: 将宿主机的 80 端口映射到容器的 8000 端口,您可以通过 http://localhost 访问 Laravel 应用。
      • environment: 设置环境变量,Laravel 会使用这些变量连接到 PostgreSQL 数据库。DB_HOST 设置为 postgres_db,这是数据库服务的名称,Docker Compose 会自动解析。
      • depends_on: – postgres_db: 确保 postgres_db 服务在 laravel_app 之前启动。
      • networks: – app_network: 将服务连接到名为 app_network 的自定义网络。
    • postgres_db:
      • image: postgres:13: 使用 PostgreSQL 13 的官方 Docker 镜像。
      • environment: 设置 PostgreSQL 数据库的名称、用户名和密码。请务必替换为您的实际值。
      • volumes: – postgres_data:/var/lib/postgresql/data: 使用命名卷 postgres_data 来持久化 PostgreSQL 的数据。这样即使容器被删除,数据也不会丢失。
      • ports: – “5432:5432”: 将宿主机的 5432 端口映射到容器的 5432 端口。这允许您从宿主机上的其他工具(如 pgAdmin)直接连接到数据库。
      • networks: – app_network: 连接到自定义网络。
  • volumes: 定义命名卷 postgres_data,用于 PostgreSQL 的数据持久化。
  • networks: 定义一个名为 app_network 的自定义桥接网络,所有服务都将连接到这个网络,从而能够通过服务名称相互通信。

5. Laravel 环境配置 (.env)

在您的 Laravel 项目根目录下的 .env 文件中,您需要配置数据库连接信息,使其能够连接到 Docker Compose 中运行的 PostgreSQL 服务。

DB_CONNECTION=pgsql DB_HOST=postgres_db # 必须与 docker-compose.yml 中数据库服务的名称一致 DB_PORT=5432 DB_DATABASE=your_laravel_db # 必须与 docker-compose.yml 中 POSTGRES_DB 一致 DB_USERNAME=your_user # 必须与 docker-compose.yml 中 POSTGRES_USER 一致 DB_PASSWORD=your_password # 必须与 docker-compose.yml 中 POSTGRES_PASSWORD 一致

重要提示: 请确保 .env 文件中的数据库配置与 docker-compose.yml 中 postgres_db 服务的 environment 部分完全匹配。

6. 启动与

以上就是使用 Docker 容器化 Laravel 与 PostgreSQL 的完整教程的详细内容,更多请关注 php 中文网其它相关文章!

text=ZqhQzanResources