使用Docker Compose部署PHP开发环境

Mar 7, 2024·
Orochi
Orochi
· 3 min read

Docker Compose PHP环境部署指南

1. 项目结构

php-docker/
├── docker-compose.yml
├── .env
├── nginx/
│   ├── Dockerfile
│   ├── nginx.conf
│   └── conf.d/
│       └── default.conf
├── php/
│   ├── Dockerfile
│   └── php.ini
├── mysql/
│   └── my.cnf
├── redis/
│   └── redis.conf
└── www/
    └── index.php

2. 基础配置文件

2.1 环境变量配置 (.env)

# PHP版本
PHP_VERSION=8.2
# MySQL配置
MYSQL_VERSION=8.0
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=your_database
MYSQL_USER=your_user
MYSQL_PASSWORD=your_password
# Redis配置
REDIS_VERSION=7.0
REDIS_PASSWORD=your_redis_password
# 项目配置
PROJECT_NAME=myapp
TIMEZONE=Asia/Shanghai

2.2 Docker Compose配置

version: '3.8'

services:
  nginx:
    build:
      context: ./nginx
      args:
        - TIMEZONE=${TIMEZONE}
    container_name: ${PROJECT_NAME}-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./www:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
      - ./logs/nginx:/var/log/nginx
    depends_on:
      - php
    networks:
      - app-network

  php:
    build:
      context: ./php
      args:
        - PHP_VERSION=${PHP_VERSION}
        - TIMEZONE=${TIMEZONE}
    container_name: ${PROJECT_NAME}-php
    volumes:
      - ./www:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./logs/php:/var/log/php
    environment:
      - TZ=${TIMEZONE}
    networks:
      - app-network

  mysql:
    image: mysql:${MYSQL_VERSION}
    container_name: ${PROJECT_NAME}-mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./logs/mysql:/var/log/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - TZ=${TIMEZONE}
    networks:
      - app-network

  redis:
    image: redis:${REDIS_VERSION}
    container_name: ${PROJECT_NAME}-redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf --requirepass ${REDIS_PASSWORD}
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

3. 服务配置文件

3.1 Nginx配置

# nginx/conf.d/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;
    }
}

3.2 PHP配置

# php/Dockerfile
ARG PHP_VERSION
FROM php:${PHP_VERSION}-fpm

# 安装PHP扩展
RUN apt-get update && apt-get install -y \
    libzip-dev \
    zip \
    && docker-php-ext-install \
    pdo_mysql \
    mysqli \
    zip

# 安装Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# 配置时区
ARG TIMEZONE
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone

# 清理
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

3.3 MySQL配置

# mysql/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = '+8:00'

max_connections = 1000
max_allowed_packet = 16M

# InnoDB配置
innodb_buffer_pool_size = 1G
innodb_log_buffer_size = 16M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT

3.4 Redis配置

# redis/redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./

4. 部署和使用

4.1 启动服务

# 构建并启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs -f

4.2 测试环境

// www/index.php
<?php
phpinfo();

5. 常见问题处理

5.1 权限问题

# 修改目录权限
chmod -R 777 logs/
chmod -R 777 www/

# 修改文件所有者
chown -R www-data:www-data www/

5.2 性能优化

# docker-compose.yml中添加资源限制
services:
  php:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 1G
        reservations:
          cpus: '0.5'
          memory: 512M

5.3 开发调试

# php/php.ini
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = /var/log/php/error.log
xdebug.mode = debug
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
Orochi
Authors
充满活力和热情的软件从业者
在不同的公司和项目中工作过,担任过各种职务,做过各类项目(如企业站点、内部中台、边缘设备服务、客户端开发、大模型训练、大模型适配和任务调度等等),广泛的视野和经验.