1. 首页 > 技术教程 > 正文

全能架构:Docker 一体化部署 Nginx+PHP+MySQL 环境

全能架构:Docker 一体化部署 Nginx+PHP+MySQL 环境

别折腾手动编译了,用 Docker 部署 LNMP 环境,十分钟搞定开发或生产环境。主机选这篇 Linux 教程直接给命令和坑点,照着跑就行。

全能架构:Docker 一体化部署 Nginx+PHP+MySQL 环境的图片

为什么选择 Docker 一体化部署 Nginx+PHP+MySQL

手动装 LNMP 环境,最烦的是版本冲突、依赖缺失、配置文件改半天。Docker 把 Nginx、PHP、MySQL 各自打包成容器,启动时一键关联,换台服务器也能秒级复现。老手都知道,容器化部署最大的好处是环境隔离,开发环境和线上环境完全一致,再也不用“在我电脑上能跑”。

Docker 环境准备与镜像选择

安装 Docker 和 Docker Compose

别问为什么用 Docker Compose,多容器编排就靠它。先装 Docker:

安装 Docker(Debian/Ubuntu 系)

curl -fsSL https://get.docker.com | bash
sudo systemctl enable docker && sudo systemctl start docker

再装 Docker Compose:

下载最新版 Docker Compose

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose –version # 验证安装

镜像版本怎么选

Nginx:选 `nginx:1.25-alpine`,alpine 版体积小,生产够用。

PHP:选 `php:8.2-fpm-alpine`,PHP 8.2 性能提升明显。

MySQL:选 `mysql:8.0`,别选 5.7 了,官方已经 EOL。

编写 docker-compose.yml 实现一体化部署

核心配置文件

项目根目录下创建 `docker-compose.yml`,内容如下:

yaml
version: '3.8'
services:
nginx:
image: nginx:1.25-alpine
container_name: lnmp-nginx
ports:
– "80:80"
– "443:443"
volumes:
– ./www:/usr/share/nginx/html # 网站根目录
– ./nginx/conf.d:/etc/nginx/conf.d # 自定义配置
– ./nginx/logs:/var/log/nginx # 日志持久化
depends_on:
– php
networks:
– lnmp-net

php:
image: php:8.2-fpm-alpine
container_name: lnmp-php
volumes:
– ./www:/usr/share/nginx/html
environment:
– PHP_MEMORY_LIMIT=256M
networks:
– lnmp-net

mysql:
image: mysql:8.0
container_name: lnmp-mysql
ports:
– "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root123 # 生产环境务必改密码
MYSQL_DATABASE: myapp
volumes:
– ./mysql/data:/var/lib/mysql # 数据库文件持久化
networks:
– lnmp-net

networks:
lnmp-net:
driver: bridge

老鸟叮嘱:`MYSQL_ROOT_PASSWORD` 别用弱密码,至少 16 位混合字符。万一容器被扫到,数据库就裸奔了。

创建 Nginx 虚拟主机配置

在 `nginx/conf.d` 目录下创建 `default.conf`:

nginx
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.php index.html;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
fastcgi_pass php:9000; # 注意:这里用容器名 php
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

关键点:`fastcgi_pass php:9000` 中的 `php` 是 Docker Compose 里定义的 service 名称,Docker 内部 DNS 会自动解析。

启动容器与验证环境

一键启动所有服务

在 docker-compose.yml 所在目录执行

docker-compose up -d

-d 表示后台运行

如果报错 `port is already allocated`,说明 80 或 3306 端口被占用。先停掉系统自带的 Nginx 或 MySQL:

sudo systemctl stop nginx mysql

测试 PHP 解析是否正常

在 `www` 目录下创建 `info.php`:

echo "<?php phpinfo();" > www/info.php

浏览器访问 `http://服务器IP/info.php`,能看到 PHP 信息页说明环境跑通了。如果显示空白或下载文件,检查 Nginx 配置文件里 `fastcgi_pass` 是否指向了正确的 PHP 容器。

排障区:万一访问 `info.php` 报 502 Bad Gateway,大概率是 PHP 容器没启动。执行 `docker-compose ps` 看状态,如果 PHP 容器显示 `Exit`,用 `docker-compose logs php` 看日志,常见原因是 PHP 扩展缺失或配置文件错误。

数据库连接与 WordPress 建站实战

创建数据库用户和授权

进入 MySQL 容器创建专用用户:

docker exec -it lnmp-mysql mysql -uroot -proot123

在 MySQL 命令行里执行:

sql
CREATE USER 'wpuser'@'%' IDENTIFIED BY 'wp_pass_2024';
GRANT ALL PRIVILEGES ON myapp.* TO 'wpuser'@'%';
FLUSH PRIVILEGES;

`%` 表示允许任何主机连接,生产环境建议限制为 PHP 容器的 IP。

部署 WordPress

下载 WordPress 并解压到 `www` 目录:

wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz -C www/

访问 `http://服务器IP/wordpress` 开始安装,数据库主机填 `lnmp-mysql`(容器名),用户名填刚才创建的 `wpuser`。

老鸟叮嘱:WordPress 需要 `php-mysqli` 扩展,PHP 8.2-fpm-alpine 默认不带。需要手动安装扩展,在 `docker-compose.yml` 的 PHP 服务里加一行:

yaml
php:
build:
context: .
dockerfile: Dockerfile-php

然后创建 `Dockerfile-php`:

dockerfile
FROM php:8.2-fpm-alpine
RUN docker-php-ext-install mysqli pdo pdo_mysql

重新构建并启动:`docker-compose up -d –build`。

FAQ

Linux SSH 连不上怎么办?

先检查 SSH 服务是否运行:`systemctl status sshd`。如果没启动,`systemctl start sshd`。再确认防火墙是否放行了 22 端口:`iptables -L -n | grep 22`。

VPS 防火墙端口放行后还是访问不了是什么原因?

可能是 Docker 的 iptables 规则覆盖了主机规则。检查 `docker-compose.yml` 里端口映射是否写错,或者用 `curl -v http://127.0.0.1` 测试本地是否能通。

Linux 小白可以直接用 root 账号操作吗?

开发环境可以,生产环境强烈不建议。用 `adduser` 创建普通用户,然后用 `sudo` 提权。万一被入侵,root 权限直接导致服务器沦陷。

BBR 开启后为什么速度没有明显提升?

BBR 对长距离、高延迟链路效果明显,但如果是服务器本身带宽不足或对端限速,BBR 没用。先跑 `speedtest-cli` 测实际带宽。

Docker 容器重启后数据会丢失吗?

如果没挂载卷,会丢。确保 `docker-compose.yml` 里 MySQL 和网站目录都用了 `volumes` 持久化。

Nginx 配置修改后怎么生效?

不用重启容器,执行 `docker exec lnmp-nginx nginx -s reload` 即可热加载配置。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9507.html 商家投稿邮箱:zhujixuanblog@qq.com