下面详细介绍 macOS 下 Docker 的使用方法,特别针对 M1/M2 芯片的 Mac 进行优化。
一、安装 Docker Desktop for Mac
1. 下载和安装
-
访问 Docker 官网
-
选择 Apple Chip (M1/M2)或 Intel 版本下载
-
拖拽 Docker 到 Applications 文件夹
-
首次启动需要授权安装辅助工具
2. 初始配置
首次运行 Docker Desktop:
-
系统会请求权限,点击 "OK"
-
等待 Docker 启动(状态栏出现鲸鱼图标)
-
打开终端验证安装:
bash
docker --version
docker-compose --version
docker ps
3. 重要设置
打开 Docker Desktop → Preferences:
General:
-
✅ Start Docker Desktop when you log in(推荐)
-
✅ Use Docker Compose V2(推荐)
Resources:
-
CPU: 建议 4-8 核(根据你的 Mac 配置)
-
Memory: 建议 4-8 GB
-
Disk image size: 至少 32 GB
二、macOS 特有的路径和权限
文件路径映射
在 macOS 中,Docker 容器访问主机文件的路径:
bash
# 在容器中访问 Mac 主目录
-v /Users/你的用户名/project:/app
# 示例
docker run -v /Users/john/myapp:/app nginx
权限处理
macOS 和 Linux 权限系统不同,需要注意:
bash
# 在 Dockerfile 中设置合适的用户
RUN adduser -D appuser && chown -R appuser /app
USER appuser
三、针对 Apple Silicon (M1/M2) 的优化
使用多平台镜像
bash
# 拉取兼容 M1 的镜像
docker pull --platform linux/amd64 mysql:8.0
# 或者使用 arm64 镜像(性能更好)
docker pull arm64v8/nginx
在 Dockerfile 中指定平台
bash
# 使用多平台基础镜像
FROM --platform=linux/amd64 php:8.1-apache
# 或者使用 arm64 镜像
FROM arm64v8/php:8.1-apache
性能优化
bash
# 使用 platform 参数运行容器
docker run --platform linux/amd64 your-image
# 对于性能敏感的应用,尽量使用 arm64 原生镜像
四、完整的 PHP 项目示例
项目结构
php
~/Projects/my-php-app/
├── docker-compose.yml
├── src/
│ └── index.php
└── Dockerfile
1. 创建 Dockerfile(针对 M1 优化)
bash
# 使用 ARM 兼容的 PHP 镜像
FROM arm64v8/php:8.1-apache
# 对于 Intel Mac 或需要 x86 兼容性:
# FROM --platform=linux/amd64 php:8.1-apache
WORKDIR /var/www/html
# 安装系统依赖(针对 ARM 架构)
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libzip-dev \
zip \
unzip \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd pdo pdo_mysql zip
RUN a2enmod rewrite
COPY src/ /var/www/html/
# 设置正确的文件权限
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html
EXPOSE 80
CMD ["apache2-foreground"]
2. 创建 docker-compose.yml
bash
version: '3.8'
services:
web:
build: .
platform: linux/arm64 # 针对 M1/M2 优化
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- /Users/${USER}/Projects/my-php-app/src:/var/www/html # 绝对路径确保正确映射
depends_on:
- db
environment:
- APACHE_RUN_USER=www-data
- APACHE_RUN_GROUP=www-data
db:
image: mysql:8.0
platform: linux/arm64 # 使用 ARM 版本
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myapp
MYSQL_USER: app_user
MYSQL_PASSWORD: app_password
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
platform: linux/arm64
environment:
PMA_HOST: db
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: secret
ports:
- "8081:80"
depends_on:
- db
volumes:
mysql_data:
3. 创建测试文件
src/index.php:
bash
<?php
phpinfo();
// 测试 MySQL 连接
try {
$pdo = new PDO('mysql:host=db;dbname=myapp', 'app_user', 'app_password');
echo "<h2>MySQL 连接成功!</h2>";
} catch (Exception $e) {
echo "<h2>MySQL 连接失败: " . $e->getMessage() . "</h2>";
}
?>
五、在 macOS 终端中使用 Docker
基本命令
bash
# 进入项目目录
cd ~/Projects/my-php-app
# 构建和启动服务
docker-compose up -d
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs web
docker-compose logs -f web # 实时日志
# 停止服务
docker-compose down
# 重建服务(代码修改后)
docker-compose up -d --build
常用调试命令
bash
# 进入容器
docker-compose exec web bash
docker-compose exec db mysql -u root -p
# 查看容器资源使用
docker stats
# 清理无用镜像
docker image prune
# 查看磁盘使用
docker system df
六、在 VS Code 中的集成使用
1. 安装扩展
-
Docker (Microsoft)
-
Dev Containers (Microsoft)
2. 使用 Docker 扩展
-
打开 VS Code
-
点击左侧 Docker 鲸鱼图标
-
你会看到:
-
正在运行的容器
-
本地镜像
-
可以直接管理所有服务
-
3. 在容器中开发
创建 .devcontainer/devcontainer.json:
bash
{
"name": "PHP Development",
"dockerComposeFile": "../docker-compose.yml",
"service": "web",
"workspaceFolder": "/var/www/html",
"shutdownAction": "stopCompose",
"customizations": {
"vscode": {
"extensions": [
"bmewburn.vscode-intelephense-client",
"ms-azuretools.vscode-docker"
]
}
},
"forwardPorts": [8080, 8081, 3306],
"postCreateCommand": "chmod -R 755 /var/www/html",
"remoteUser": "www-data"
}
使用方法:
-
Cmd+Shift+P→ "Dev Containers: Reopen in Container" -
现在你就在容器环境中开发了!
七、macOS 特有技巧和问题解决
1. 文件同步性能优化
Docker Desktop 的文件共享在 macOS 上可能较慢,可以:
bash
# 在 docker-compose.yml 中使用 cached 模式
volumes:
- ./src:/var/www/html:cached # 读缓存
# 或者使用 delegated(写缓存)
- ./src:/var/www/html:delegated
2. 主机网络访问
在 macOS 中,从容器访问主机服务:
bash
# 使用 host.docker.internal 代替 localhost
# 在 PHP 代码中访问主机服务:
$host = 'host.docker.internal';
3. 端口占用检查
bash
# 检查端口是否被占用
lsof -i :8080
lsof -i :3306
# 如果端口被占用,修改 docker-compose.yml 中的端口映射
4. 磁盘空间管理
bash
# 查看 Docker 磁盘使用
docker system df
# 清理所有无用数据
docker system prune -a
# 在 Docker Desktop 中也可以清理:
# Preferences → Resources → Advanced → Disk image size
八、完整工作流程示例
启动项目:
bash
# 1. 进入项目目录
cd ~/Projects/my-php-app
# 2. 启动服务
docker-compose up -d
# 3. 访问应用
open http://localhost:8080
open http://localhost:8081 # phpMyAdmin
日常开发:
bash
# 修改代码后,文件会自动同步
# 查看实时日志
docker-compose logs -f web
# 进入容器调试
docker-compose exec web bash
php -v
composer install
# 数据库操作
docker-compose exec db mysql -u root -psecret
停止项目:
bash
# 停止并删除容器
docker-compose down
# 停止但保留数据卷
docker-compose stop
九、常见问题解决
1. "Cannot connect to the Docker daemon"
-
确保 Docker Desktop 正在运行
-
重启 Docker Desktop
2. 权限错误
bash
# 在 Dockerfile 中添加用户权限设置
RUN chown -R www-data:www-data /var/www/html
RUN chmod -R 755 /var/www/html
3. 端口冲突
bash
# 修改 docker-compose.yml 中的端口
ports:
- "8082:80" # 改用其他端口
4. 性能问题
-
在 Docker Desktop Preferences 中增加内存分配
-
使用
:cached或:delegated卷模式 -
考虑使用 Docker 的
buildkit:
bash
DOCKER_BUILDKIT=1 docker-compose build
现在你的 macOS Docker 环境已经配置完成,可以高效地进行 PHP 开发了!