在 macOS 系统上安装与基础使用 Docker Desktop:一份详尽指南
引言:拥抱容器化世界
在现代软件开发领域,容器化已经成为一项不可或ations缺的技术。它解决了“在我机器上可以运行”的经典问题,通过将应用程序及其所有依赖项(代码、运行时、系统工具、库、设置等)打包到一个标准化单元中,确保应用在任何环境中都能一致地运行。而 Docker 是容器化技术的杰出代表,它简化了容器的构建、分发和运行。
对于 macOS 用户来说,Docker Desktop for Mac 是体验 Docker 魅力的主要工具。它是一个易于安装的应用程序,集成了 Docker 引擎(Daemon)、Docker CLI 客户端、Docker Buildx、Docker Compose 以及 Kubernetes 等工具。Docker Desktop 提供了一个直观的图形用户界面(GUI)以及强大的命令行接口(CLI),使得在 macOS 上构建、运行和管理容器变得前所未有的简单。
本文将手把手带领你完成在 macOS 系统上安装 Docker Desktop 的整个过程,并详细介绍 Docker 的核心概念和最基础的使用方法,帮助你迈出容器化的第一步。无论你是开发者、运维工程师,还是对新技术充满好奇的学习者,本文都将为你提供一份全面的入门指南。
第一部分:Docker Desktop for Mac 安装准备与过程
在开始安装之前,我们需要做一些简单的准备,并了解安装流程。
1. 安装前准备
在你的 macOS 系统上安装 Docker Desktop 需要满足一定的系统要求。虽然 Docker 官方文档会列出最新的详细要求,但一般来说,你需要确保:
- macOS 版本: Docker Desktop 通常支持近几个主要版本的 macOS。例如,写本文时,它通常要求 macOS Ventura 13 或更高版本。对于较旧的 macOS 版本,可能需要查找兼容的旧版 Docker Desktop。
- 硬件: 需要 64 位处理器。特别要注意的是,Docker Desktop 提供了针对 Intel 芯片和 Apple Silicon 芯片 (M1, M2, M3 系列) 的不同安装包。请务必下载与你的 Mac 处理器架构相匹配的版本。
- 内存: 建议至少 8GB 内存,以保证 Docker 容器和 macOS 系统本身都能流畅运行。
- 磁盘空间: 建议至少 10GB 的可用磁盘空间,因为 Docker 镜像和容器会占用存储空间。
在开始安装前,请确保你的 macOS 系统是最新更新的,并且满足上述基本要求。同时,一个稳定的网络连接是必须的,以便下载安装包和后续的 Docker 镜像。
2. 下载 Docker Desktop
安装 Docker Desktop 的第一步是访问 Docker 官方网站下载安装包。
- 打开你的网络浏览器,访问 Docker 官方网站:
https://www.docker.com/
- 导航到产品(Products)或下载(Download)区域。通常在首页会有一个明显的下载按钮或链接。
- 找到 “Docker Desktop” 的下载选项。
- 在下载页面,你需要选择适用于 macOS 的版本。这里会明确区分 “Mac with Intel chip” 和 “Mac with Apple chip”。请仔细确认你的 Mac 使用的是哪种处理器(如果你不确定,可以点击屏幕左上角的苹果图标 -> “关于本机”,查看处理器信息),然后下载相应的
.dmg
安装文件。
下载完成后,你会得到一个名为 Docker Desktop.dmg
(或类似名称,包含版本号和处理器信息) 的文件,保存在你的“下载”文件夹或其他指定位置。
3. 安装 Docker Desktop
安装过程非常简单,与安装大多数 macOS 应用一样。
- 双击下载好的
.dmg
文件。这会挂载磁盘镜像,并在 Finder 中打开一个窗口,显示 Docker Desktop 应用图标和一个指向“应用程序”文件夹的链接。 - 将 “Docker Desktop.app” 图标拖拽到 “Applications” 文件夹图标上。这会将 Docker Desktop 应用复制到你的应用程序目录。
- 拷贝完成后,你可以关闭这个 Finder 窗口,并在 Finder 的侧边栏或者桌面上右键点击挂载的
.dmg
卷(通常命名为 “Docker Desktop”),选择 “推出 [卷名称]” 来卸载磁盘镜像。
4. 首次运行与初始配置
安装到应用程序文件夹后,你可以启动 Docker Desktop 了。
- 打开 Finder,导航到“应用程序”文件夹,找到并双击 “Docker Desktop” 应用图标。
- 第一次启动时,macOS 会询问你是否确定要打开从互联网下载的应用程序。点击 “打开”。
- Docker Desktop 需要一些权限才能正常工作,包括安装一些辅助工具和配置网络。它可能会请求系统权限(例如,使用
sudo
)来设置必要的组件。你需要输入你的 macOS 用户密码来授权这些操作。请务必授予 Docker Desktop 所需的权限。 - Docker Desktop 会启动并进行初始设置。你可能会看到一个欢迎向导,包括接受服务条款。请阅读并接受条款。
- Docker Desktop 启动后,它会在后台启动 Docker Engine。这个过程可能需要一些时间。你可以在屏幕顶部的菜单栏看到 Docker 的图标(一个鲸鱼),图标上的指示器会显示 Docker Daemon 的状态。当鲸鱼图标稳定显示,并且下面提示 “Docker Desktop is running” 时,说明 Docker Engine 已经成功启动并运行了。
首次运行还可能提示你登录 Docker Hub。登录 Docker Hub 可以让你更方便地从公共仓库拉取镜像以及推送自己的镜像,但这不是强制的,你可以选择跳过此步骤,后续再登录。
至此,Docker Desktop 已经在你的 macOS 系统上安装并成功运行了。
第二部分:Docker 核心概念解析
在使用 Docker 之前,理解其几个核心概念是至关重要的。
1. 镜像 (Image)
- 定义: Docker 镜像是一个轻量级、独立、可执行的软件包,它包含了运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件等。你可以将其理解为一个应用程序的“蓝图”或“模板”。
- 特性: 镜像基于联合文件系统 (Union File System),采用分层存储。这意味着多个镜像可以共享相同的底层层,节省磁盘空间。镜像是不可变的(read-only)。一旦创建,就不能修改。
- 获取: 镜像可以从 Docker Hub(默认的公共注册中心)或其他私有注册中心拉取,也可以通过编写
Dockerfile
自己构建。
2. 容器 (Container)
- 定义: 容器是 Docker 镜像的一个运行实例。当你在 Docker 镜像上运行一个命令时,就创建了一个容器。你可以将其理解为一个应用程序的“运行实例”。
- 特性: 容器包含了文件系统、网络接口、以及隔离的进程空间。容器是可读写的(read-write),这意味着你可以在运行时修改容器内的文件,但这些修改通常不会保留到容器停止或删除之后(除非使用卷)。
- 隔离性: 容器提供了进程隔离、网络隔离和文件系统隔离,确保应用程序在容器内运行时互不影响,也与宿主机环境隔离。
3. 注册中心 (Registry)
- 定义: 注册中心是存放 Docker 镜像的地方。最常用的是 Docker Hub,它是一个由 Docker 公司提供的公共注册中心,包含了大量的官方镜像(如 Ubuntu, Nginx, MySQL 等)以及社区用户分享的镜像。你也可以搭建私有的注册中心。
- 作用: 注册中心允许用户上传(push)和下载(pull)Docker 镜像,方便镜像的分发和共享。
4. Dockerfile
- 定义: Dockerfile 是一个文本文件,包含了一系列构建 Docker 镜像的指令。这些指令描述了如何一步步构建镜像,例如从哪个基础镜像开始、如何复制文件、如何运行命令安装依赖、如何配置环境变量等。
- 作用: 通过 Dockerfile,你可以实现镜像构建的自动化和版本控制,确保镜像的可重现性。
5. 卷 (Volume)
- 定义: 卷是用于在 Docker 容器中持久化数据的机制。由于容器的文件系统是临时的,当容器被删除时,其中的数据也会丢失。卷可以将数据存储在宿主机的文件系统或其他外部存储中,独立于容器的生命周期。
- 作用: 确保数据不会丢失,并且可以在多个容器之间共享数据。
6. 网络 (Network)
- 定义: Docker 提供了多种网络模式,用于连接容器与宿主机,或者连接多个容器。
- 作用: 允许容器之间相互通信,或者允许外部访问容器中运行的服务(通过端口映射)。
理解了这些核心概念,你就能更好地掌握 Docker 的工作原理,并开始使用 Docker Desktop 进行实践了。
第三部分:Docker Desktop 基础使用 (命令行界面 CLI)
Docker Desktop 安装完成后,你可以在 macOS 的终端中使用 docker
命令行工具与 Docker Engine 进行交互。
1. 验证安装
首先,打开 macOS 的终端应用(Terminal 或 iTerm2)。输入以下命令来验证 Docker CLI 和 Engine 是否正常工作:
bash
docker --version
这个命令会显示安装的 Docker CLI 版本。
bash
docker info
这个命令会显示 Docker Engine 的详细信息,包括版本、存储驱动、容器数量、镜像数量等。如果这些命令都能成功执行并显示信息,说明 Docker 安装成功,并且 Docker Desktop 的 Docker Engine 正在运行。
你还可以尝试运行一个简单的测试容器:
bash
docker run hello-world
执行这个命令后,Docker 会尝试从 Docker Hub 下载 hello-world
镜像(如果本地没有的话),然后在一个容器中运行这个镜像。这个容器会打印一段问候信息,解释 Docker 的工作流程,然后退出。这证明 Docker Engine 和 CLI 都能正常工作。
2. 常用 Docker CLI 命令
接下来,我们介绍一些最基础和常用的 Docker CLI 命令。
a. 拉取镜像 (docker pull
)
从注册中心下载镜像到本地。
bash
docker pull [镜像名称]:[标签]
[镜像名称]
:你想拉取的镜像的名称,例如ubuntu
,nginx
,mysql
。[标签]
:镜像的版本或标记,例如latest
,18.04
,1.19
. 如果不指定标签,默认为latest
。
示例:
bash
docker pull ubuntu:latest # 拉取最新版本的 Ubuntu 镜像
docker pull nginx:1.21 # 拉取 1.21 版本的 Nginx 镜像
b. 查看本地镜像 (docker images
)
列出本地所有已下载的 Docker 镜像。
bash
docker images
输出会显示镜像的仓库名 (REPOSITORY)、标签 (TAG)、镜像 ID (IMAGE ID)、创建时间 (CREATED) 和大小 (SIZE)。
c. 运行容器 (docker run
)
基于指定的镜像创建一个新的容器并运行它。这是最常用的命令之一,有很多重要的参数。
bash
docker run [OPTIONS] [镜像名称]:[标签] [COMMAND] [ARG...]
常用 Options:
-d
(detached): 在后台运行容器,不会阻塞当前终端。-p [宿主机端口]:[容器端口]
(publish): 将容器内部的端口映射到宿主机上的指定端口,以便从宿主机访问容器内运行的服务。-v [宿主机路径]:[容器路径]
(volume): 将宿主机的文件或目录挂载到容器内部的指定路径,用于数据持久化或共享文件。--name [容器名称]
:给容器指定一个易于识别的名称。如果不指定,Docker 会生成一个随机名称。-it
(interactive and tty): 通常用于运行交互式容器(如操作系统的 shell),保持标准输入打开,并分配一个伪终端。
示例:
-
运行一个简单的 Nginx Web 服务器容器,映射宿主机的 8080 端口到容器的 80 端口,并在后台运行,命名为
my-nginx
:
bash
docker run -d -p 8080:80 --name my-nginx nginx:latest
运行成功后,你可以在浏览器中访问http://localhost:8080
来查看 Nginx 的欢迎页。 -
运行一个交互式的 Ubuntu 容器,进入其 shell:
bash
docker run -it ubuntu:latest /bin/bash
你会进入到 Ubuntu 容器的命令行环境。输入exit
退出容器。
d. 查看正在运行的容器 (docker ps
)
列出当前所有正在运行的容器。
bash
docker ps
输出会显示容器 ID (CONTAINER ID)、镜像 (IMAGE)、命令 (COMMAND)、创建时间 (CREATED)、状态 (STATUS)、端口映射 (PORTS) 和名称 (NAMES)。
要查看所有容器(包括已停止的),使用 -a
参数:
bash
docker ps -a
e. 停止容器 (docker stop
)
停止一个正在运行的容器。
bash
docker stop [容器ID 或 容器名称]
示例:
bash
docker stop my-nginx # 按名称停止容器
docker stop a3e4f5g6h7i8 # 按 ID 停止容器 (使用 docker ps 查看 ID)
f. 启动已停止的容器 (docker start
)
启动一个已停止的容器。
bash
docker start [容器ID 或 容器名称]
示例:
bash
docker start my-nginx
g. 重启容器 (docker restart
)
停止然后启动一个容器。
bash
docker restart [容器ID 或 容器名称]
示例:
bash
docker restart my-nginx
h. 移除容器 (docker rm
)
移除一个容器。注意: 只能移除已停止的容器。如果要移除正在运行的容器,可以使用 -f
参数强制移除(不推荐,最好先停止再移除)。
bash
docker rm [容器ID 或 容器名称]
示例:
bash
docker rm my-nginx
docker rm -f running-container # 强制移除正在运行的容器
i. 移除镜像 (docker rmi
)
移除本地的一个或多个镜像。注意: 只有在没有容器使用该镜像时才能移除。
bash
docker rmi [镜像ID 或 镜像名称]:[标签]
示例:
bash
docker rmi ubuntu:latest
docker rmi nginx:1.21
docker rmi f9a0ecc443e7 # 按 ID 移除镜像 (使用 docker images 查看 ID)
要移除所有未被使用的镜像(清理空间),可以使用:
bash
docker image prune -a
j. 在容器内执行命令 (docker exec
)
在正在运行的容器内执行一个新的命令。
bash
docker exec [OPTIONS] [容器ID 或 容器名称] [COMMAND] [ARG...]
常用 Options:
-it
: 用于执行交互式命令,如进入容器的 shell。
示例:
bash
docker exec my-nginx ls /usr/share/nginx/html # 在 my-nginx 容器内执行 ls 命令查看 Nginx 默认网页目录
docker exec -it my-nginx /bin/bash # 进入 my-nginx 容器的 bash shell
第四部分:Docker Desktop 图形用户界面 (GUI)
除了强大的命令行工具,Docker Desktop 也提供了一个友好的图形用户界面(GUI),让你可以直观地管理容器、镜像、卷和资源。
通过菜单栏的 Docker 鲸鱼图标,你可以打开 Docker Desktop Dashboard。
GUI 界面主要功能区域:
- Containers: 列出所有容器(运行中、已停止)。你可以方便地查看容器的状态、端口映射、日志,以及通过按钮进行启动、停止、重启、删除、进入终端等操作。点击容器名称可以查看容器的详细信息,包括占用的资源、环境变量、挂载点等。
- Images: 列出本地所有镜像。你可以看到镜像的大小、创建时间,以及通过按钮进行删除。你还可以选择从 Docker Hub 拉取新镜像。
- Volumes: 列出所有卷,你可以查看卷的名称以及相关的容器。可以创建和删除卷。
- Dev Environments: Docker Desktop 新增的功能,方便管理开发环境。
- Settings (或 Preferences): 配置 Docker Desktop 的各种设置。
- General: 通用设置,如是否随系统启动、是否自动检查更新等。
- Resources: 最重要的设置之一。在这里你可以配置分配给 Docker Engine 的 CPU、内存、磁盘空间、Swap 空间等资源。如果你的容器需要大量资源,或者 Mac 运行缓慢,可以在这里进行调整。
- Docker Engine: 配置 Docker Engine 的 JSON 格式高级选项。
- Kubernetes: 如果你勾选了启用 Kubernetes,可以在这里看到其状态和设置。
- Extensions: 管理 Docker Desktop 扩展。
- Software Updates: 配置更新策略。
GUI 提供了一种可视化的方式来监控和管理 Docker 资源,对于新手来说,结合 GUI 和 CLI 使用可以更快地理解 Docker 的状态和操作。
第五部分:使用 Dockerfile 构建自定义镜像 (基础示例)
虽然可以拉取现有的镜像,但通常你需要构建自己的镜像来运行特定的应用程序。这通过 Dockerfile
完成。
我们创建一个简单的示例:构建一个 Nginx 镜像,用于托管一个静态网页。
- 创建一个新文件夹,例如
my-web-app
。 -
在
my-web-app
文件夹中,创建一个名为index.html
的文件,内容如下:html
<!DOCTYPE html>
<html>
<head>
<title>Hello Docker!</title>
</head>
<body>
<h1>Hello from Docker Container!</h1>
<p>This is a simple static website hosted by Nginx in a Docker container.</p>
</body>
</html> -
在
my-web-app
文件夹中,创建一个名为Dockerfile
的文件(注意文件名没有扩展名,首字母大写),内容如下:“`Dockerfile
使用官方 Nginx 镜像作为基础镜像
FROM nginx:latest
将本地的 index.html 文件复制到 Nginx 默认的网页目录
Nginx 的默认网页目录通常是 /usr/share/nginx/html
COPY index.html /usr/share/nginx/html/index.html
暴露容器的 80 端口 (Nginx 默认监听端口)
EXPOSE 80
启动 Nginx 服务 (FROM nginx 镜像已经设置了默认启动命令,这里可以省略 CMD 或 ENTRYPOINT)
如果需要覆盖默认命令,可以使用 CMD [“nginx”, “-g”, “daemon off;”]
``
FROM nginx:latest
*: 指定基础镜像。我们从 Docker Hub 拉取最新的官方 Nginx 镜像。
COPY index.html /usr/share/nginx/html/
*: 将当前目录下的
index.html文件复制到镜像内部 Nginx 服务的默认网页根目录。
EXPOSE 80
*: 声明容器将监听 80 端口。这只是一个文档说明,实际端口映射需要在
docker run命令中使用
-p` 参数完成。 -
打开终端,进入
my-web-app
文件夹。 -
使用
docker build
命令构建镜像:bash
docker build -t my-static-nginx .
*docker build
: 构建镜像的命令。
*-t my-static-nginx
: 给构建的镜像指定一个标签 (tag),格式通常是[名称]:[标签]
。这里我们命名为my-static-nginx
,默认标签为latest
。
*.
: 指明 Dockerfile 所在的路径。这里的.
表示当前目录。Docker 会查找当前目录下的Dockerfile
文件,并将当前目录作为构建上下文 (build context)。执行这个命令后,Docker 会根据
Dockerfile
中的指令一步步构建镜像,并显示构建过程。 -
构建成功后,你可以使用
docker images
命令查看新构建的镜像:bash
docker images
你应该能看到名为my-static-nginx
的镜像出现在列表中。 -
现在,使用
docker run
命令运行这个自定义镜像:bash
docker run -d -p 8081:80 --name my-custom-web my-static-nginx
这会在后台运行一个基于my-static-nginx
镜像的容器,将宿主机的 8081 端口映射到容器的 80 端口,并将容器命名为my-custom-web
。 -
打开浏览器,访问
http://localhost:8081
。你应该能看到我们在index.html
文件中定义的“Hello from Docker Container!”页面。
通过这个简单的示例,你学会了如何编写 Dockerfile
、如何构建自定义镜像,以及如何运行这个镜像的容器。
第六部分:Docker Desktop 资源配置与故障排除
Docker Desktop 运行一个虚拟机(或使用 macOS 原生的虚拟化技术,取决于 macOS 版本和处理器架构)来托管 Docker Engine。这个虚拟机需要占用一定的系统资源(CPU、内存、磁盘空间)。
资源配置:
在 Docker Desktop 的 Settings (Preferences) -> Resources 中,你可以调整分配给 Docker 的资源。
- CPUs: 分配给 Docker Engine 的 CPU 核心数。如果运行计算密集型容器,可能需要增加。
- Memory: 分配给 Docker Engine 的内存大小。运行多个或内存密集型容器时,增加内存可以显著提高性能。
- Disk image size: Docker 使用一个虚拟磁盘镜像来存储镜像和容器的可写层数据。你可以设置这个镜像的最大大小。随着你拉取和创建的镜像/容器增多,这个文件会增长。如果磁盘空间不足,你需要增加这个大小或清理不用的镜像/容器。
- Swap: 交换空间大小。
- Disk image location: 可以更改虚拟磁盘镜像文件的存储位置,如果你有其他磁盘分区可用的话。
合理配置资源对于保证 Docker 和 macOS 系统的流畅运行非常重要。如果你的 Mac 性能有限,或者只是进行基础实验,可以适当降低分配的资源。
常见故障排除:
- Docker 鲸鱼图标灰色或提示“Starting”很久: Docker Engine 可能未能正常启动。尝试点击菜单栏的鲸鱼图标 -> “Restart Docker Desktop”。如果仍然不行,可以尝试 “Quit Docker Desktop” 后重新启动应用。检查 macOS 系统日志看是否有相关错误信息。
- 端口冲突: 运行容器时指定的宿主机端口已经被其他程序占用。
docker run -p 8080:80
失败。你可以尝试更换宿主机端口,例如docker run -p 8081:80 ...
。 - 磁盘空间不足: Docker 镜像和容器占用了大量磁盘空间。使用
docker system prune
命令可以清理掉停止的容器、未被使用的网络、悬空的镜像以及构建缓存,释放大量空间。也可以单独使用docker container prune
,docker image prune
,docker volume prune
,docker network prune
。 - 镜像拉取或构建失败: 检查网络连接。如果是访问 Docker Hub,可能需要登录
docker login
。如果是构建自定义镜像,检查Dockerfile
语法是否有误。 - 容器启动后立即退出: 查看容器的日志
docker logs [容器ID 或 容器名称]
,通常日志中包含了退出的原因,例如应用程序错误、配置问题等。
结论:Docker Desktop 让 macOS 成为强大的容器开发平台
通过本文的详细介绍,你已经了解了如何在 macOS 系统上安装 Docker Desktop,掌握了 Docker 的核心概念,并通过命令行和 GUI 进行了基础操作,甚至学会了如何构建一个简单的自定义镜像。
Docker Desktop for Mac 极大地简化了在 macOS 环境下使用 Docker 的复杂度,它提供了一个完整的容器化开发环境,让你可以在隔离的环境中构建、测试和运行你的应用程序,无需担心环境差异带来的问题。这对于开发、测试、CI/CD 等环节都具有重要意义。
这仅仅是 Docker 世界的冰山一角。接下来,你可以继续深入学习 Dockerfile 的高级指令、多阶段构建、Docker Compose(用于定义和运行多容器 Docker 应用)、数据卷的高级用法、网络模式、以及 Docker 生态系统中的其他工具。
现在,你已经具备了在 macOS 上进行容器化开发的基础能力。开始你的 Docker 之旅吧!