docker怎么配置nginx+php+mysql

发布时间:2021-06-24 09:18:30 作者:chen
来源:亿速云 阅读:151
# Docker怎么配置Nginx+PHP+MySQL

## 前言

在当今的Web开发环境中,Docker已经成为部署应用程序的标准工具之一。它通过容器化技术,使得开发、测试和部署过程变得更加高效和一致。本文将详细介绍如何使用Docker配置一个完整的Nginx+PHP+MySQL开发环境,涵盖从基础概念到实际操作的方方面面。

## 目录

1. [Docker基础概念](#docker基础概念)
2. [环境准备](#环境准备)
3. [配置MySQL容器](#配置mysql容器)
4. [配置PHP容器](#配置php容器)
5. [配置Nginx容器](#配置nginx容器)
6. [容器互联与网络配置](#容器互联与网络配置)
7. [持久化数据存储](#持久化数据存储)
8. [Docker Compose简化部署](#docker-compose简化部署)
9. [性能优化与安全配置](#性能优化与安全配置)
10. [常见问题解决](#常见问题解决)
11. [最佳实践](#最佳实践)
12. [总结](#总结)

## Docker基础概念

### 什么是Docker

Docker是一个开源的应用容器引擎,基于Go语言开发。它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

### 核心组件

1. **Docker镜像(Image)**:类似于虚拟机镜像,包含运行应用所需的所有内容
2. **Docker容器(Container)**:镜像的运行实例
3. **Docker仓库(Registry)**:用于存储和分发镜像
4. **Dockerfile**:用于构建镜像的脚本文件
5. **Docker Compose**:用于定义和运行多容器应用的工具

### 容器与虚拟机的区别

| 特性 | 容器 | 虚拟机 |
|------|------|--------|
| 启动时间 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 较差 |
| 系统资源 | 占用少 | 占用多 |
| 隔离性 | 进程级 | 系统级 |
| 镜像大小 | 通常以MB计 | 通常以GB计 |

## 环境准备

### 系统要求

- 支持的操作系统:
  - Linux (推荐Ubuntu 20.04/22.04, CentOS 7/8)
  - macOS 10.15+
  - Windows 10/11 (需启用WSL2)

- 硬件要求:
  - 至少4GB RAM
  - 20GB可用磁盘空间
  - 支持虚拟化的CPU

### Docker安装

#### Linux系统安装

```bash
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo \
  "deb [arch=amd64 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引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 验证安装
sudo docker run hello-world

Windows/macOS安装

  1. 下载Docker Desktop安装包
  2. 按照向导完成安装
  3. 启动Docker Desktop应用

验证安装

docker --version
docker-compose --version
docker run hello-world

配置MySQL容器

选择MySQL镜像

官方提供了多个MySQL镜像版本,推荐使用:

docker pull mysql:8.0

基本运行命令

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0

配置参数详解

自定义配置文件

  1. 创建自定义配置文件my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
  1. 运行容器时挂载配置文件:
docker run --name some-mysql \
  -v /path/to/my.cnf:/etc/mysql/conf.d/my.cnf \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -d mysql:8.0

数据持久化

docker run --name some-mysql \
  -v /my/own/datadir:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -d mysql:8.0

常用操作

# 进入MySQL容器
docker exec -it some-mysql bash

# 连接MySQL
mysql -u root -p

# 查看运行中的容器
docker ps

# 停止容器
docker stop some-mysql

# 启动已停止的容器
docker start some-mysql

# 删除容器
docker rm some-mysql

配置PHP容器

选择PHP镜像

官方PHP镜像提供了多个版本和变体:

对于Nginx+PHP环境,我们选择FPM版本:

docker pull php:8.1-fpm

基本运行命令

docker run --name my-php -d php:8.1-fpm

安装扩展

PHP-FPM镜像默认只包含基本扩展,需要手动安装其他扩展:

FROM php:8.1-fpm

RUN docker-php-ext-install pdo pdo_mysql mysqli
RUN pecl install redis && docker-php-ext-enable redis

常用扩展安装命令:

# 安装PDO MySQL扩展
docker-php-ext-install pdo_mysql

# 安装GD库
docker-php-ext-install gd

# 安装Zip扩展
docker-php-ext-install zip

# 安装Redis扩展
pecl install redis && docker-php-ext-enable redis

# 安装Xdebug
pecl install xdebug && docker-php-ext-enable xdebug

自定义php.ini

  1. 创建自定义php.ini文件:
upload_max_filesize = 20M
post_max_size = 20M
memory_limit = 256M
date.timezone = Asia/Shanghai
  1. 运行容器时挂载配置文件:
docker run --name my-php \
  -v /path/to/php.ini:/usr/local/etc/php/conf.d/custom.ini \
  -d php:8.1-fpm

项目文件挂载

docker run --name my-php \
  -v /path/to/your/project:/var/www/html \
  -d php:8.1-fpm

多阶段构建示例

# 构建阶段
FROM php:8.1-fpm AS builder

WORKDIR /var/www/html

COPY . .

RUN composer install --no-dev --optimize-autoloader

# 生产阶段
FROM php:8.1-fpm

COPY --from=builder /var/www/html /var/www/html

RUN chown -R www-data:www-data /var/www/html \
    && find /var/www/html -type d -exec chmod 755 {} \; \
    && find /var/www/html -type f -exec chmod 644 {} \;

配置Nginx容器

选择Nginx镜像

docker pull nginx:alpine

基本运行命令

docker run --name my-nginx -p 80:80 -d nginx:alpine

自定义配置文件

  1. 创建Nginx配置文件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$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
  1. 运行容器时挂载配置文件和项目文件:
docker run --name my-nginx \
  -v /path/to/your/project:/var/www/html \
  -v /path/to/default.conf:/etc/nginx/conf.d/default.conf \
  -p 80:80 \
  -d nginx:alpine

常用配置优化

# 启用gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

# 客户端缓存控制
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
}

# 禁止访问隐藏文件
location ~ /\. {
    deny all;
}

日志配置

docker run --name my-nginx \
  -v /path/to/nginx/logs:/var/log/nginx \
  -p 80:80 \
  -d nginx:alpine

容器互联与网络配置

创建自定义网络

docker network create my-network

运行所有容器并加入网络

# MySQL容器
docker run --name my-mysql \
  --network my-network \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=myapp \
  -e MYSQL_USER=myapp \
  -e MYSQL_PASSWORD=myapp \
  -v mysql_data:/var/lib/mysql \
  -d mysql:8.0

# PHP容器
docker run --name my-php \
  --network my-network \
  -v /path/to/your/project:/var/www/html \
  -d php:8.1-fpm

# Nginx容器
docker run --name my-nginx \
  --network my-network \
  -v /path/to/your/project:/var/www/html \
  -v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf \
  -p 80:80 \
  -d nginx:alpine

容器间通信

在Nginx配置中,PHP容器可以通过容器名my-php访问:

fastcgi_pass my-php:9000;

在PHP应用中,MySQL可以通过容器名my-mysql访问:

$db = new PDO('mysql:host=my-mysql;dbname=myapp', 'myapp', 'myapp');

持久化数据存储

数据卷(Volume)使用

# 创建数据卷
docker volume create mysql_data

# 使用数据卷
docker run --name my-mysql \
  -v mysql_data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -d mysql:8.0

绑定挂载(Bind Mount)

docker run --name my-php \
  -v /path/to/your/project:/var/www/html \
  -d php:8.1-fpm

数据备份与恢复

# 备份MySQL数据
docker run --rm --volumes-from my-mysql -v $(pwd):/backup alpine \
  tar cvf /backup/mysql_backup.tar /var/lib/mysql

# 恢复MySQL数据
docker run --rm --volumes-from my-mysql -v $(pwd):/backup alpine \
  sh -c "rm -rf /var/lib/mysql/* && tar xvf /backup/mysql_backup.tar -C /var/lib/mysql --strip 1"

Docker Compose简化部署

docker-compose.yml示例

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: my-mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
      MYSQL_USER: myapp
      MYSQL_PASSWORD: myapp
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - my-network
    restart: unless-stopped

  php:
    build:
      context: .
      dockerfile: Dockerfile.php
    container_name: my-php
    volumes:
      - ./src:/var/www/html
    networks:
      - my-network
    depends_on:
      - mysql
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    container_name: my-nginx
    volumes:
      - ./src:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    networks:
      - my-network
    depends_on:
      - php
    restart: unless-stopped

volumes:
  mysql_data:

networks:
  my-network:
    driver: bridge

相关命令

# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 查看日志
docker-compose logs -f

# 重建服务
docker-compose up -d --build

# 执行命令
docker-compose exec php bash

性能优化与安全配置

Nginx优化

# worker进程数
worker_processes auto;

# 每个worker的最大连接数
worker_connections 1024;

# 启用epoll事件模型
use epoll;

# 开启高效文件传输模式
sendfile on;

# 减少数据包数量
tcp_nopush on;

# 保持连接超时时间
keepalive_timeout 65;

PHP-FPM优化

; 进程管理方式
pm = dynamic

; 最大子进程数
pm.max_children = 50

; 启动时的进程数
pm.start_servers = 5

; 空闲时的最小进程数
pm.min_spare_servers = 2

; 空闲时的最大进程数
pm.max_spare_servers = 8

MySQL优化

[mysqld]
# 缓冲池大小 (总内存的50-70%)
innodb_buffer_pool_size = 1G

# 日志文件大小
innodb_log_file_size = 256M

# 刷新方法
innodb_flush_method = O_DIRECT

# 并发线程数
innodb_thread_concurrency = 8

安全配置

  1. MySQL安全

    • 修改默认root密码
    • 限制root用户远程访问
    • 创建应用专用用户
  2. PHP安全

    • 禁用危险函数:disable_functions = exec,passthru,shell_exec,system
    • 关闭错误显示:display_errors = Off
    • 限制文件上传:upload_max_filesize = 2M
  3. Nginx安全

    • 隐藏版本信息:server_tokens off;
    • 限制HTTP方法:if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }
    • 添加安全头:
      
      add_header X-Frame-Options "SAMEORIGIN";
      add_header X-XSS-Protection "1; mode=block";
      add_header X-Content-Type-Options "nosniff";
      

常见问题解决

容器启动失败

  1. 查看日志:

    docker logs container_name
    
  2. 常见原因:

    • 端口冲突
    • 挂载路径不存在
    • 环境变量未设置
    • 配置文件语法错误

连接数据库失败

  1. 检查MySQL容器是否运行:

    docker ps
    
  2. 检查网络配置:

    docker network inspect my-network
    
  3. 从PHP容器测试连接:

    docker exec -it my-php bash
    apt-get update && apt-get install -y mysql-client
    mysql -h my-mysql -u myapp -p
    

文件权限问题

  1. 查看文件权限:

    docker exec my-php ls -la /var/www/html
    
  2. 解决方案:

    • 确保挂载目录存在
    • 设置正确的用户和组:
      
      docker exec my-php chown -R www-data:www-data /var/www/html
      

性能问题

  1. 监控容器资源使用:

    docker stats
    
  2. 调整配置:

    • 增加PHP-FPM进程数
    • 优化MySQL缓冲池
    • 启用Nginx缓存

最佳实践

开发环境实践

  1. 使用绑定挂载实现代码热更新: “`yaml volumes:

    • ./src:/var/www/html

    ”`

  2. 启用Xdebug调试:

    zend_extension=xdebug.so
    xdebug.mode=debug
    xdebug.start_with_request=yes
    xdebug.client_host=host.docker.internal
    xdebug.client_port=9003
    
  3. 使用Makefile简化命令: “`makefile

推荐阅读:
  1. docker完整配置nginx+php+mysql的方法步骤
  2. 怎么在win平台中配置一个Nginx+php+mysql 环境

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php docker mysql

上一篇:javascript简写的方法有哪些

下一篇:云服务器如何部署Node.js项目

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》