使用 Docker Compose 管理多服务项目部署(含 Nginx+PHP+MySQL)

优化 docker compose 性能需选择轻量镜像(如 alpine)、合并 dockerfile 指令、设置资源限制、利用构建缓存并优化网络;2. 处理数据库迁移可通过 depends_on 结合 entrypoint 脚本等待数据库就绪后执行迁移命令,或使用 flyway/liquibase 等专用工具;3. 监控应用可使用 docker stats 和 logs 实时查看资源与日志,或部署 prometheus 和 grafana 收集指标并可视化,也可结合 cadvisor 或 elk stack 实现全面监控,最终实现高效、稳定、可观测的容器化应用部署。

使用 Docker Compose 管理多服务项目部署(含 Nginx+PHP+MySQL)

使用 Docker Compose 可以极大简化多服务项目的部署流程,它允许你用一个 YAML 文件定义整个应用栈,包括服务、网络和卷。这比手动配置每个容器要高效得多,也更易于维护。

解决方案

以下是一个使用 Docker Compose 管理 Nginx+PHP+MySQL 项目部署的示例。我们将创建一个

docker-compose.yml

文件,定义这三个服务,以及它们之间的依赖关系和网络配置。

立即学习“PHP免费学习笔记(深入)”;

version: "3.8"services:  nginx:    image: nginx:latest    ports:      - "80:80"    volumes:      - ./nginx/conf.d:/etc/nginx/conf.d      - ./php:/var/www/html    depends_on:      - php    networks:      - app-network  php:    build:      context: ./php      dockerfile: Dockerfile    volumes:      - ./php:/var/www/html    depends_on:      - mysql    networks:      - app-network  mysql:    image: mysql:8.0    environment:      MYSQL_ROOT_PASSWORD: your_root_password      MYSQL_DATABASE: your_database      MYSQL_USER: your_user      MYSQL_PASSWORD: your_password    volumes:      - mysql_data:/var/lib/mysql    networks:      - app-networkvolumes:  mysql_data:networks:  app-network:    driver: bridge

这个

docker-compose.yml

文件定义了三个服务:

nginx: 使用官方 Nginx 镜像,将宿主机的 80 端口映射到容器的 80 端口。它挂载了两个卷:一个用于 Nginx 的配置文件,另一个用于 PHP 代码。

depends_on

指令确保 PHP 服务在 Nginx 启动之前运行。php: 使用自定义的 Dockerfile 构建 PHP 镜像 (位于

./php

目录)。它挂载了 PHP 代码的卷,并依赖于 MySQL 服务。mysql: 使用官方 MySQL 8.0 镜像,设置了环境变量来配置数据库。它挂载了一个卷来持久化 MySQL 数据。

步骤:

创建目录结构:

mkdir nginx phptouch nginx/conf.d/default.conf php/Dockerfile php/index.php

Nginx 配置 (nginx/conf.d/default.conf):

server {    listen 80;    index index.php index.html;    root /var/www/html;    location ~ .php$ {        try_files $uri =404;        fastcgi_split_path_info ^(.+.php)(/.+)$;        fastcgi_pass php:9000;        fastcgi_index index.php;        include fastcgi_params;        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        fastcgi_param PATH_INFO $fastcgi_path_info;    }    location ~ /.ht {        deny all;    }}

PHP Dockerfile (php/Dockerfile):

FROM php:8.1-fpmRUN apt-get update && apt-get install -y     libpng-dev     libjpeg-turbo8-dev     libzip-dev     && docker-php-ext-configure gd --with-jpeg=/usr/include/     && docker-php-ext-install -j$(nproc) gd zip pdo pdo_mysqlRUN pecl install xdebug     && docker-php-ext-enable xdebugWORKDIR /var/www/html

PHP 示例代码 (php/index.php):


运行 Docker Compose:

docker-compose up -d

部署完成后,访问

localhost

即可看到 PHP 的

phpinfo()

页面。

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

如何优化 Docker Compose 文件以提高性能?

优化 Docker Compose 文件以提高性能,可以从几个方面入手:

选择合适的镜像: 使用体积更小、性能更好的镜像。例如,对于 Nginx,可以考虑使用 Alpine Linux 版本的 Nginx 镜像。构建优化: 在 Dockerfile 中,合并多个 RUN 指令,减少镜像层数。使用

.dockerignore

文件排除不必要的文件,减小镜像体积。资源限制: 为每个服务设置资源限制(CPU、内存),防止某个服务占用过多资源,影响其他服务。缓存利用: Docker Compose 会缓存构建好的镜像层,下次构建时可以复用。避免不必要的重新构建。网络优化: 使用 Docker 的 overlay 网络,可以提高容器之间的通信效率。

一个例子,优化 PHP Dockerfile:

FROM php:8.1-fpm-alpineRUN apk update && apk add --no-cache     libpng-dev     libjpeg-turbo-dev     libzip-dev     freetype-dev     && docker-php-ext-configure gd --with-freetype --with-jpeg     && docker-php-ext-install -j$(nproc) gd zip pdo pdo_mysqlRUN pecl install xdebug     && docker-php-ext-enable xdebugWORKDIR /var/www/html

这里使用了

php:8.1-fpm-alpine

作为基础镜像,它比标准的 Debian 版本更小。同时,使用

apk

代替

apt-get

安装软件包,

apk

是 Alpine Linux 的包管理器,速度更快。

--no-cache

参数防止缓存包数据,进一步减小镜像体积。

如何处理 Docker Compose 部署中的数据库迁移?

数据库迁移是部署过程中一个重要的环节。通常,我们需要在应用启动之前或之后执行数据库迁移脚本。Docker Compose 提供了一些方法来处理这个问题:

使用

depends_on

和脚本: 在 Docker Compose 文件中,使用

depends_on

确保数据库服务先启动。然后,创建一个脚本来执行数据库迁移,并将该脚本添加到 PHP 容器的启动命令中。使用

entrypoint

脚本: 可以创建一个

entrypoint

脚本,在容器启动时执行。该脚本可以先检查数据库是否需要迁移,如果需要,则执行迁移脚本。使用专门的迁移工具: 例如,Flyway 或 Liquibase。这些工具可以自动管理数据库迁移,并提供版本控制和回滚功能。使用 init 容器: 创建一个 init 容器,专门负责执行数据库迁移。该容器会在应用容器启动之前运行,确保数据库已经准备好。

一个使用

entrypoint

脚本的例子(假设我们使用 Laravel):

创建

entrypoint.sh

文件:

#!/bin/bash# 等待 MySQL 服务启动until mysqladmin ping -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"; do  echo "Waiting for MySQL to start..."  sleep 5doneecho "MySQL is up and running!"# 执行数据库迁移php artisan migrate --force# 启动 PHP-FPMexec "$@"

修改 PHP Dockerfile:

FROM php:8.1-fpm-alpine# ... (安装依赖)COPY entrypoint.sh /usr/local/bin/entrypoint.shRUN chmod +x /usr/local/bin/entrypoint.shENTRYPOINT ["/usr/local/bin/entrypoint.sh"]CMD ["php-fpm"]

docker-compose.yml

中设置环境变量:

php:  # ...  environment:    MYSQL_HOST: mysql    MYSQL_USER: your_user    MYSQL_PASSWORD: your_password

这个

entrypoint.sh

脚本会先等待 MySQL 服务启动,然后执行 Laravel 的数据库迁移命令。

如何监控 Docker Compose 管理的应用?

监控 Docker Compose 管理的应用,可以帮助我们及时发现问题,并优化应用性能。以下是一些常用的监控方法:

Docker Stats: 使用

docker stats

命令可以查看容器的 CPU、内存、网络和 I/O 使用情况。Docker Logs: 使用

docker logs

命令可以查看容器的日志输出。Prometheus 和 Grafana: Prometheus 是一个流行的监控系统,可以收集容器的指标数据。Grafana 是一个数据可视化工具,可以用来展示 Prometheus 收集的数据。cAdvisor: cAdvisor 是一个 Google 开源的容器监控工具,可以自动发现容器并收集指标数据。ELK Stack: ELK Stack (Elasticsearch, Logstash, Kibana) 是一个强大的日志管理和分析平台,可以用来收集、存储和分析容器的日志。

使用 Prometheus 和 Grafana 监控 Docker Compose 应用的步骤:

安装 Prometheus 和 Grafana: 可以使用 Docker Compose 来安装 Prometheus 和 Grafana。配置 Prometheus: 配置 Prometheus 收集 Docker 容器的指标数据。可以使用

docker-compose.yml

文件中的

labels

字段来标记需要监控的容器。配置 Grafana: 配置 Grafana 连接到 Prometheus 数据源,并创建仪表盘来展示容器的指标数据。

一个简单的

docker-compose.yml

文件,用于部署 Prometheus 和 Grafana:

version: "3.8"services:  prometheus:    image: prom/prometheus:latest    ports:      - "9090:9090"    volumes:      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  grafana:    image: grafana/grafana:latest    ports:      - "3000:3000"    depends_on:      - prometheus

然后,创建一个

prometheus.yml

文件,配置 Prometheus 收集 Docker 容器的指标数据。

global:  scrape_interval:     15sscrape_configs:  - job_name: 'docker'    static_configs:      - targets: ['host.docker.internal:9100'] # 需要安装 node_exporter

最后,访问

localhost:3000

即可访问 Grafana,并配置 Prometheus 数据源。

以上就是使用 Docker Compose 管理多服务项目部署(含 Nginx+PHP+MySQL)的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 22:10:34
下一篇 2025年11月7日 22:11:25

相关推荐

  • PHP 8如何进行数据验证

    PHP 8 数据验证超越了 filter_var(),提供多种验证技术:类型声明:在函数参数中指定类型,确保类型匹配。属性验证:利用反射机制在运行时对带有属性的属性进行验证。第三方库:如 Symfony Validator Component,可扩展验证功能。性能优化:避免重复验证,利用 PHP 内…

    2025年12月11日
    000
  • 如何在 Laravel 中获取最后的 ays 记录

    本教程演示如何在 Laravel 应用中轻松获取过去七天的数据记录。 适用于 Laravel 6 至 Laravel 11 所有版本。 我们将使用 Carbon 库和 Eloquent ORM 实现这一功能。 以下是一个简单的控制器方法示例: 控制器代码: subDays(7); $users = …

    2025年12月11日
    000
  • 用 PHP 填充一百万个图像网格以获取互联网历史

    10mpage.com:构建一个容纳千万图像的互联网档案馆 我正在开发10mpage.com,旨在捕捉2025年互联网的缩影。任何互联网用户都可以上传64×64像素的小图像,为这个数字档案馆贡献一份力量。 图像添加流程如下:上传的图像首先进入待处理队列。考虑到互联网提交的不可预测性,每个待…

    2025年12月11日
    000
  • 如何在 Laravel 示例中使用 Factory Tinker 生成假数据

    本文将演示如何在 Laravel 11 应用中利用工厂 Tinker 生成测试数据。测试对于任何 Web 开发项目都至关重要。 有时我们需要向数据库表(例如用户表)添加大量记录,例如数百条甚至数千条,用于测试分页等功能。手动添加如此多的记录显然效率低下。 Laravel 提供了便捷的解决方案:使用 …

    2025年12月11日
    000
  • 使用 Laravel Dusk 下载 Paddle 付款 PDF

    当您拥有不同产品的多个 paddle 帐户时,每月的会计任务最终会消耗比您想要的更多的时间。对于每次付款,我都会登录我的所有帐户,下载在美国和世界其他地区之间分配的付款 pdf,并将其导入我的会计软件中。几次之后,我决定使用 laravel dusk 实现自动化,我想我应该在这里分享解决方案。 这篇…

    好文分享 2025年12月11日
    000
  • PHP 8如何配置服务器环境来提高安全性

    为了让 PHP 8 服务器坚固可靠,需要综合考虑以下策略:使用最新稳定版 Linux 发行版,定期更新补丁,启用防火墙,定期备份数据。使用 Apache 或 Nginx 并配置 HTTPS,使用强加密算法,配置 HTTP 安全头。禁用危险 PHP 函数,利用 PHP 安全机制,开启错误报告,使用 o…

    2025年12月11日
    000
  • PHP 8如何监控应用程序的安全状况

    监控 PHP 8 应用程序的安全状况:安全基础:遵守安全编码规范选择安全的运行环境监控策略:日志监控: 日志分析工具(如 ELK Stack)入侵检测系统(IDS): Suricata、Snort安全扫描工具: RIPS、Brakeman高级技巧:异常行为检测: 结合机器学习技术代码审计: 定期检查…

    2025年12月11日
    000
  • 在 Laravel 中强制使用强密码

    提升 Laravel 应用安全性,从强制使用强密码开始。Laravel 内置的密码验证规则简化了这一过程,让您轻松实施强大的密码策略。本文将详细介绍如何有效利用这一功能。 利用密码验证规则 Laravel 的密码规则提供了多种方式来增强密码复杂性。以下是一个简单的示例: 表单请求示例 use Ill…

    2025年12月11日
    000
  • 测试 Laravel 存储中的临时 URL

    如何测试 Laravel 的 Storage::temporaryUrl() 方法 Laravel 提供了强大的文件存储和操作功能。temporaryUrl() 方法可以为存储在 Amazon S3 或 DigitalOcean Spaces 等云存储服务上的文件生成临时 URL。然而,Larave…

    2025年12月11日
    000
  • 如何在 Laravel 11 中安装和使用 Trix 编辑器

    本教程演示如何在 Laravel 11 应用中安装并使用 Trix 编辑器,并实现图片上传功能。Trix 编辑器是一款轻量级富文本编辑器,由 Basecamp 开发,以其简洁易用的特性而闻名。它提供基本的文本格式化工具,如粗体、斜体、链接和列表,并能无缝集成到 Web 应用中。 我们将创建一个包含图…

    2025年12月11日
    000
  • 从产品经理到独立开发人员:六个月转型指南

    从零基础到独立开发者:我的四个月转型之路 想在短短几个月内从零经验转型为能获得付费工作的独立开发者?这确实充满挑战。我曾是一名新手,甚至可以说是“菜鸟”,但我的经历证明,一切皆有可能。本文分享我的故事,希望能激励那些面临同样困境的人。 独立开发需要全面的技能。我之前的产品经理背景让我对开发流程和技术…

    2025年12月11日 好文分享
    000
  • PHP7各个版本的兼容性如何

    理论上,PHP7版本向下兼容,但实际升级可能存在细微改动导致行为差异。理解兼容性需了解PHP版本命名规则、变更日志,以及Zend引擎演进。向下兼容性仅指新版本运行旧代码,但行为可能不一致。弃用函数、扩展库不兼容是常见兼容性问题。进行全面兼容性测试至关重要,以避免上线问题。升级PHP版本可带来性能提升…

    2025年12月11日
    000
  • PHP 8如何防止代码注入攻击

    PHP 8 防止代码注入攻击的核心方法是:不相信用户输入,将其视为潜在的恶意输入。使用参数化查询和预编译语句,将用户输入作为数据传递,避免被解释为代码执行。进行输入验证和过滤,检查数据类型、长度和格式,确保符合预期。通过代码审查、调试和性能优化,确保代码正确性、效率和可维护性。 PHP 8 如何有效…

    2025年12月11日
    000
  • PHP 8如何安全使用第三方库

    安全使用PHP 8中的第三方库需要贯穿整个开发流程,包括:选择可靠的库源、定期更新依赖、进行代码审查、使用安全扫描工具、关注安全公告。此外,安全编码实践至关重要,如输入验证、良好错误处理和最小权限原则。通过遵循这些步骤,开发者可以确保在使用第三方库时保持代码安全。 PHP 8与第三方库的安全舞步 很…

    2025年12月11日
    000
  • PHP 8如何进行错误和异常处理

    PHP 8 引入了更强大的错误和异常处理机制,包括:增强异常处理,使用 try…catch 语句块捕获和处理异常。自定义异常类,创建更具表达力的错误处理系统。性能考量和最佳实践,在需要特殊处理的情况下使用异常,避免过度使用。 PHP 8 的优雅错误与异常处理:不止是try…catch…

    2025年12月11日
    000
  • 如何优化大型 JSON 文件以与 ChatGPT API 一起使用?

    我正在尝试使用 chatgpt 作为我的 magento 2 网站的聊天机器人,并且我想将产品数据传递给它。为此,我收集了所有产品并将它们存储在一个 json 文件中,然后读取该文件以将数据嵌入到系统角色的 systemrolecontent 中。然而,我面临的问题是 json 文件相当大。 { “…

    好文分享 2025年12月11日
    000
  • 如何确保PHP 8应用安全

    PHP 8 本身与之前版本一样安全,但新特性带来新挑战:输入验证、数据库安全、文件上传安全和会话管理仍很重要。PHP 8 的新特性包括命名参数、属性和联合类型,需要注意验证严谨、访问控制和类型检查。示例函数演示了如何安全处理用户输入。安全与性能并不矛盾,代码审查、成熟框架和定期更新有助于提升安全性。…

    2025年12月11日
    000
  • PHP 8如何防止XSS攻击

    PHP 8 XSS防御要求采取多层次策略,包括:1. 输入验证(包括数据类型检查、长度限制、正则表达式过滤);2. 输出编码(根据输出上下文选择合适的函数,如 htmlspecialchars、js_encode 等);3. 安全头设置(如 CSP、X-XSS-Protection、X-Frame-…

    2025年12月11日
    000
  • 您应该在 5 年内使用的 PHP 功能

    PHP在2025年及以后仍将是Web开发的核心技术。PHP 8.x版本带来了革命性的改进,使其更强大、更高效、更易于使用。本教程将介绍PHP 8.x中一些值得关注的功能,帮助您构建可靠、面向未来的应用程序。 JIT (即时) 编译:性能飞跃 JIT编译器是PHP 8.x最显著的改进之一。它通过在运行…

    2025年12月11日
    000
  • 如何在 Laravel 模型中测试相等的 JSON 列

    Laravel 中 JSON 列的等值测试并非易事,因为数据库将 JSON 数据存储为字符串。 细微的 JSON 编码差异(例如键的顺序或空格)可能导致测试意外失败。本文将指导您如何在 Laravel 测试中有效地比较 JSON 列。 挑战:JSON 编码差异 数据库中存储的 JSON 数据是字符串…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信