PHP项目怎么使用Docker?

wen java案例 1

本文目录导读:

PHP项目怎么使用Docker?

  1. 核心文件结构
  2. 创建Dockerfile
  3. Nginx配置
  4. Docker Compose配置
  5. .dockerignore文件
  6. 使用步骤
  7. 针对不同框架的优化
  8. 最佳实践
  9. 生产环境注意事项

在PHP项目中使用Docker可以大大简化开发、测试和部署流程,下面是一个从零开始的完整指南。

核心文件结构

典型的PHP+Docker项目结构:

my-php-project/
├── app/                    # PHP代码目录
│   └── index.php
├── docker/
│   ├── php/
│   │   └── Dockerfile
│   └── nginx/
│       ├── Dockerfile
│       └── default.conf
├── docker-compose.yml
├── .dockerignore
└── README.md

创建Dockerfile

PHP-FPM Dockerfile

# docker/php/Dockerfile
FROM php:8.2-fpm
# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip
# 安装PHP扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 设置工作目录
WORKDIR /var/www/html
# 复制应用代码
COPY . /var/www/html
# 设置权限
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html/storage
EXPOSE 9000
CMD ["php-fpm"]

Nginx Dockerfile(可选)

# docker/nginx/Dockerfile
FROM nginx:alpine
# 复制配置文件
COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www/html
COPY . /var/www/html

Nginx配置

# docker/nginx/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    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;
    }
    location ~ /\.ht {
        deny all;
    }
}

Docker Compose配置

# docker-compose.yml
version: '3.8'
services:
  # PHP服务
  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    container_name: php_app
    volumes:
      - .:/var/www/html
    ports:
      - "9000:9000"
    networks:
      - app-network
    depends_on:
      - mysql
      - redis
  # Nginx服务
  nginx:
    build:
      context: .
      dockerfile: docker/nginx/Dockerfile
    container_name: nginx_app
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - .:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - app-network
    depends_on:
      - php
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: mysql_db
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: user_password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app-network
  # Redis缓存
  redis:
    image: redis:alpine
    container_name: redis_cache
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - app-network
  # phpMyAdmin(可选)
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - "8080:80"
    networks:
      - app-network
    depends_on:
      - mysql
volumes:
  mysql_data:
  redis_data:
networks:
  app-network:
    driver: bridge

.dockerignore文件

.git
.gitignore
.env
.docker
docker-compose.yml
README.md
.vscode
node_modules
vendor
storage/framework/cache/data/*
storage/logs/*
!storage/logs/.gitkeep

使用步骤

启动项目

# 构建并启动所有服务
docker-compose up -d
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 进入PHP容器
docker-compose exec php bash
# 安装Composer依赖
docker-compose exec php composer install
# 运行Artisan命令(Laravel)
docker-compose exec php php artisan migrate
docker-compose exec php php artisan key:generate

常用命令

# 停止所有服务
docker-compose down
# 停止并删除数据卷
docker-compose down -v
# 重新构建
docker-compose up -d --build
# 查看资源使用情况
docker stats

针对不同框架的优化

Laravel优化配置

# docker-compose.yml 中的php服务添加
php:
  environment:
    - APP_ENV=local
    - APP_DEBUG=true
    - DB_CONNECTION=mysql
    - DB_HOST=mysql
    - DB_PORT=3306
    - DB_DATABASE=myapp
    - DB_USERNAME=user
    - DB_PASSWORD=user_password
    - REDIS_HOST=redis
    - REDIS_PASSWORD=null
    - REDIS_PORT=6379

Symfony优化配置

php:
  environment:
    - APP_ENV=dev
    - APP_DEBUG=1
    - DATABASE_URL=mysql://user:user_password@mysql:3306/myapp

最佳实践

  1. 多阶段构建:减少最终镜像大小
  2. 使用非root用户:提高安全性
  3. 合理使用缓存:加速构建过程
  4. 环境变量管理:使用 .env 文件
  5. 日志管理:将日志输出到stdout/stderr

生产环境注意事项

# 生产环境docker-compose.prod.yml
version: '3.8'
services:
  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile.prod
    environment:
      - APP_ENV=production
      - APP_DEBUG=false
  nginx:
    ports:
      - "80:80"
      - "443:443"
  # 使用更轻量的镜像
  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=${DB_DATABASE}
# 启动生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

这个配置可以让你快速搭建PHP开发环境,同时保持生产和开发环境的一致性,根据具体项目需求,可以灵活调整配置。

抱歉,评论功能暂时关闭!