使用Docker容器化Laravel与PostgreSQL:完整实践指南

使用Docker容器化Laravel与PostgreSQL:完整实践指南

本教程旨在提供一个使用docker容器化%ignore_a_1%应用与postgresql数据库的完整指南。我们将详细介绍如何配置dockerfile以构建php-fpm服务,集成composer和node.js,并创建docker-compose.yml文件来编排laravel应用容器和postgresql数据库容器。通过本指南,读者将学习如何构建、运行并管理一个基于docker的laravel开发环境,确保环境一致性和部署便捷性。

引言

在现代软件开发中,容器化技术已成为构建、部署和管理应用程序的基石。Docker通过提供轻量级、可移植且自包含的运行环境,极大地简化了开发工作流。本教程将指导您如何使用Docker和Docker Compose,将一个Laravel应用程序与PostgreSQL数据库进行容器化,从而实现一个高效、一致且易于维护的开发环境。

前提条件

在开始之前,请确保您的系统已安装以下软件:

Docker Desktop: 包含Docker Engine和Docker Compose。一个现有的Laravel项目(或创建一个新项目)。

项目结构

为了保持清晰和组织性,建议您的项目根目录包含以下文件和目录:

your-laravel-project/├── .env                 # Laravel 环境变量文件├── Dockerfile           # Laravel 应用的 Docker 构建文件├── docker-compose.yml   # Docker Compose 编排文件├── app/├── bootstrap/├── config/├── database/├── public/├── resources/├── routes/├── storage/├── tests/├── vendor/└── ... (其他Laravel文件)

1. 定义Laravel应用服务(Dockerfile)

Dockerfile用于构建包含Laravel应用及其所有依赖的Docker镜像。我们将基于PHP-FPM官方镜像,并安装必要的系统依赖、PHP扩展、Composer和Node.js

在项目根目录下创建名为Dockerfile的文件,并添加以下内容:

# 使用官方PHP-FPM运行时作为父镜像FROM php:7.4-fpm# 设置工作目录WORKDIR /app# 安装系统依赖:Git、Curl、图像处理库、PostgreSQL客户端、压缩工具等# 注意:Python3及其科学计算库(pandas, scikit-learn, numpy)在此处安装,# 如果您的Laravel应用不涉及数据科学,可以移除相关行以减小镜像体积。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 &&     ln -s /usr/bin/python3 /usr/bin/python# 安装Python包(可选,如果不需要数据科学工具可移除)RUN pip3 install --no-cache-dir pandas scikit-learn numpy# 安装PHP扩展:PostgreSQL PDO、多字节字符串、Exif、进程控制、高精度计算、GD库、ZipRUN docker-php-ext-install pdo_pgsql mbstring exif pcntl bcmath gd zip# 启用已安装的GD和Zip扩展RUN docker-php-ext-enable gd zip# 安装Node.js和npm(Laravel Mix等前端工具可能需要)# 这里安装Node.js 16.x版本RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -     && apt-get install -y nodejs# 安装ComposerRUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# 将应用程序文件复制到容器中COPY . .# 安装Laravel依赖# 移除旧的vendor目录和composer.lock以确保全新安装# 使用 composer install --no-dev --optimize-autoloader 优化生产环境的依赖安装RUN rm -rf vendor composer.lock && composer update && composer install --no-dev --optimize-autoloader# 设置Laravel目录的权限# www-data 是 PHP-FPM 进程通常使用的用户和组RUN chmod -R 775 storage bootstrap/cache &&     chown -R www-data:www-data /app# 安装Node.js依赖(如果使用Laravel Mix)RUN npm install# 暴露PHP-FPM默认端口9000EXPOSE 9000# 启动PHP-FPM服务CMD ["php-fpm"]

代码解释:

FROM php:7.4-fpm: 选择PHP 7.4 FPM作为基础镜像,它包含了运行PHP应用程序所需的环境。WORKDIR /app: 将容器内的工作目录设置为/app。所有后续命令都将在此目录下执行。RUN apt-get update && apt-get install -y …: 安装必要的系统软件包,包括Git、Curl、图像处理库、PostgreSQL客户端库(postgresql-client, libpq-dev)等。RUN docker-php-ext-install …: 安装并启用Laravel常用的PHP扩展,如pdo_pgsql(用于PostgreSQL连接)、mbstring、gd(图像处理)和zip。RUN curl -fsSL … | bash – && apt-get install -y nodejs: 安装Node.js和npm,这对于使用Laravel Mix编译前端资源非常重要。RUN curl -sS … | php — …: 安装Composer,用于管理PHP依赖。COPY . .: 将宿主机当前目录(即Laravel项目根目录)下的所有文件复制到容器的/app目录。RUN rm -rf vendor composer.lock && composer update && composer install –no-dev –optimize-autoloader: 清理旧的依赖,然后通过composer update更新composer.lock文件,最后执行composer install安装项目依赖。–no-dev用于跳过开发环境依赖,–optimize-autoloader用于优化自动加载。RUN chmod -R 775 storage bootstrap/cache && chown -R www-data:www-data /app: 设置storage和bootstrap/cache目录的写入权限,并更改整个/app目录的所有者为www-data用户,确保PHP-FPM进程有足够的权限。RUN npm install: 安装Node.js项目依赖。EXPOSE 9000: 声明容器将监听9000端口,这是PHP-FPM的默认端口。CMD [“php-fpm”]: 定义容器启动时执行的默认命令,即启动PHP-FPM服务。

2. 编排服务(docker-compose.yml)

docker-compose.yml文件用于定义和运行多容器Docker应用程序。我们将定义两个服务:一个用于Laravel应用(laravel-app),另一个用于PostgreSQL数据库(postgres-db)。

在项目根目录下创建名为docker-compose.yml的文件,并添加以下内容:

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 目录,实现代码同步    ports:      - "8000:8000" # 将宿主机的 8000 端口映射到容器的 8000 端口    depends_on:      - postgres-db # 声明此服务依赖于 postgres-db 服务    networks:      - app-network # 将此服务连接到 app-network 网络  # PostgreSQL 数据库服务  postgres-db:    container_name: postgres-db-container # 指定容器名称    image: postgres:13 # 使用官方 PostgreSQL 13 镜像    restart: unless-stopped # 容器异常退出时自动重启    environment: # 设置 PostgreSQL 环境变量      POSTGRES_DB: laravel_db # 数据库名称      POSTGRES_USER: laravel_user # 数据库用户      POSTGRES_PASSWORD: secret # 数据库密码      # POSTGRES_HOST_AUTH_METHOD: "trust" # 生产环境不推荐,仅用于开发简化认证    volumes:      - postgres_data:/var/lib/postgresql/data # 挂载数据卷,实现数据持久化    ports:      - "5432:5432" # 将宿主机的 5432 端口映射到容器的 5432 端口    networks:      - app-network # 将此服务连接到 app-network 网络# 定义网络,使服务之间可以互相通信networks:  app-network:    driver: bridge # 使用桥接网络驱动# 定义数据卷,用于 PostgreSQL 数据的持久化存储volumes:  postgres_data:    driver: local # 使用本地驱动

代码解释:

version: ‘3.8’: 指定Docker Compose文件格式版本。services: 定义了两个服务。laravel-app:build: 指示Docker Compose根据当前目录下的Dockerfile构建镜像。command: ‘php artisan serve –host=0.0.0.0 –port=8000’: 覆盖Dockerfile中的CMD,直接使用Laravel自带的开发服务器启动应用。这在开发环境中非常方便。volumes: – .:/app: 将宿主机项目根目录挂载到容器的/app目录。这意味着您在宿主机上修改代码,容器内会立即同步,无需重新构建镜像。ports: – “8000:8000”: 将宿主机的8000端口映射到容器的8000端口,您可以通过http://localhost:8000访问Laravel应用。depends_on: – postgres-db: 声明laravel-app服务依赖于postgres-db服务,Docker Compose会确保postgres-db先启动。networks: – app-network: 将laravel-app服务连接到名为app-network的自定义网络。postgres-db:image: postgres:13: 使用官方的PostgreSQL 13镜像。environment: 设置PostgreSQL的环境变量,包括数据库名、用户名和密码。这些信息将用于Laravel应用的数据库连接。volumes: – postgres_data:/var/lib/postgresql/data: 使用一个命名卷postgres_data来持久化PostgreSQL的数据。这样即使容器被删除,数据也不会丢失。ports: – “5432:5432”: 将宿主机的5432端口映射到容器的5432端口,允许您从宿主机连接到数据库。networks: – app-network: 将postgres-db服务连接到app-network网络。networks: 定义了一个名为app-network的桥接网络,允许laravel-app和postgres-db服务通过服务名互相通信。volumes: 定义了一个命名卷postgres_data,用于PostgreSQL的数据持久化。

3. 配置Laravel环境变量(.env)

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1342432.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 05:35:47
下一篇 2025年12月13日 05:36:01

相关推荐

  • DDD实践:如何合理设计值对象与处理复杂数据结构

    在领域驱动设计(DDD)中,值对象(Value Object)是核心概念之一,用于封装具有概念整体性但无独立标识的属性。本文旨在提供一份实践指南,探讨如何在复杂的业务场景下,平衡DDD原则与实际开发效率,合理设计值对象的粒度,避免过度工程化。同时,将深入分析如何处理多表关联数据,确保实体(Entit…

    2025年12月13日
    000
  • PHP sprintf 函数中属性值提取与格式化指南

    本文旨在解决在php中使用`sprintf`函数时,将完整的html属性字符串误用于需要单一属性值(如类名)的场景。通过分析常见错误,我们展示了如何直接从数组中提取目标属性的原始值,并结合空合并运算符`??`提升代码健壮性,从而避免输出格式不符或潜在的错误,确保`sprintf`正确生成预期html…

    2025年12月13日
    000
  • 如何正确调用Walmart退货API:PHP cURL实现指南

    本文旨在提供一份详细的教程,指导开发者如何使用php curl正确集成walmart退货api。我们将涵盖api认证流程、access token的获取、退货api的调用方法,并重点强调`wm_qos.correlation_id`必须为guid格式,同时优化代码示例,帮助开发者规避常见错误,确保a…

    2025年12月13日
    000
  • PHP 应用迁移:require_once 错误与文件大小写敏感性解析

    本文探讨了在将 phprunner 应用从旧服务器迁移到新服务器(如 godaddy)时,可能遇到的 `require_once()` 错误。该错误通常表现为文件找不到,即使文件实际存在。核心问题在于不同操作系统或文件系统对文件名大小写的处理差异。文章提供了一种简单有效的解决方案:检查并修正引用文件…

    2025年12月13日
    000
  • Laravel中基于用户认证状态与用户角色安全地控制UI元素显示

    本文详细介绍了在Laravel应用中,如何根据用户的认证状态(访客或已登录)以及已登录用户的特定角色,安全且高效地控制前端UI元素的显示与隐藏。文章将重点解决直接访问`auth()->user()`可能导致的空指针错误,并提供一个健壮的条件判断解决方案,确保无论用户是否登录,应用都能正常运行并…

    2025年12月13日
    000
  • php中二维数组怎么写入到数据库_php二维数组入库技巧【步骤】

    PHP批量写入二维数组到数据库有五种方法:一、拼接多行INSERT语句;二、PDO预处理循环执行;三、事务包裹确保原子性;四、LOAD DATA INFILE高速导入CSV;五、INSERT IGNORE或ON DUPLICATE KEY UPDATE处理冲突。 如果您需要将PHP中的二维数组批量写…

    2025年12月13日
    000
  • php中rpc框架如何使用?

    PHP中RPC需借助第三方库实现,核心是封装远程调用细节;推荐Hyperf RPC或GoaPHP,Laravel项目可用laravel-rpc;需定义统一接口契约、启动服务端并注册方法、客户端通过代理类调用,注意超时、重试与服务发现。 PHP 中 RPC 框架不是 PHP 原生内置的,需要借助第三方…

    2025年12月13日
    000
  • 实现Bootstrap多选框级联过滤:动态更新选项教程

    本教程详细介绍了如何实现Bootstrap多选框(multiselect)的级联过滤功能。我们将通过一个具体案例,演示如何根据第一个多选框的选中项,动态更新第二个多选框的可用选项,并结合后端数据获取机制。内容涵盖前端事件处理、数据收集、后端接口设计及前端UI刷新等关键步骤,旨在帮助开发者构建交互性更…

    2025年12月13日
    000
  • 解决Laravel迁移中外键约束错误1005的教程

    本教程旨在解决laravel数据库迁移中常见的“general error: 1005 can’t create table (errno: 150 ‘foreign key constraint is incorrectly formed’)”错误。核心问题通常…

    2025年12月13日
    000
  • Ajax与FormData:解决数据无法正确传递到PHP $_POST的问题

    本文详细讲解了在使用jquery ajax结合formdata发送数据到php `$_post`时常见的配置错误及其解决方案。核心问题在于formdata对象不应被额外包裹在另一个数据对象中,并且`processdata: false`指令要求直接传递formdata实例。同时,文章也指出并纠正了`…

    2025年12月13日
    000
  • Laravel Observers:精细控制事件触发与用户行为日志实现

    本文深入探讨laravel observers的高级应用,指导开发者如何通过`withoutevents`方法精细控制`retrieved`事件的触发,避免在批量查询时产生不必要的日志或操作。同时,文章将详细演示如何利用observer、控制器或中间件等不同机制,高效地记录用户ip、user-age…

    2025年12月13日
    000
  • WooCommerce注册表单自定义生日字段的添加与正确保存实践

    本教程详细指导如何在woocommerce“我的账户”注册表单中添加自定义生日字段,并确保其数据能够正确保存。文章将重点介绍如何使用三个下拉菜单(日、月、年)构建生日选择器,并通过woocommerce提供的钩子实现表单显示、数据验证及用户元数据保存,特别强调了月份值和日期格式化在数据保存中的关键作…

    2025年12月13日
    000
  • PHP WebSocket高频数据传输乱码:多帧TCP包处理机制解析与修复

    当通过PHP WebSocket快速传输数据时,用户可能会遇到乱码问题,这通常是由于客户端将多个WebSocket帧打包到单个TCP数据包中造成的。本教程将深入分析现有 `unseal` 函数的局限性,解释为何它无法正确处理多帧数据,并提供一个优化方案,通过迭代解析并正确截取每个帧的有效载荷,确保所…

    2025年12月13日
    000
  • Laravel 中 Select 元素布尔值验证的正确实践

    本文深入探讨了在 laravel 应用中,使用 html “ 元素处理布尔类型数据时,`required|boolean` 验证规则可能遇到的常见问题。具体而言,当“否”选项的 `value` 未设置为 laravel 认可的布尔假值时,验证将失败。本教程将详细解析 laravel 布尔…

    2025年12月13日
    000
  • php怎么把变量拆分成数组_PHP将变量值拆分为数组元素

    需根据PHP变量类型和拆分需求选择方法:一、explode()按分隔符拆字符串;二、str_split()按字符长度拆;三、preg_split()用正则灵活拆;四、str_word_count()提取单词;五、非字符串变量需先转换再处理。 如果需要将一个PHP变量的值按特定规则拆分为数组元素,则需…

    2025年12月13日
    000
  • PHP进程与任务管理技巧_PHP处理后台任务的方式

    PHP可通过pcntl(CLI模式)、Supervisor托管和消息队列实现稳定后台任务管理;需避免僵尸进程、资源复用、内存泄漏等陷阱,确保进程可控、资源独立、职责解耦。 PHP进程与任务管理技巧 PHP本身是无状态、短生命周期的脚本语言,但通过合理设计,完全可以胜任后台任务调度与长期运行进程的管理…

    2025年12月13日
    000
  • php怎么创建一个数组_PHP创建数组的多种初始化方法

    PHP创建数组有五种常用方法:一、array()函数兼容所有版本;二、array()创建关联数组;三、方括号语法[](PHP 5.4+)更简洁;四、类型声明语法增强安全性(PHP 7.1+);五、range()生成序列数组。 PHP中创建数组是基础且高频的操作,不同场景下需要采用不同的初始化方式。以…

    2025年12月13日
    000
  • 在WordPress中创建不受主题样式影响的静态页面

    本文旨在指导用户如何在WordPress中创建完全不受当前主题CSS和JavaScript样式影响的静态页面,特别适用于需要高度定制化或遵循特定规范(如AMP)的场景。核心解决方案是利用WordPress的页面模板功能,通过创建不包含主题头部和底部的自定义模板文件,实现页面的独立渲染。 引言:摆脱W…

    2025年12月13日
    000
  • WordPress内容方向调整:实现强制从左到右显示

    本教程详细指导WordPress网站管理员或编辑如何解决特定内容(如阿拉伯语文章标题)在默认右到左(RTL)布局下,强制实现从左到右(LTR)显示的问题。通过直接修改主题的`header.php`文件,在` `标签中添加`dir=”ltr”`属性,可以全局或有条件地调整页面文…

    2025年12月13日
    000
  • php用数组元素实现计算器_php数组数值计算操作方法【解析】

    PHP数组加法运算有五种方法:一、用array_sum对索引数组求和;二、用关联数组+eval实现带符号混合计算;三、用array_reduce自定义二元运算;四、用array_map清洗数据后求和;五、用多维数组实现矩阵加减。 一、使用数组元素进行加法运算 PHP中可将参与计算的数值存入索引数组,…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信