您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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
docker --version
docker-compose --version
docker run hello-world
官方提供了多个MySQL镜像版本,推荐使用:
docker pull mysql:8.0
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0
-e MYSQL_ROOT_PASSWORD
:设置root用户密码-e MYSQL_DATABASE
:创建指定名称的数据库-e MYSQL_USER
:创建新用户-e MYSQL_PASSWORD
:设置新用户密码-p 3306:3306
:端口映射-v /my/own/datadir:/var/lib/mysql
:数据卷挂载my.cnf
:[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
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:8.1-apache
:包含Apache的PHP 8.1php:8.1-fpm
:PHP-FPM版本php:8.1-cli
:命令行版本对于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
文件:upload_max_filesize = 20M
post_max_size = 20M
memory_limit = 256M
date.timezone = Asia/Shanghai
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 {} \;
docker pull nginx:alpine
docker run --name my-nginx -p 80:80 -d nginx:alpine
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;
}
}
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');
# 创建数据卷
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
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"
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
# worker进程数
worker_processes auto;
# 每个worker的最大连接数
worker_connections 1024;
# 启用epoll事件模型
use epoll;
# 开启高效文件传输模式
sendfile on;
# 减少数据包数量
tcp_nopush on;
# 保持连接超时时间
keepalive_timeout 65;
; 进程管理方式
pm = dynamic
; 最大子进程数
pm.max_children = 50
; 启动时的进程数
pm.start_servers = 5
; 空闲时的最小进程数
pm.min_spare_servers = 2
; 空闲时的最大进程数
pm.max_spare_servers = 8
[mysqld]
# 缓冲池大小 (总内存的50-70%)
innodb_buffer_pool_size = 1G
# 日志文件大小
innodb_log_file_size = 256M
# 刷新方法
innodb_flush_method = O_DIRECT
# 并发线程数
innodb_thread_concurrency = 8
MySQL安全:
PHP安全:
disable_functions = exec,passthru,shell_exec,system
display_errors = Off
upload_max_filesize = 2M
Nginx安全:
server_tokens off;
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";
查看日志:
docker logs container_name
常见原因:
检查MySQL容器是否运行:
docker ps
检查网络配置:
docker network inspect my-network
从PHP容器测试连接:
docker exec -it my-php bash
apt-get update && apt-get install -y mysql-client
mysql -h my-mysql -u myapp -p
查看文件权限:
docker exec my-php ls -la /var/www/html
解决方案:
docker exec my-php chown -R www-data:www-data /var/www/html
监控容器资源使用:
docker stats
调整配置:
使用绑定挂载实现代码热更新: “`yaml volumes:
”`
启用Xdebug调试:
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
使用Makefile简化命令: “`makefile
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。