Linux LNMP容器化部署实操指南
一 准备与规划
docker --version、docker-compose --version 验证。lnmp-docker/,并按服务拆分子目录:nginx/conf.d、wwwroot、mysql/data、php/conf.d。lnmp_net),便于容器间用服务名互通,避免端口直连带来的耦合与安全风险。二 方案一 Docker Compose快速部署
lnmp-docker/
├─ docker-compose.yml
├─ nginx/
│ └─ conf.d/
│ └─ default.conf
├─ wwwroot/
│ └─ index.php
└─ php/
└─ Dockerfile
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
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
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;
}
}
<?php
phpinfo();
docker-compose up -d --builddocker-compose logs -fdocker-compose exec php mysql -h mysql -u appuser -pAppPass!23 appdb -e "select 1"三 方案二 多容器手工编排
docker network create --subnet 172.16.10.0/24 lnmp_netdocker 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.0docker run -d --name php --network lnmp_net -v ./wwwroot:/var/www/html php:8.2-fpmdocker 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:latestfastcgi_pass 使用服务名 php:9000 进行容器间通信四 常见问题与排查
root 指向与容器内代码路径一致(如 /var/www/html)fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 已设置% 或容器网段)docker logs mysqldocker logs <容器名>;检查卷权限与目录存在docker-compose up -d 完成滚动更新docker service update --image php:8.3-fpm php 实现蓝绿/金丝雀发布,异常可 rollback