给老项目配环境是最烦的事: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 -
最后修改:2022年4月23日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://mi-blog.cn/archives/657
共有 0 条评论