0

0

使用 Docker 容器化 Laravel 和 PostgreSQL 应用

DDD

DDD

发布时间:2025-11-30 13:46:02

|

413人浏览过

|

来源于php中文网

原创

使用 docker 容器化 laravel 和 postgresql 应用

本教程详细介绍了如何利用 Docker 和 Docker Compose 容器化 Laravel 应用程序与 PostgreSQL 数据库。我们将提供优化的 Dockerfile 和 docker-compose.yml 配置,涵盖 PHP-FPM、Composer、Node.js 依赖安装以及 PostgreSQL 数据库的设置,确保开发环境的快速搭建和一致性。文章还包括运行指令、数据库连接配置及重要的生产环境考量,旨在帮助开发者高效地管理 Laravel 项目的容器化部署。

第一部分:项目结构与核心文件

要使用 Docker 容器化 Laravel 应用和 PostgreSQL 数据库,我们需要两个核心文件:Dockerfile 用于构建 Laravel 应用的镜像,以及 docker-compose.yml 用于定义和协调 Laravel 应用服务与 PostgreSQL 数据库服务。

在项目的根目录下,创建以下文件:

  • Dockerfile
  • docker-compose.yml

第二部分:构建 Laravel 应用的 Dockerfile

Dockerfile 定义了如何构建 Laravel 应用的 Docker 镜像。它将包含安装 PHP 扩展、Composer、Node.js 等所有必要步骤。

以下是一个为 Laravel 应用优化的 Dockerfile 示例:

# 使用官方 PHP-FPM 镜像作为基础,版本为 7.4
FROM php:7.4-fpm

# 设置工作目录
WORKDIR /app

# 安装系统依赖:Git, Curl, PNG库, Onig库, XML库, Zip库, PostgreSQL客户端, Node.js 等
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 \
    nodejs \
    npm \
    --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

# 安装 PHP 扩展:PostgreSQL PDO, 多字节字符串, EXIF, 进程控制, 任意精度数学, GD图形库, Zip
RUN docker-php-ext-install -j$(nproc) pdo_pgsql mbstring exif pcntl bcmath gd zip

# 安装 Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# 将应用程序文件复制到容器中
COPY . /app

# 安装 Laravel 依赖
# 首先清理旧的 vendor 目录和 composer.lock 文件,确保全新安装
RUN rm -rf vendor composer.lock \
    && composer install --no-dev --optimize-autoloader

# 设置 Laravel 目录权限
RUN chmod -R 775 storage bootstrap/cache \
    && chown -R www-data:www-data /app

# 安装 Node.js 依赖 (如果您的 Laravel 项目使用了 Laravel Mix 或前端构建工具)
RUN npm install

# 暴露 PHP-FPM 端口
EXPOSE 9000

# 启动 PHP-FPM 服务
CMD ["php-fpm"]

Dockerfile 解释:

  • FROM php:7.4-fpm: 选择 php:7.4-fpm 作为基础镜像,这更适合生产环境,因为 php-fpm 专为 Web 服务器(如 Nginx)处理 PHP 请求而设计。
  • WORKDIR /app: 将容器内的工作目录设置为 /app。
  • RUN apt-get update && apt-get install -y ...: 安装 Laravel 运行和开发所需的系统级依赖,包括 Git、Curl、各种库(如 libpng-dev、libpq-dev 用于 PostgreSQL 连接),以及 Node.js 和 npm。--no-install-recommends 和 rm -rf /var/lib/apt/lists/* 有助于减小镜像大小。
  • RUN docker-php-ext-install ...: 安装 Laravel 和 PostgreSQL 连接所需的 PHP 扩展,例如 pdo_pgsql、mbstring、gd、zip 等。-j$(nproc) 利用多核加速编译。
  • RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer: 安装 Composer,PHP 的依赖管理工具。
  • COPY . /app: 将宿主机当前目录(即 Laravel 项目根目录)下的所有文件复制到容器的 /app 目录。
  • RUN rm -rf vendor composer.lock && composer install --no-dev --optimize-autoloader: 清理并安装 Composer 依赖。--no-dev 用于生产环境排除开发依赖,--optimize-autoloader 优化自动加载。
  • RUN chmod -R 775 storage bootstrap/cache && chown -R www-data:www-data /app: 设置 Laravel 关键目录的权限,确保 Web 服务器(www-data 用户)有写入权限。
  • RUN npm install: 如果您的 Laravel 项目使用 Laravel Mix 或其他前端构建工具,需要安装 Node.js 依赖。
  • EXPOSE 9000: 声明容器将监听 9000 端口(PHP-FPM 的默认端口)。
  • CMD ["php-fpm"]: 定义容器启动时执行的命令,即启动 PHP-FPM 服务。

第三部分:配置 Docker Compose 协调服务

docker-compose.yml 文件用于定义和运行多容器 Docker 应用程序。我们将在此文件中定义 Laravel 应用服务和 PostgreSQL 数据库服务,并配置它们之间的网络和数据持久化。

以下是一个完整的 docker-compose.yml 示例:

多瑞(doreesoft)外贸网店系统
多瑞(doreesoft)外贸网店系统

多瑞外贸网店系统立足于全球化贸易往来的一款外贸类企业用户高端应用电子商务系统软件,帮助企业快速搭建网聚全球商机的电子商务系统。本系统使用纯正的英文,国外用户更容易阅读;多年专业外贸设计经验,熟练掌握美式英语,更符合国外用户考虑和解决问题的逻辑;设计风格、用户体验符合国外用户的习惯;简洁明了的设计风格正是欧美用户的所爱,时时推出新模板、紧跟时尚潮流,供您选择。新增加淘宝数据自动导入,批量上传商品,商

下载
version: '3.8' # 指定 Docker Compose 文件格式版本

services:
  # Laravel 应用服务
  laravel_app:
    container_name: my-laravel-app # 容器名称
    build:
      context: . # 构建上下文为当前目录
      dockerfile: Dockerfile # 使用当前目录下的 Dockerfile
    # 在开发环境中,我们可以直接运行 Laravel 内置的开发服务器
    # 注意:生产环境建议使用 Nginx + PHP-FPM
    command: 'php artisan serve --host=0.0.0.0 --port=8000'
    restart: unless-stopped # 容器异常退出时自动重启
    volumes:
      - .:/app # 将宿主机当前目录挂载到容器的 /app 目录,方便代码修改后无需重建镜像
    ports:
      - "8000:8000" # 将宿主机的 8000 端口映射到容器的 8000 端口
    environment:
      # Laravel 应用程序的环境变量
      DB_CONNECTION: pgsql
      DB_HOST: postgres_db # 数据库服务名称,Docker Compose 会自动解析为 IP
      DB_PORT: 5432
      DB_DATABASE: my_laravel_db
      DB_USERNAME: laravel_user
      DB_PASSWORD: secret_password
      APP_ENV: local
      APP_DEBUG: "true"
      APP_KEY: base64:your_base64_app_key_here # 请替换为实际生成的 APP_KEY
    networks:
      - app_network # 连接到自定义网络
    depends_on:
      - postgres_db # 确保 postgres_db 服务在 laravel_app 之前启动

  # PostgreSQL 数据库服务
  postgres_db:
    container_name: my-postgres-db # 容器名称
    image: postgres:13 # 使用 PostgreSQL 13 官方镜像
    restart: unless-stopped # 容器异常退出时自动重启
    ports:
      - "5432:5432" # 将宿主机的 5432 端口映射到容器的 5432 端口
    volumes:
      - postgres_data:/var/lib/postgresql/data # 数据卷用于持久化 PostgreSQL 数据
    environment:
      # PostgreSQL 数据库的环境变量
      POSTGRES_DB: my_laravel_db
      POSTGRES_USER: laravel_user
      POSTGRES_PASSWORD: secret_password
      # POSTGRES_HOST_AUTH_METHOD: "trust" # 仅用于开发环境,生产环境不推荐,因为它允许所有连接无需密码
    networks:
      - app_network # 连接到自定义网络

# 定义自定义网络,用于服务间通信
networks:
  app_network:
    driver: bridge # 使用桥接网络模式

# 定义数据卷,用于持久化 PostgreSQL 数据
volumes:
  postgres_data:
    driver: local # 使用本地数据卷

docker-compose.yml 解释:

  • version: '3.8': 指定 Docker Compose 文件格式的版本。
  • services: 定义了多个服务。
    • laravel_app:
      • build: 指示 Docker Compose 从当前目录的 Dockerfile 构建镜像。
      • command: 在开发环境中,我们直接运行 Laravel 的内置服务器。请注意,在生产环境中,通常会使用 Nginx 作为 Web 服务器,并通过 PHP-FPM(Dockerfile 中已配置)处理 PHP 请求。
      • volumes: 将宿主机的当前目录挂载到容器的 /app 目录。这意味着您在宿主机上修改代码后,容器内的代码也会同步更新,无需重建镜像。
      • ports: 将宿主机的 8000 端口映射到容器的 8000 端口,以便您可以通过 http://localhost:8000 访问 Laravel 应用。
      • environment: 设置 Laravel 应用程序的环境变量,包括数据库连接信息。DB_HOST 使用 postgres_db,这是 PostgreSQL 服务的名称,Docker Compose 会自动将其解析为容器内部 IP。APP_KEY 需要替换为您自己的应用密钥。
      • networks: 将 laravel_app 服务连接到名为 app_network 的自定义网络。
      • depends_on: 确保 postgres_db 服务在 laravel_app 之前启动。
    • postgres_db:
      • image: 使用 postgres:13 官方镜像。建议指定版本以确保稳定性。
      • ports: 将宿主机的 5432 端口映射到容器的 5432 端口,方便通过外部工具连接数据库(可选)。
      • volumes: 使用一个名为 postgres_data 的数据卷来持久化 PostgreSQL 的数据。这意味着即使容器被删除,数据也不会丢失。
      • environment: 设置 PostgreSQL 数据库的环境变量,包括数据库名称、用户名和密码。这些值应与 Laravel 应用的 .env 文件中的配置相匹配。
  • networks: 定义了一个名为 app_network 的桥接网络,允许 laravel_app 和 postgres_db 服务在内部相互通信。
  • volumes: 定义了名为 postgres_data 的数据卷,用于 PostgreSQL 数据的持久化存储。

第四部分:Laravel 数据库连接配置

在 Laravel 项目的 .env 文件中,您需要配置数据库连接信息,以匹配 docker-compose.yml 中 PostgreSQL 服务的设置:

DB_CONNECTION=pgsql
DB_HOST=postgres_db # 使用 Docker Compose 服务名称
DB_PORT=5432
DB_DATABASE=my_laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=secret_password

确保 APP_KEY 已经生成。如果没有,在容器启动后,可以通过 docker-compose exec laravel_app php artisan key:generate 命令生成。

第五部分:运行和管理容器

完成 Dockerfile 和 docker-compose.yml 文件的配置后,您可以使用以下命令来构建、启动和管理您的容器化应用:

  1. 构建和启动服务: 在项目的根目录下,打开终端并运行:

    sudo docker-compose build # 构建 Laravel 应用镜像
    sudo docker-compose up -d # 在后台启动所有服务
    • docker-compose build 会根据 Dockerfile 构建 laravel_app 服务的镜像。
    • docker-compose up -d 会启动 laravel_app 和 postgres_db 服务,-d 参数表示在后台运行。
  2. 检查服务状态:

    sudo docker-compose ps

    此命令将显示所有服务的运行状态。

  3. 查看日志:

    sudo docker-compose logs -

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2528

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1604

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1496

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

0

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号