Docker容器化部署实战:Nginx + MySQL + Redis一键部署指南

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
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容