跳到主要内容

Docker for Mac

Docker for Mac 使用指南

Docker 是现代开发中不可或缺的容器化工具。在 Mac 上使用 Docker 体验已经非常成熟。本教程将带你从安装到进阶使用,覆盖 Mac 开发的常见场景。

1. 安装 Docker

在 Mac 上安装 Docker 主要有两种主流方式:

方案 A: Docker Desktop (官方标准)

功能最全,带图形化界面 (Dashboard),适合初学者和以及需要 Kubernetes 支持的用户。

  • 下载: Docker Desktop for Mac (注意选择 Apple Silicon 还是 Intel 芯片版本)
  • 安装: 拖拽到 Applications 即可。
  • 优点: 官方支持,功能完整。
  • 缺点: 比较重,启动稍慢,内存占用相对较高。

方案 B: OrbStack (轻量级推荐)

OrbStack 是近年来非常流行的 Docker Desktop 替代品,专为 Mac 优化。

  • 安装: brew install orbstack
  • 优点: 极快(启动和网络速度都很快)、省电、原生这地化好、内存占用极低。
  • 缺点: 部分高级企业功能可能还在开发中(但对 99% 开发者足够)。

推荐: 如果你觉得 Docker Desktop 卡顿,强烈建议尝试 OrbStack。


2. 核心概念速览

  • Image (镜像): 类似于“安装包”或“快照”。只读模板。例如 node:18postgres:14
  • Container (容器): 镜像运行起来的实例。类似于一个轻量级的“虚拟机”。
  • Volume (数据卷): 用于持久化数据。如果不挂载 Volume,容器删除后数据也会丢失。
  • Network (网络): 容器之间的通信桥梁。

3. 常用命令速查表

镜像操作

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi <image_id>

# 清理无用镜像
docker image prune

容器操作

# 启动容器
# -d: 后台运行, -p: 端口映射 (宿主机:容器), --name: 命名
docker run -d -p 8080:80 --name my-nginx nginx:latest

# 查看运行中的容器
docker ps

# 查看所有容器 (包括停止的)
docker ps -a

# 停止容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 删除容器 (需要先停止)
docker rm my-nginx

# 查看容器日志 (排错神器)
docker logs -f my-nginx

# 进入容器内部终端
docker exec -it my-nginx /bin/bash
# (如果镜像是 alpine 版本,可能需要用 /bin/sh)

4. Docker Compose (开发必备)

在实际项目中,我们很少直接敲 docker run 命令,而是使用 docker-compose.yml 文件来管理服务。

示例:启动一个 Postgres 数据库

在项目根目录创建 docker-compose.yml:

version: "3.8"
services:
db:
image: postgres:14-alpine
container_name: my-postgres
restart: always
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- ./pgdata:/var/lib/postgresql/data

常用 Compose 命令

# 启动所有服务 (-d 后台运行)
docker-compose up -d

# 查看服务状态
docker-compose ps

# 停止并删除容器、网络
docker-compose down

# 查看所有服务的日志
docker-compose logs -f

5. Mac 特有配置与优化

镜像加速 (国内网络环境)

如果你拉取镜像速度很慢,需要配置国内镜像源。

  1. 打开 Docker Desktop 设置 -> Docker Engine
  2. 修改 daemon.json 配置:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru"
]
}

(注:镜像源可能随时间失效,建议搜索最新的可用源)

资源限制

Docker Desktop 默认可能会占用较大的内存。

  • 进入 Settings -> Resources
  • 建议分配:
    • CPU: 默认即可。
    • Memory: 如果机器内存 16G,建议给 Docker 4GB - 6GB;如果 32G,可以给 8GB+。
    • Swap: 建议设为 1GB 或更小。

文件共享性能

Mac 的文件系统 (APFS) 和 Linux 容器之间的文件挂载 IO 性能一直是个痛点。

  • Docker Desktop: 确保开启了 "VirtioFS" (在 Settings -> General 或 Experimental Features 中),这能大幅提升文件读写速度。
  • OrbStack: 默认已经优化得非常好,无需手动配置。

6. 实用工具推荐

  • Lazydocker: 一个终端下的 Docker 图形化管理工具,虽然是命令行,但交互非常棒。
    brew install lazydocker
  • Portainer: Web 版的 Docker 管理界面,适合管理复杂的本地容器集群。

7. CI/CD 流水线集成 (GitHub Action / Gitee Go)

在自动化的 CI/CD 流程中,Docker 也是核心角色。以下分别介绍 GitHub Action 和 Gitee Go 的基础配置。

GitHub Actions (推荐)

在项目根目录 .github/workflows/docker-publish.yml 中配置。

核心步骤

  1. 检出代码 (Checkout)
  2. 设置 Docker 环境 (Setup Docker Buildx)
  3. 登录镜像仓库 (Login)
  4. 构建并推送 (Build and Push)
name: Docker Build & Push

on:
push:
branches: ["main"]

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Set up QEMU
uses: docker/setup-qemu-action@v2

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: user/app:latest

提示: secrets.DOCKERHUB_USERNAMETOKEN 需要在 GitHub 仓库 Settings -> Secrets and variables -> Actions 中配置。

Gitee Go (Gitee 流水线)

Gitee 的流水线配置通常在 Web 界面创建,或在 .workflow/pipeline.yml (视具体版本而定)。Gitee Go 环境中通常已经预装了 Docker。

通用 Shell 脚本模式: 大多数国内流水线(Gitee Go、阿里云效、Jenkins)都支持直接运行 Shell 命令。

# 伪代码示例,适用于通用 Shell 步骤
pipeline:
- name: Build Docker Image
script: |
# 1. 登录 (如果在私有镜像仓库)
docker login -u $DOCKER_USER -p $DOCKER_PWD registry.example.com

# 2. 构建
docker build -t registry.example.com/group/project:latest .

# 3. 推送
docker push registry.example.com/group/project:latest

# 4. 清理 (可选,根据构建机策略)
docker rmi registry.example.com/group/project:latest

注意: 在 Gitee Go 等流水线中,环境变量(如 $DOCKER_USER)需要在流水线设置的“变量管理”中提前定义并设为私密。


8. 常见问题 (FAQ)

Q: 端口被占用 (Port already in use)? A: 检查是否有其他服务占用了该端口。

lsof -i :8080
kill -9 <PID>

或者修改 docker-compose.yml 左边的端口号,例如 "8081:80"

Q: 容器时间不对? A: 容器默认用 UTC 时间。可以在 compose 文件中挂载宿主机时间:

volumes:
- /etc/localtime:/etc/localtime:ro