macos 下 docker使用方法 新手教程

下面详细介绍 macOS 下 Docker 的使用方法,特别针对 M1/M2 芯片的 Mac 进行优化。

一、安装 Docker Desktop for Mac

1. 下载和安装

  1. 访问 Docker 官网

  2. 选择 Apple Chip (M1/M2)或 Intel 版本下载

  3. 拖拽 Docker 到 Applications 文件夹

  4. 首次启动需要授权安装辅助工具

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 扩展

  1. 打开 VS Code

  2. 点击左侧 Docker 鲸鱼图标

  3. 你会看到:

    • 正在运行的容器

    • 本地镜像

    • 可以直接管理所有服务

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"
}

使用方法:

  1. Cmd+Shift+P"Dev Containers: Reopen in Container"

  2. 现在你就在容器环境中开发了!

七、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 开发了!

相关推荐
团儿.3 小时前
Docker Swarm:打造高效、可扩展的容器编排引擎,引领微服务新纪元(上)
docker·微服务·容器·docker-swarm集群
small_white_robot3 小时前
vulnerable_docker_containement 靶机
运维·网络·web安全·网络安全·docker·容器
丈剑走天涯6 小时前
kubernetes 源码编译(ubuntu) kubernetes-1.34.1
java·容器·kubernetes·1024程序员节
..Move...6 小时前
基于VMware和Cent OS的Docker Engine安装与配置
运维·docker·容器
AL流云。6 小时前
学习Docker前提:多环境安装Docker
学习·docker·eureka·1024程序员节
路漫漫其修远兮sjw6 小时前
常用docker命令速查表
运维·docker·容器·模型部署
5pace7 小时前
Mac Nginx安装、启动、简单命令(苍穹外卖、黑马点评前端环境搭建)
java·前端·nginx·macos·tomcat
Learn Beyond Limits7 小时前
如何在Mac进行Safari网页长截图?
前端·macos·safari·方法·操作·功能·开发者平台
java_logo16 小时前
Docker 部署 WordPress 全流程
运维·docker·容器·word·php·1024程序员节