1. 环境准备与Docker安装
1.1 系统兼容性检查
在MacOS上安装Docker前,首先要确认硬件兼容性。2010年后发布的Mac机型基本都支持Docker Desktop,但需要注意:
-
Intel芯片Mac:需检查虚拟化支持
bash复制
sysctl kern.hv_support若返回
kern.hv_support: 1则表示支持 -
M系列芯片Mac:原生支持虚拟化,但需注意镜像架构
提示:M芯片需使用arm64架构的镜像,与x86_64不兼容
1.2 Docker Desktop安装
官方推荐通过DMG包安装:
- 访问Docker官网下载对应版本(Intel/M1/M2)
- 双击安装包拖拽到Applications文件夹
- 首次启动时会要求权限授权:
- 需要系统密码安装网络组件
- 需在"安全与隐私"中批准内核扩展
常见安装问题处理:
bash复制# 若出现"Virtualization support not detected"
sudo systemsetup -setusingkernelcache No
1.3 基础配置优化
安装完成后建议调整:
json复制// ~/.docker/daemon.json
{
"experimental": false,
"features": {
"buildkit": true
},
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]
}
重要:国内用户必须配置镜像加速,否则拉取镜像速度极慢
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 容器化Nginx部署
2.1 镜像选择策略
生产环境推荐使用官方镜像的alpine版本:
bash复制docker pull nginx:1.23-alpine
版本选择考量:
- alpine版本体积小(约20MB)
- 1.x.y中的y表示安全更新版本,建议保持最新
- 避免使用latest标签
2.2 配置文件挂载
正确挂载Nginx配置的姿势:
bash复制mkdir -p ~/docker/nginx/{conf,html,logs}
# 示例启动命令
docker run -d \
-p 80:80 \
-v ~/docker/nginx/conf:/etc/nginx/conf.d \
-v ~/docker/nginx/html:/usr/share/nginx/html \
-v ~/docker/nginx/logs:/var/log/nginx \
--name my-nginx \
nginx:1.23-alpine
配置文件注意事项:
- 主配置文件nginx.conf不建议直接修改
- 自定义配置应放在conf.d/*.conf
- 测试配置有效性:
bash复制docker exec my-nginx nginx -t
3. PHP容器集成方案
3.1 官方PHP镜像选择
根据项目需求选择合适版本:
bash复制# 基础镜像(约400MB)
docker pull php:8.1-fpm-alpine
# 带常用扩展的镜像
docker pull php:8.1-fpm-alpine-ext
版本选择建议:
- 生产环境使用fpm变体
- 开发可考虑带xdebug的版本
- PHP 8.x性能优于7.x系列
3.2 扩展安装技巧
在容器内安装扩展的正确方式:
dockerfile复制FROM php:8.1-fpm-alpine
RUN docker-php-ext-install pdo_mysql opcache \
&& apk add --no-cache $PHPIZE_DEPS \
&& pecl install redis \
&& docker-php-ext-enable redis
常用扩展安装方法对比:
| 扩展类型 | 安装方式 | 示例 |
|---|---|---|
| 核心扩展 | docker-php-ext-install | pdo_mysql |
| PECL扩展 | pecl install | redis |
| 系统依赖 | apk add / apt-get install | libpng-dev |
3.3 FPM与Nginx通信
容器间网络连接方案:
bash复制# 创建自定义网络
docker network create app-net
# 启动PHP容器
docker run -d \
--network app-net \
--name php-fpm \
-v ~/code:/var/www/html \
php:8.1-fpm-alpine
# 修改Nginx配置
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
include fastcgi_params;
}
关键点:必须确保两个容器在同一网络,且php-fpm容器名能被解析
4. 编排部署实战
4.1 docker-compose方案
推荐使用docker-compose.yml管理多容器:
yaml复制version: '3.8'
services:
nginx:
image: nginx:1.23-alpine
ports:
- "80:80"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./code:/var/www/html
networks:
- app-net
php:
image: php:8.1-fpm-alpine
volumes:
- ./code:/var/www/html
networks:
- app-net
networks:
app-net:
driver: bridge
启动命令:
bash复制docker-compose up -d
4.2 性能优化参数
Nginx容器调优:
nginx复制events {
worker_connections 1024;
use epoll;
}
http {
keepalive_timeout 65;
gzip on;
# 其他优化参数...
}
PHP-FPM调优:
ini复制[www]
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
4.3 日志收集方案
统一日志收集配置:
yaml复制# docker-compose.yml片段
services:
nginx:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
查看日志命令:
bash复制docker logs -f container_name
# 或
docker-compose logs -f
5. 常见问题排错指南
5.1 端口冲突处理
当出现端口占用错误时:
bash复制# 查找占用端口的进程
lsof -i :80
# 或停止冲突容器
docker stop $(docker ps -q --filter ancestor=nginx)
5.2 文件权限问题
容器内外用户权限同步方案:
bash复制# 查看容器内用户ID
docker exec php-fpm id
# 宿主机修改目录权限
sudo chown -R 1000:1000 ~/code
5.3 容器互联故障
网络诊断步骤:
- 检查容器是否在同一网络
bash复制
docker network inspect app-net - 测试容器间连通性
bash复制docker exec -it nginx ping php-fpm - 验证DNS解析
bash复制docker exec -it nginx nslookup php-fpm
5.4 性能问题排查
容器资源监控方法:
bash复制# 查看实时资源占用
docker stats
# 分析PHP-FPM慢日志
docker exec php-fpm tail -f /var/log/php-fpm.log
6. 进阶配置技巧
6.1 多项目配置方案
单个Nginx服务托管多个项目:
nginx复制# nginx/conf.d/app1.conf
server {
listen 80;
server_name app1.test;
root /var/www/html/app1/public;
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
include fastcgi_params;
}
}
# nginx/conf.d/app2.conf
server {
listen 80;
server_name app2.test;
root /var/www/html/app2/public;
# 其他配置...
}
本地hosts配置:
code复制127.0.0.1 app1.test
127.0.0.1 app2.test
6.2 HTTPS证书配置
使用Let's Encrypt证书示例:
nginx复制server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 其他SSL配置...
}
证书自动续期方案:
bash复制# 使用certbot容器自动续期
docker run -it --rm \
-v /etc/letsencrypt:/etc/letsencrypt \
-v /var/lib/letsencrypt:/var/lib/letsencrypt \
certbot/certbot renew
6.3 CI/CD集成示例
GitHub Actions自动化部署:
yaml复制name: Deploy to Docker
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_TOKEN }}" | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin
- name: Start containers
run: |
docker-compose down
docker-compose up -d --build
