Docker Compose 构建 LNMP 环境:一站式 PHP 网站部署指南

Docker Compose 构建 LNMP 环境:一站式 PHP 网站部署指南

    • 简介
    • 环境准备和安装
      • 安装 Docker
      • 安装 Docker Compose
      • 准备项目目录结构
    • 编写 Docker Compose 文件
      • 基础结构
      • 配置 Nginx 服务
      • 配置 PHP 服务
      • 配置 MySQL 服务
      • 完整的 `docker-compose.yml` 示例
    • Nginx 容器配置
      • 创建 Nginx 配置文件
      • 设置虚拟主机和端口映射
      • 配置文件放置
      • 优化和安全设置
      • 测试配置
    • PHP 容器配置
      • 编写 PHP Dockerfile
      • 配置 PHP 容器
      • 连接 Nginx 和 PHP 容器
      • 测试 PHP 配置
    • MySQL 容器配置
      • 基本配置
      • 数据持久化
      • 网络和安全性配置
      • 测试数据库连接
      • 维护和备份
    • 部署网站代码
      • 将 PHP 代码放置在 ./www 目录
      • 确保代码和容器的正确关联
      • 配置文件和目录权限
      • 测试网站功能
      • 调试和问题解决
    • 运行和测试
      • 启动 Docker Compose 服务
      • 测试网站可访问性
      • 性能调优和监控
      • 问题诊断和解决
    • 维护和更新
      • 容器和代码的更新流程
      • 安全性维护
      • 故障排除和问题解决

简介

在现代网站开发中,LNMP(Linux, Nginx, MySQL, PHP)架构因其高效能和稳定性而备受青睐。本教程旨在引导您使用 Docker 和 Docker Compose 在 LNMP 架构上搭建 PHP 网站。Docker 作为一种流行的容器化技术,提供了一种轻量级、一致的环境来部署和运行应用,而 Docker Compose 则进一步简化了多容器 Docker 应用的定义和共享过程。

本教程假设您已具备基本的 Docker 知识和网站开发经验,重点放在实际的操作和配置上。我们将一步步通过编写 docker-compose.yml 文件来定义所需的服务,配置 Nginx 和 PHP 容器,实现它们之间的关联,并确保网站程序文件正确部署在 ./www 目录下。同时,Nginx 的虚拟机配置文件将被放置在 ./nginx/conf.d 目录下。

我们将采用实践导向的方法,通过具体的示例代码来展示每个步骤。通过本教程的学习,您不仅能够掌握使用 Docker 和 Docker Compose 搭建 LNMP 环境的技能,还能获得一些关于容器化应用开发的实用经验。让我们开始这趟学习之旅吧。

环境准备和安装

在开始搭建 LNMP 网站之前,首先需要确保您的开发环境中安装有 Docker 和 Docker Compose。这些工具是构建和管理您的应用的基础。

安装 Docker

Docker 是一个开源容器化平台,它允许您在隔离的容器中运行应用。安装 Docker 的步骤因操作系统的不同而略有差异。

  1. Linux系统: 大多数现代 Linux 发行版都可以直接从官方仓库安装 Docker。例如,在 Ubuntu 上,您可以使用以下命令安装 Docker:
    sudo apt update
    sudo apt install docker.io
    
  2. Windows 和 macOS 系统: 对于 Windows 和 macOS 用户,Docker 提供了 Docker Desktop,可以从 Docker 官网 下载并安装。

安装完成后,您可以运行 docker --version 来检查 Docker 是否正确安装。

安装 Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。安装 Docker Compose 通常需要下载其二进制文件并赋予执行权限。

  1. 下载最新版本的 Docker Compose:
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
  2. 使二进制文件可执行:
    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 验证安装,运行 docker-compose --version

准备项目目录结构

LNMP 应用的文件和配置需要组织在一个结构化的目录中。为此,我们将创建以下目录结构:

  • www/:存放 PHP 网站代码。
  • nginx/:存放 Nginx 相关配置。
    • conf.d/:存放 Nginx 的虚拟主机配置文件。

您可以使用以下命令来创建这些目录:

mkdir -p ./www
mkdir -p ./nginx/conf.d

通过上述步骤,您已经成功设置了运行 LNMP 应用所需的基础环境。接下来,我们将进入 docker-compose.yml 文件的编写,这是搭建和运行您的 LNMP 应用的关键步骤。

编写 Docker Compose 文件

docker-compose.yml 是 Docker Compose 的配置文件,它定义了您的应用服务、网络和卷。在本节中,我们将详细介绍如何编写此文件来设置 LNMP 环境。

基础结构

首先,创建一个名为 docker-compose.yml 的文件在项目的根目录。该文件的基础结构如下:

version: '3.8'
services:
  nginx:
    # Nginx 服务配置
  php:
    # PHP 服务配置
  mysql:
    # MySQL 服务配置

配置 Nginx 服务

docker-compose.yml 文件中,添加 Nginx 服务的配置:

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - php

这里,我们使用了 Nginx 的官方镜像,并映射了端口 80。同时,将 ./www 目录挂载到容器的 /var/www/html,并将 ./nginx/conf.d 目录挂载到 /etc/nginx/conf.d 以使用自定义的 Nginx 配置。

配置 PHP 服务

接下来,在 docker-compose.yml 中添加 PHP 服务配置:

services:
  php:
    image: php:fpm
    volumes:
      - ./www:/var/www/html
    depends_on:
      - mysql

此处,我们使用了 PHP 的官方 fpm 镜像。PHP 服务同样挂载 ./www 目录,以便 Nginx 和 PHP 可以共享网站代码。

配置 MySQL 服务

最后,配置 MySQL 服务:

services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

这里使用了 MySQL 的官方镜像,并设置了环境变量来配置数据库密码和创建一个新的数据库。此外,我们定义了一个名为 mysql_data 的卷用于数据持久化。

完整的 docker-compose.yml 示例

version: '3.8'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - php
  php:
    image: php:fpm
    volumes:
      - ./www:/var/www/html
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

这个 docker-compose.yml 文件定义了一个基本的 LNMP 环境,包括 Nginx、PHP 和 MySQL 服务。接下来,我们将详细介绍 Nginx 容器的配置。

Nginx 容器配置

在 LNMP 架构中,Nginx 扮演着重要的角色,它不仅作为 web 服务器处理 HTTP 请求,还负责将 PHP 请求代理给 PHP-FPM。下面我们将详细介绍如何配置 Nginx 容器。

创建 Nginx 配置文件

首先,您需要在 ./nginx/conf.d 目录下创建一个配置文件。这个配置文件将定义如何处理进入 Nginx 服务器的请求。一个基本的配置文件 default.conf 可能看起来像这样:

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

这个配置文件设定了服务器监听端口 80,定义了网站根目录为 /var/www/html,并设置了处理 PHP 文件的规则。fastcgi_pass 指令告诉 Nginx 将 PHP 请求转发到名为 php 的服务,在这里即我们的 PHP-FPM 容器。

设置虚拟主机和端口映射

docker-compose.yml 文件中,我们已经为 Nginx 容器配置了端口映射(80:80),这意味着主机的 80 端口将映射到容器的 80 端口。通过这种方式,您可以通过主机的 IP 地址或域名来访问 Nginx 服务器。

配置文件放置

如前所述,Nginx 配置文件应放置在 ./nginx/conf.d 目录下。由于这个目录被挂载到容器的 /etc/nginx/conf.d 中,因此容器内的 Nginx 将使用您提供的配置文件。

优化和安全设置

Nginx 的配置可根据需要进行优化和安全性增强。例如,您可以通过设置更有效的缓存策略、启用 gzip 压缩、配置 SSL 证书等方式提升性能和安全性。但这些配置通常取决于具体的应用需求和部署环境。

测试配置

配置完成后,您可以通过运行 docker-compose up 来启动服务,并访问主机的 IP 或域名来测试 Nginx 是否正确配置和运行。如果遇到问题,查看容器的日志通常是一个好的开始。

通过以上步骤,Nginx 容器配置基本完成。接下来的部分将涉及 PHP 容器的配置。

PHP 容器配置

PHP 容器在 LNMP 架构中负责处理 PHP 代码。通过正确配置 PHP 容器,您可以确保 PHP 代码高效运行,并与 Nginx 容器顺利协作。

编写 PHP Dockerfile

虽然您可以直接使用 PHP 的官方镜像,但为了更好地适应项目需求,通常需要定制化 PHP 容器。这可以通过创建一个 Dockerfile 来实现。例如,在 ./php 目录下创建一个 Dockerfile

FROM php:fpm

# 安装 PHP 扩展
RUN docker-php-ext-install mysqli pdo pdo_mysql

# 其他必要的设置或安装步骤

这个 Dockerfile 从官方的 PHP FPM 镜像开始,安装了 MySQL 相关的 PHP 扩展。您可以根据项目需要添加更多的扩展或配置。

配置 PHP 容器

docker-compose.yml 中,您需要对 PHP 容器进行配置。假设您已创建了上述的 Dockerfile,配置看起来可能是这样的:

services:
  php:
    build: ./php
    volumes:
      - ./www:/var/www/html

这里的 build 指令告诉 Docker Compose 在哪里找到 Dockerfile 并构建 PHP 容器。同时,我们挂载了 ./www 目录,以便 PHP 容器可以访问您的 PHP 代码。

连接 Nginx 和 PHP 容器

在 LNMP 架构中,Nginx 通常用作前端服务器,它会将 PHP 请求代理给 PHP-FPM。在 docker-compose.yml 文件中,通过在 Nginx 容器的配置中设置 depends_on,我们已经定义了 Nginx 依赖于 PHP 容器,这确保了容器间的正确启动顺序。

测试 PHP 配置

一旦配置完成,您可以通过运行 docker-compose up 来启动所有服务。为了测试 PHP 容器是否正常工作,您可以创建一个简单的 PHP 脚本,例如 info.php,包含以下内容:


phpinfo();
?>

将此文件放置在 ./www 目录下,然后通过浏览器访问此页面(例如,http://localhost/info.php)。如果一切设置正确,您应该能看到 PHP 的配置信息。

至此,PHP 容器的配置部分已经完成。接下来,我们将深入 MySQL 容器的配置。

MySQL 容器配置

MySQL 是 LNMP 架构中的关键组件,负责数据存储和管理。在 Docker 环境中配置 MySQL 容器需要确保数据的安全性和持久性。

基本配置

docker-compose.yml 文件中,MySQL 服务的配置主要涉及镜像选择、环境变量设置以及卷的配置。下面是一个基本的 MySQL 服务配置示例:

services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: exampledb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - mysql_data:/var/lib/mysql
    restart: always

在这个配置中,我们使用了 MySQL 5.7 版本的官方镜像,并通过环境变量设置了 root 密码、创建了一个数据库以及指定了数据库用户和密码。同时,定义了一个名为 mysql_data 的卷来持久化存储 MySQL 数据。

数据持久化

数据持久化是配置数据库容器时的一个关键考虑因素。在上述配置中,volumes 部分确保了 MySQL 数据库的数据不会随容器的重新创建而丢失。mysql_data 卷映射到了容器内的 /var/lib/mysql 目录,这是 MySQL 存储数据的默认位置。

网络和安全性配置

尽管在简单示例中我们没有显式定义网络,Docker Compose 默认创建了一个网络并使得同一 docker-compose.yml 文件中定义的容器能够互相通信。对于更高级的配置,您可能需要配置网络安全规则或端口映射。

测试数据库连接

为了验证 MySQL 容器是否正常工作,您可以尝试从 PHP 容器连接到 MySQL 容器。例如,您可以在 PHP 脚本中使用之前设置的数据库用户和密码进行连接测试。

维护和备份

对于生产环境,还需要考虑数据库的维护和备份策略。虽然这些内容超出了本教程的范围,但它们对于确保数据安全和可靠性至关重要。

通过以上步骤,您已经完成了 MySQL 容器的基本配置。接下来,我们将进入网站代码的部署阶段。

部署网站代码

部署网站代码是设置 LNMP 环境的最后一步。这一步涉及将您的 PHP 网站代码放置在正确的位置,并确保它可以被 Nginx 和 PHP 容器正确处理。

将 PHP 代码放置在 ./www 目录

您的 PHP 网站代码应该放置在项目结构中的 ./www 目录下。这个目录被配置为挂载到 Nginx 和 PHP 容器的相应位置,以便两个容器都可以访问到这些文件。

例如,您可以将网站的首页 index.php 放置在 ./www 目录中:

// ./www/index.php
<?php
echo "欢迎来到我的 PHP 网站!";
?>

确保代码和容器的正确关联

由于 ./www 目录被挂载到了 Nginx 容器的 /var/www/html 以及 PHP 容器的同一路径下,因此任何放置在 ./www 的文件都将自动出现在两个容器中。这种设置确保了 Nginx 可以将对 PHP 文件的请求传递给 PHP 容器。

配置文件和目录权限

确保您的代码文件和目录具有适当的权限,以便 Docker 容器中的服务能够正确地读取和执行这些文件。通常,文件权限应设置为 644,而目录权限则设置为 755。

测试网站功能

完成代码部署后,您应该测试网站的功能性。启动所有服务(使用 docker-compose up 命令),然后在浏览器中访问您的网站(通常是 http://localhost)。如果一切配置正确,您应该能看到您的 PHP 网页。

调试和问题解决

如果网站没有按预期工作,检查以下几点:

  • 确保 docker-compose.yml 文件中的所有服务都正确配置。
  • 检查 Nginx 和 PHP 容器的日志以查找可能的错误信息。
  • 确认您的 PHP 代码对于容器环境是兼容的。

至此,您已经成功完成了基于 Docker Compose 的 LNMP 环境搭建和 PHP 网站代码的部署。下一步是运行和测试整个应用。

运行和测试

成功部署网站代码后,下一步是运行整个 LNMP 环境,并对网站进行测试,以确保一切按预期工作。

启动 Docker Compose 服务

  1. 启动服务: 在项目根目录下,运行以下命令来启动所有定义在 docker-compose.yml 文件中的服务:

    docker-compose up -d
    

    这将以守护进程模式启动所有服务,使其在后台运行。

  2. 检查服务状态: 为了确认所有容器都正确运行,您可以使用:

    docker-compose ps
    

    这个命令将列出所有正在运行的容器及其状态。

测试网站可访问性

  1. 访问网站: 在浏览器中输入 http://localhost 或您配置的域名。如果配置正确,您应该能够看到您的 PHP 网站的首页。

  2. 测试页面功能: 确保测试网站的所有功能,包括数据库连接、表单提交等,以确保所有部分均正常工作。

性能调优和监控

  1. 性能调优: 根据网站的响应和资源使用情况,您可能需要调整 Nginx 和 PHP 的配置,例如增加 worker 进程数量或调整内存限制。

  2. 日志监控: 检查 Nginx 和 PHP 容器的日志可以帮助您识别任何潜在问题。日志通常可以通过以下命令查看:

    docker-compose logs [service_name]
    

问题诊断和解决

如果在测试过程中遇到问题,以下是一些常见的诊断步骤:

  • 检查容器日志: 日志通常会包含错误信息和警告。
  • 进入容器进行调试: 使用 docker exec 命令进入特定的容器进行更深入的调试。
  • 网络连接测试: 确保容器之间的网络连接正常,特别是 Nginx 与 PHP 容器之间。

完成这些步骤后,您的 LNMP 环境和 PHP 网站应该能够正常运行和服务于访问者。

至此,整个 LNMP 环境的搭建、网站代码部署、运行和测试部分已经完成。下一步将是关于容器和代码的维护更新,以及安全性维护和备份策略的讨论。

维护和更新

维护和更新是确保网站长期稳定运行的重要环节。这包括对 Docker 容器的更新、代码的维护,以及确保整体系统的安全性。

容器和代码的更新流程

  1. 更新 Docker 镜像: 定期检查并更新您的 Nginx、PHP 和 MySQL 镜像到最新版本。使用以下命令拉取最新镜像:

    docker-compose pull
    
  2. 重建并重启服务: 在更新了 Docker 镜像或进行了代码更改后,需要重建并重启服务:

    docker-compose up -d --build
    
  3. 代码版本控制: 为您的代码使用版本控制系统,如 Git,以跟踪更改和快速回滚。

安全性维护

  1. 定期更新: 定期更新所有服务的镜像,以包含最新的安全修复和更新。

  2. 备份策略: 设定定期备份数据库和重要数据的策略。可以使用如下命令备份 MySQL 数据库:

    docker exec [mysql_container_name] mysqldump -u [username] -p[password] [database_name] > backup.sql
    
  3. 监控系统安全: 实施监控系统以便及时发现异常行为或安全威胁。

故障排除和问题解决

  1. 日志审查: 定期审查容器日志以识别潜在问题。

  2. 资源监控: 使用工具监控服务器资源使用情况,如 CPU 和内存使用率,以便及时调整配置。

  3. 社区和支持: 利用社区支持和官方文档来帮助解决遇到的问题。

通过上述步骤,您可以保持您的 LNMP 环境和 PHP 网站的长期健康和安全性。定期维护和适时更新是确保网站稳定性和安全性的关键。

至此,我们已经完成了关于使用 Docker Compose 搭建基于 LNMP 架构的 PHP 网站的全面指南。从环境准备到部署、运行、测试以及维护更新,我们已经涵盖了整个流程的每一个关键步骤。

你可能感兴趣的:(docker实战,docker,php,容器)