Linux LNMP如何进行容器化部署
导读:Linux LNMP容器化部署实操指南 一 准备与规划 安装基础工具:确保已安装 Docker 与 Docker Compose,可执行 docker --version、docker-compose --version 验证。 选择版本...
Linux LNMP容器化部署实操指南
一 准备与规划
- 安装基础工具:确保已安装 Docker 与 Docker Compose,可执行
docker --version、docker-compose --version验证。 - 选择版本:按需选择组件版本,例如 Nginx 最新稳定版、MySQL 5.7/8.0、PHP 7.4/8.x。
- 目录规划:建议统一项目目录,如
lnmp-docker/,并按服务拆分子目录:nginx/conf.d、wwwroot、mysql/data、php/conf.d。 - 网络规划:为服务创建自定义桥接网络(如
lnmp_net),便于容器间用服务名互通,避免端口直连带来的耦合与安全风险。 - 数据持久化:为 MySQL 数据目录 与 Nginx 日志目录 挂载卷,确保数据不随容器销毁而丢失。
以上做法可显著提升环境一致性与可维护性,并便于后续扩展与升级。
二 方案一 Docker Compose快速部署
- 目录与文件结构
lnmp-docker/ ├─ docker-compose.yml ├─ nginx/ │ └─ conf.d/ │ └─ default.conf ├─ wwwroot/ │ └─ index.php └─ php/ └─ Dockerfile - 核心配置
- docker-compose.yml
version: "3.8" services: nginx: image: nginx:latest container_name: nginx ports: - "80:80" - "443:443" volumes: - ./wwwroot:/var/www/html:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./logs/nginx:/var/log/nginx networks: - lnmp_net depends_on: - php - mysql php: build: ./php container_name: php volumes: - ./wwwroot:/var/www/html - ./php/conf.d:/usr/local/etc/php/conf.d networks: - lnmp_net mysql: image: mysql:8.0 container_name: mysql environment: MYSQL_ROOT_PASSWORD: StrongRootPass! MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: AppPass!23 volumes: - ./mysql/data:/var/lib/mysql ports: - "3306:3306" networks: - lnmp_net healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u$$MYSQL_USER", "-p$$MYSQL_PASSWORD"] interval: 10s timeout: 5s retries: 5 networks: lnmp_net: driver: bridge - php/Dockerfile(按需安装常用扩展)
FROM php:8.2-fpm RUN docker-php-ext-install pdo_mysql mysqli \ & & docker-php-ext-enable opcache # 可选:安装 Composer # RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - nginx/conf.d/default.conf
server { listen 80; server_name localhost; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass php:9000; } location ~ /\.ht { deny all; } } - wwwroot/index.php(连通性自检)
< ?php phpinfo();
- docker-compose.yml
- 启动与验证
- 启动:
docker-compose up -d --build - 查看日志:
docker-compose logs -f - 访问测试:浏览器打开 http://服务器IP/ 应看到 PHP Info 页面
- 数据库连通性:在容器内测试
docker-compose exec php mysql -h mysql -u appuser -pAppPass!23 appdb -e "select 1"
该方案结构清晰、易于维护,适合开发、测试与生产的一致化交付。
- 启动:
三 方案二 多容器手工编排
- 创建自定义网络
docker network create --subnet 172.16.10.0/24 lnmp_net
- 启动 MySQL
docker run -d --name mysql --network lnmp_net -p 3306:3306 -e MYSQL_ROOT_PASSWORD=StrongRootPass! -e MYSQL_DATABASE=appdb -e MYSQL_USER=appuser -e MYSQL_PASSWORD=AppPass!23 -v ./mysql/data:/var/lib/mysql mysql:8.0
- 启动 PHP-FPM
docker run -d --name php --network lnmp_net -v ./wwwroot:/var/www/html php:8.2-fpm
- 启动 Nginx
docker run -d --name nginx --network lnmp_net -p 80:80 -p 443:443 -v ./wwwroot:/var/www/html:ro -v ./nginx/conf.d:/etc/nginx/conf.d:ro -v ./logs/nginx:/var/log/nginx nginx:latest
- 配置要点
- Nginx 的
fastcgi_pass使用服务名 php:9000 进行容器间通信 - 代码与日志目录均通过卷挂载,便于开发与排障
该方式更直观地展示容器互联与卷挂载机制,适合理解底层原理与小规模部署。
- Nginx 的
四 常见问题与排查
- Nginx 报 File not found
- 确认
root指向与容器内代码路径一致(如 /var/www/html) - 确认
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;已设置 - 确认 PHP-FPM 容器已运行且监听 9000
- 确认
- PHP 连接 MySQL 失败
- 使用服务名 mysql 连接(而非 127.0.0.1),确保同网络
- 检查用户名、密码、库名与授权主机(如
%或容器网段) - 查看 MySQL 容器日志:
docker logs mysql
- 容器状态异常或频繁重启
- 查看日志:
docker logs < 容器名>;检查卷权限与目录存在 - 对 MySQL 增加健康检查与重启策略,提升稳定性
- 查看日志:
- 升级与回滚
- 在 Docker Compose 中更新镜像标签并
docker-compose up -d完成滚动更新 - 使用 Docker Swarm 的
docker service update --image php:8.3-fpm php实现蓝绿/金丝雀发布,异常可rollback
以上问题在生产中最常见,按服务名通信、正确设置 SCRIPT_FILENAME 与卷挂载通常即可解决。
- 在 Docker Compose 中更新镜像标签并
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux LNMP如何进行容器化部署
本文地址: https://pptw.com/jishu/765748.html
