Docker已经成为现代应用部署的标准方式,本文将详细介绍如何使用Docker Compose快速搭建LNMP环境(Linux + Nginx + MySQL + PHP/Redis),帮助你轻松实现一键部署。
一、Docker与Docker Compose简介
Docker是一个开源的容器化平台,可以将应用及其依赖打包成轻量级的容器。而Docker Compose则是用于定义和运行多容器Docker应用的工具,通过YAML配置文件即可一键启动整个应用栈。
1.1 安装Docker
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker CE
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
1.2 安装Docker Compose(独立版本)
# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
二、编写Docker Compose配置文件
接下来创建LNMP环境的配置文件,包含Nginx、MySQL、Redis和PHP服务。
2.1 创建项目目录
# 创建项目目录
mkdir -p ~/lnmp-docker
cd ~/lnmp-docker
# 创建目录结构
mkdir -p nginx/conf.d
mkdir -p mysql/data
mkdir -p redis/data
mkdir -p php
mkdir -p wwwlogs
mkdir -p public
# 设置权限
chmod -R 777 mysql/data redis/data wwwlogs public
2.2 docker-compose.yml配置
version: '3.8'
services:
# Nginx服务
nginx:
image: nginx:1.24-alpine
container_name: lnmp_nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./public:/usr/share/nginx/html
- ./wwwlogs:/var/log/nginx
depends_on:
- php
networks:
- lnmp_network
restart: always
# MySQL服务
mysql:
image: mysql:8.0
container_name: lnmp_mysql
ports:
- "3306:3306"
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
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
networks:
- lnmp_network
restart: always
# Redis服务
redis:
image: redis:7-alpine
container_name: lnmp_redis
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
networks:
- lnmp_network
restart: always
# PHP服务
php:
image: php:8.2-fpm-alpine
container_name: lnmp_php
volumes:
- ./public:/var/www/html
depends_on:
- mysql
- redis
networks:
- lnmp_network
restart: always
networks:
lnmp_network:
driver: bridge
2.3 Nginx配置文件
# nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.php index.html;
# 访问日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# PHP请求转发到PHP-FPM
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# 安全头设置
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
}
2.4 MySQL配置文件
# mysql/my.cnf
[mysqld]
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 性能优化
max_connections = 200
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
# 日志配置
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2
[client]
default-character-set = utf8mb4
2.5 Redis配置文件
# redis/redis.conf
# 绑定地址
bind 0.0.0.0
# 端口
port 6379
# 持久化配置
appendonly yes
appendfsync everysec
# 内存限制
maxmemory 256mb
maxmemory-policy allkeys-lru
# 密码(生产环境务必设置)
# requirepass your_redis_password
# 日志
loglevel notice
三、启动与管理
3.1 启动所有服务
# 启动所有服务(后台运行)
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f nginx
docker-compose logs -f mysql
docker-compose logs -f redis
docker-compose logs -f php
3.2 常用管理命令
# 停止所有服务
docker-compose down
# 停止并删除数据卷(谨慎使用)
docker-compose down -v
# 重启单个服务
docker-compose restart nginx
# 进入容器内部
docker exec -it lnmp_nginx sh
docker exec -it lnmp_mysql bash
docker exec -it lnmp_redis sh
# 查看容器资源使用
docker stats
# 查看容器日志
docker logs -f lnmp_nginx
docker logs -f lnmp_mysql
docker logs -f lnmp_redis
3.3 服务健康检查
# 检查Nginx
curl -I http://localhost:80
# 检查MySQL
docker exec -it lnmp_mysql mysql -u root -p -e "SELECT VERSION();"
# 检查Redis
docker exec -it lnmp_redis redis-cli ping
# 检查PHP-FPM
docker exec -it lnmp_php php-fpm -v
四、数据持久化与备份
4.1 数据备份
# 备份MySQL数据库
docker exec lnmp_mysql mysqldump -u root -p your_password your_database > backup_$(date +%Y%m%d).sql
# 备份Redis数据
docker exec lnmp_redis redis-cli BGSAVE
docker cp lnmp_redis:/data/dump.rdb ./redis_backup_$(date +%Y%m%d).rdb
# 备份网站文件
tar -czvf public_backup_$(date +%Y%m%d).tar.gz ./public
4.2 数据恢复
# 恢复MySQL数据库
docker exec -i lnmp_mysql mysql -u root -p your_password your_database < backup_20240101.sql
# 恢复Redis数据
docker stop lnmp_redis
docker cp ./redis_backup_20240101.rdb lnmp_redis:/data/dump.rdb
docker start lnmp_redis
五、Docker网络与安全
5.1 网络隔离
使用自定义网络可以实现容器间的网络隔离,只有在同一网络的容器才能相互通信。
# 创建自定义网络
docker network create lnmp_network
# 在docker-compose.yml中指定网络
networks:
- lnmp_network
# 查看网络信息
docker network inspect lnmp_network
5.2 保护Docker守护进程
# 创建Docker用户组(避免直接使用root)
sudo groupadd docker
sudo usermod -aG docker $USER
# 配置Docker守护进程TLS认证(生产环境)
# 编辑systemd服务文件
sudo systemctl edit docker
# 添加以下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://2375
5.3 容器安全加固
# 以非root用户运行容器
services:
nginx:
image: nginx:1.24-alpine
user: nginx
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
- /run
六、监控与日志管理
6.1 使用cAdvisor监控
# 启动cAdvisor
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
gcr.io/cadvisor/cadvisor:latest
6.2 日志轮转配置
# 在docker-compose.yml中配置日志
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
6.3 使用Docker日志聚合
# 使用Docker的json-file日志驱动
docker logs --tail 100 -f container_name
# 使用journald日志驱动
# 在/etc/docker/daemon.json中配置:
{
"log-driver": "journald",
"log-opts": {
"tag": "{{.Name}}/{{.ID}}"
}
}
七、生产环境最佳实践
7.1 使用Docker Swarm或Kubernetes
# 初始化Docker Swarm
docker swarm init --advertise-addr 192.168.1.100
# 创建服务
docker service create \
--name nginx \
--replicas 3 \
-p 80:80 \
nginx:1.24-alpine
# 扩展服务
docker service scale nginx=5
7.2 镜像构建最佳实践
# 创建Dockerfile
# 使用多阶段构建减小镜像大小
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
7.3 使用.env文件管理敏感配置
# .env文件(不要提交到版本控制)
MYSQL_ROOT_PASSWORD=secure_password_here
MYSQL_DATABASE=myapp
MYSQL_USER=appuser
MYSQL_PASSWORD=app_password_here
# 在docker-compose.yml中引用
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
总结
本文详细介绍了如何使用Docker Compose快速搭建LNMP环境,包括:
- Docker和Docker Compose的安装配置
- Nginx、MySQL、Redis、PHP服务的Docker Compose配置
- 各服务的配置文件优化(Nginx、MySQL、Redis)
- 服务的启动、停止、重启等管理操作
- 数据持久化与备份恢复
- Docker网络与安全配置
- 监控与日志管理
- 生产环境最佳实践
通过Docker容器化部署,可以实现应用程序的快速交付和环境一致性,大大提升运维效率。
💡 提示:生产环境务必做好安全加固,定期备份数据,并使用Docker Swarm或Kubernetes进行服务编排。
更多容器化技术文章,请访问 xjahb.cn
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















暂无评论内容