Docker 部署 Nginx 和 MySQL 应用实战指南:从环境搭建到性能优化

Docker 作为一种流行的容器化技术,已经广泛应用于各种项目的部署和运行中。本文将详细介绍如何使用 Docker 成功部署 Nginx 和 MySQL 应用,涵盖环境搭建、配置优化、故障排查等实用内容,帮助读者快速掌握 Docker 部署的核心技能。

一、Docker 基础环境准备

在开始部署 Nginx 和 MySQL 之前,首先需要确保本地已经安装了 Docker环境和Docker Compose。以下是详细的准备工作:

1.1 Docker 安装与配置

对于 Ubuntu 系统,可以使用以下命令安装 Docker:

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

对于 CentOS 系统,可以这样安装:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

安装完成后,可以通过以下命令验证 Docker 版本:

docker --version

1.2 Docker Compose 安装

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具, recommand 版本为 v3.x:

sudo curl -L "https://github.com/docker/compose/releases/download/v3.8.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

二、Nginx 与 MySQL 的 Docker 镜像选择

2.1 Nginx 镜像

官方 Nginx 镜像是建议的首选:

docker pull nginx:latest

此外,还有一些带特殊配置的镜像可供选择:

  • nginx:stable: 稳定版
  • nginx:alpine: 小巧版(仅 5MB)
  • nginx:1.18: 特定版本

2.2 MySQL 镜像

官方 MySQL 镜像提供多种版本:

docker pull mysql:latest

根据实际需求,可以选择:

  • mysql:5.7: 某个稳定版本
  • mysql:8.0: 最新版本
  • mysql:8.0.25:特定版本

三、使用 Docker Compose 定义 Nginx 与 MySQL 服务

3.1 创建项目文件夹结构

mkdir nginx-mysql-docker
cd nginx-mysql-docker
mkdir docker-compose.yml

3.2 编写 docker-compose.yml 文件

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx_server
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
    restart: unless-stopped
    networks:
      - app_network

  mysql:
    image: mysql:8.0
    container_name: mysql_instance
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_password
      MYSQL_DATABASE: your_database_name
      MYSQL_USER: your_database_user
      MYSQL_PASSWORD: your_user_password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql.cnf:/etc/mysql/my.cnf
    restart: unless-stopped
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

volumes:
  mysql_data:

3.3 Nginx 配置示例 (nginx.conf)

user nginx;
worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        location ~ \.php$ {
            root           /usr/share/nginx/html;
            fastcgi_pass   unix:/var/run/php/php7.4-fpm.sock;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

四、Nginx 与 MySQL 的集成配置

4.1 配置 Nginx 反向代理 MySQL 管理页面

server {
    listen       80;
    server_name  db admin;

    location / {
        proxy_pass http://mysql:3306/phpmyadmin/;
        include     proxy_params;
        proxy_redirect      off;
        proxy_set_header    Host $http_host;
        proxy_set_header    X-Real-IP $ remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
    }
}

4.2 如此配置优化 Nginx 性能

http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    proxy_set_header    Cache-Control "";
    add_header         Cache-Control "public";
}

五、项目管理与维护

5.1 日志监控与管理

为了方便查看容器日志,可以通过以下命令优雅地查看日志:

docker-compose logs -f nginx
docker-compose logs -f mysql

5.2 备份与恢复策略

对于 MySQL 数据的备份,可以采用以下方案:

  1. 每日自动备份
  2. 使用 Docker 卷快照
  3. 将数据卷挂载到宿主机进行备份

5.3 常见问题解决

  • Nginx 502 Bad Gateway:检查 php-fpm 是否运行正常
  • MySQL 连接超时:检查网络配置和防火墙设置
  • Docker 卷损坏:使用 docker system prune 清理无效卷

六、性能优化实践

6.1 Nginx 性能调优参数

worker_processes auto;       # CPU 核心数
events { worker_connections  4096; } # 每个工作进程最大连接数

http {
    include        mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        ...
    }
}

6.2 MySQL 性能优化

[mysqld]
innodb_buffer_pool_size = 512M  # MySQL 最大缓存
max_connections = 150          # 最大连接数
query_cache_size = 0           # 禁用查询缓存
log_queries_not_distinct = 1    # 记录非唯一查询

七、生产环境部署注意事项

  1. 建议使用 Docker Swarm 或 Kubernetes 进行集群管理
  2. 配置 HTTPS,使用letsencrypt免费证书
  3. 设置异地多副本备份
  4. 使用 Docker 动态网络实现端口隔离
  5. 建立完整的监控体系

八、总结与展望

通过 Docker 部署 Nginx 和 MySQL,可以极大简化应用程序环境的一致性问题,提高开发和运维效率。随着 Docker 技术的不断成熟,未来将会有更多高级特性支持,例如:服务发现、配置管理、自动扩缩容等。

对于初学者,建议从简单的单容器部署开始,逐步掌握多容器协作和复杂场景的解决方案。不断实践和总结,才能真正驾驭 Docker 这一强大工具。

希望本文的详细步骤和优化建议能帮助您顺利完成 Nginx 和 MySQL 的 Docker 部署,并在实际工作中发挥出其强大的性能优势。随着容器化技术的深入发展,相信在不久的将来会有更多创新的部署方案涌现,等待我们去探索和实践。