用 docker-compose 搭一套 PHP 开发环境

米阳 2022-4-23 4 4/23

给老项目配环境是最烦的事:PHP 版本、扩展、MySQL 版本、Nginx 配置,换台电脑就要重来一遍。用 docker-compose 写一次,之后一条命令起全套。

目录结构

project/
├── docker-compose.yml
├── nginx/
│   └── default.conf
├── php/
│   └── Dockerfile
└── www/            # 项目代码

compose 文件

version: "3.8"
services:
  nginx:
    image: nginx:1.21-alpine
    ports: ["8080:80"]
    volumes:
      - ./www:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on: [php]

  php:
    build: ./php
    volumes:
      - ./www:/var/www/html
    environment:
      TZ: Asia/Shanghai

  mysql:
    image: mysql:5.7
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: app
    volumes:
      - ./data/mysql:/var/lib/mysql
    ports: ["3307:3306"]

  redis:
    image: redis:6-alpine
    command: redis-server --appendonly yes
    volumes:
      - ./data/redis:/data

PHP 镜像

FROM php:7.4-fpm
RUN docker-php-ext-install pdo_mysql mysqli mbstring gd \
 && pecl install redis \
 && docker-php-ext-enable redis

docker-php-ext-install 是官方镜像自带的脚本,装扩展不用自己编译。gd 依赖 libpng 之类,如果报错再加 apt-get install -y libpng-dev libjpeg-dev。

Nginx 配置

server {
    listen 80;
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;          # 服务名,不是 IP
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
    }
}

fastcgi_pass 写容器服务名 php,Docker 的内部 DNS 会解析到容器 IP。写 127.0.0.1 是错的——那是 nginx 容器自己。

几个踩过的坑

  • 文件权限:容器里的 php-fpm 跑 www-data(uid 33),宿主机挂载目录如果不是这个属主,写文件会失败。开发环境直接 chmod -R 777,生产环境另说。
  • MySQL 初始化只跑一次:data/mysql 目录一旦有数据,改 MYSQL_DATABASE 不会生效,要删掉目录重来。
  • 端口冲突:本机可能已经有 MySQL 跑在 3306,所以映射到 3307。

日常使用

docker-compose up -d          # 起
docker-compose logs -f php    # 看日志
docker-compose exec php bash  # 进容器

给新同事的环境搭建时间,从半天变成十分钟。

- THE END -

米阳

4月23日22:15

最后修改:2022年4月23日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论