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:18或postgres: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 特有配置与优化
镜像加速 (国内网络环境)
如果你拉取镜像速度很慢,需要配置国内镜像源。
- 打开 Docker Desktop 设置 -> Docker Engine。
- 修改
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 中配置。
核心步骤:
- 检出代码 (Checkout)
- 设置 Docker 环境 (Setup Docker Buildx)
- 登录镜像仓库 (Login)
- 构建并推送 (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_USERNAME和TOKEN需要在 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