
本教程详细介绍了如何利用 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 示例:
启科网络PHP商城系统 启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
0 查看详情
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中文网其它相关文章!
