使用 Docker 容器化 Laravel 和 PostgreSQL 应用

使用 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 数据库服务。

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

Dockerfiledocker-compose.yml

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

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

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

# 使用官方 PHP-FPM 镜像作为基础,版本为 7.4FROM 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图形库, ZipRUN docker-php-ext-install -j$(nproc) pdo_pgsql mbstring exif pcntl bcmath gd zip# 安装 ComposerRUN 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 示例:

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=pgsqlDB_HOST=postgres_db # 使用 Docker Compose 服务名称DB_PORT=5432DB_DATABASE=my_laravel_dbDB_USERNAME=laravel_userDB_PASSWORD=secret_password

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

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

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

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

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 参数表示在后台运行。

检查服务状态:

sudo docker-compose ps

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

查看日志:

sudo docker-compose logs -

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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 02:35:03
下一篇 2025年12月13日 02:35:10

相关推荐

  • 如何为WordPress子目录重置Content-Security-Policy

    当网站根目录通过`.htaccess`设置Content-Security-Policy (CSP)时,该策略会默认继承到所有子目录,可能导致WordPress在子目录安装时后台功能异常。本教程将指导您如何在WordPress的`/wp-admin/`目录下通过特定的`.htaccess`配置,取消…

    2025年12月13日
    000
  • php运行环境搭建好了怎么上传源码_传php源码到环境步骤

    首先确认Web服务器根目录路径,如Apache的/var/www/html或Nginx配置中的root路径,并确保有写入权限;接着可通过SCP命令上传源码至服务器,例如使用scp -r /path/to/local/php-source username@server-ip:/path/to/web…

    2025年12月13日
    000
  • 在服务器环境中集成pdflatex:PHP与TeX Live的实践指南

    本文旨在提供在服务器环境(特别是通过php `exec`函数)中运行`pdflatex`命令的详细教程。我们将深入探讨常见的执行问题,如环境路径配置、交互模式设置、依赖管理以及文件组织策略,并提供实用的调试方法和最佳实践,确保`pdflatex`能够稳定、高效地自动化生成pdf文档。 在自动化文档生…

    2025年12月13日
    000
  • 修复 Laravel Livewire 中动态选项卡内容不显示的问题

    本文旨在解决 laravel livewire 应用中动态选项卡内容无法正确切换的常见问题。核心问题在于 html 元素的 id 属性错误地包含了哈希符号(#),导致客户端 javascript 无法正确关联选项卡和其对应的内容面板。教程将详细解释此错误原因,并提供正确的 html 结构和代码示例,…

    2025年12月13日
    000
  • Laravel Socialite单设备登录与会话管理策略

    本文详细介绍了如何在Laravel Socialite认证场景下,通过引入设备标识符、会话管理以及自定义中间件,实现强制单设备登录的策略。用户登录时,系统会记录当前设备信息,并在后续请求中验证会话的有效性,确保同一时间只有一个设备处于登录状态,从而提升账户安全性与会话控制能力。 在现代Web应用中,…

    2025年12月13日
    000
  • Laravel数组输入验证:在Blade视图中精准显示错误信息

    本文旨在解决Laravel中处理数组形式输入(如多语言字段)时,如何通过Form Request进行有效验证,并在Blade视图中精准地为每个数组元素显示其专属的验证错误信息及应用`is-invalid`样式。我们将深入探讨Blade `@error`指令与动态错误键的正确使用方式,并提供完整的代码…

    2025年12月13日
    000
  • Laravel 应用中基于 User-Agent 实现移动端访问控制教程

    本教程旨在解决在 laravel 应用中通过 javascript 阻止移动端访问时,用户切换到“桌面站点”模式后失效的问题。我们将详细介绍如何利用服务器端的 http user-agent 头部信息进行更可靠的设备类型检测,并通过 laravel 中间件实现对移动设备的访问限制,确保无论用户如何设…

    2025年12月13日
    000
  • Laravel 中父子表联合查询与过滤:实现多条件搜索教程

    本教程详细介绍了如何在 laravel 应用中,针对具有父子关系的数据库表(如 `posts` 和 `posts_tags`),同时进行多条件查询和过滤。我们将探讨如何利用 eloquent orm 的 `join` 方法实现跨表数据筛选,以及作为替代方案的 `wherehas` 方法,帮助开发者高…

    2025年12月13日
    000
  • 在Laravel应用中优雅地处理Inertia与JSON双重响应

    本教程探讨如何在laravel jetstream项目中,利用inertia.js为web前端提供响应的同时,通过同一控制器方法为移动应用提供json api响应。核心方法是利用request()->wantsjson()判断请求类型,从而实现web视图与api数据的统一管理,避免代码冗余,提…

    2025年12月13日
    000
  • Twilio呼叫拒接与语音邮件转发及邮件通知实现教程

    本教程详细指导如何构建一个完整的twilio呼叫处理系统。内容涵盖来电配置、呼叫筛选、将拒接电话转接至语音邮件,并最终实现将录制的语音邮件自动发送至指定邮箱。通过学习,您将掌握如何利用twilio的twiml和php webhook,创建高效且无缝的通信流程,确保重要信息不被遗漏,提升业务沟通效率。…

    2025年12月13日
    000
  • Magento 2 教程:在 Observer 中安全更新产品属性,避免无限循环

    本教程深入探讨了在 Magento 2 中使用事件观察者(Observer)更新产品属性时常见的无限循环问题,特别是当使用 catalog_product_save_after 事件时。文章详细解释了问题根源,并提供了基于 catalog_product_save_before 事件的解决方案,指导…

    2025年12月13日
    000
  • WordPress 自定义分类法归档页面的正确实现与调试

    本文旨在解决WordPress自定义分类法归档页面不显示内容的问题。核心在于指导开发者如何利用WordPress内置的模板层级结构,特别是taxonomy.php或taxonomy-{slug}.php模板,来正确地渲染自定义分类法下的文章列表,而非通过手动创建页面并进行复杂的自定义查询。文章将详细…

    2025年12月13日
    000
  • PHP中SSG-WSG API的AES加密:正确使用初始化向量(IV)

    本教程详细阐述了在php中为ssg-wsg api实现aes加密时,如何正确处理初始化向量(iv)。许多开发者在集成此类api时,常误用 `openssl_random_pseudo_bytes` 生成随机iv,导致加密失败。本文将指导您如何将api提供的固定iv正确传递给 `openssl_enc…

    2025年12月13日
    000
  • Laravel Migration:解决列重命名后立即添加新列的顺序问题

    在使用 laravel migration 进行数据库操作时,如果在同一个 `schema::table` 闭包内尝试先重命名一个列,然后立即引用这个新名称来添加另一个列(例如使用 `after()` 方法),可能会遇到“未知列”的错误。本文将深入探讨此问题的原因,并提供一个简洁有效的解决方案:将重…

    2025年12月13日
    000
  • PHP应用中基于用户类型实现页面访问控制教程

    本教程详细讲解如何在php web应用中实现基于用户类型的页面访问控制。我们将探讨php会话(session)机制的正确使用,特别是`session_start()`函数的重要性,以及如何构建健壮的条件逻辑来验证用户身份和权限,确保只有特定用户类型(如管理员或经理)才能访问受限页面,从而有效防止未经…

    2025年12月13日
    000
  • 使用Go语言从PHP网页获取结构化数据:一份教程

    本教程详细指导如何利用go语言从php网页高效地获取结构化数据。我们将首先优化php后端,使其输出易于机器解析的纯文本或特定格式数据,而非传统的html。接着,教程将展示go语言如何通过http get请求抓取这些数据,并进行有效的解析和处理,确保数据传输的准确性和程序的可维护性。 1. 背景与挑战…

    2025年12月13日
    000
  • PHP反射机制:获取函数或方法参数类型列表的实用指南

    本文将深入探讨php反射(reflection)机制,重点介绍如何利用reflectionmethod类动态获取函数或方法的参数类型列表。通过具体的代码示例,我们将演示如何识别参数的类名、内置类型或是否无类型声明,这对于构建依赖注入、api文档生成或运行时类型检查等高级功能至关重要。 PHP的反射(…

    2025年12月13日
    000
  • 在Symfony中对加密字段应用UniqueEntity约束的策略

    在symfony框架中,直接对加密字段使用`@uniqueentity`约束通常会失效,因为验证发生在数据加密之前,导致无法正确比对数据库中已加密的值。本文将深入探讨这一挑战,并提供两种有效的解决方案:一是通过存储字段的哈希值并对其进行唯一性检查,二是通过自定义repository方法,在验证过程中…

    2025年12月13日
    000
  • 解决 Ubuntu 20 WSL 环境下 PHP 脚本终端无输出问题指南

    本文旨在解决在 ubuntu 20 wsl 环境下运行 php 脚本时终端无输出的常见问题。文章将详细指导用户验证 php cli 安装、正确使用脚本执行命令,并介绍通过添加 shebang 行来直接执行 php 脚本的方法。通过这些步骤,用户可以有效地调试并确保 php 脚本在终端中正常显示输出。…

    2025年12月13日
    000
  • Laravel中定义用户与事件的多层级关联:三种实现方式

    本文详细介绍了在Laravel框架中如何定义和管理一个复杂的多层级关联关系,即用户通过所属的多个组织来关联到事件。文章通过定义`belongsToMany`、`hasMany`和`belongsTo`等Eloquent关系,并提供了三种不同的数据检索方法:迭代式获取、用户模型内封装为集合以及用户模型…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信