跳到主要内容
预计阅读 19 分钟

动手装好你的百宝箱 —— 安装Docker并运行你的第一个容器

千里之行始于足下。这一章我们不谈理论,直接撸起袖子把Docker装上,然后亲手启动你人生中的第一个容器。

📋 开篇自测:你已经知道多少?

  1. 你知道Docker Desktop和Docker Engine的区别吗?
  2. 你能说出至少两种验证Docker安装成功的方法吗?
  3. docker run hello-world 这条命令背后到底发生了什么?

一、Docker的两副面孔:Desktop与Engine

在安装之前,你需要先搞清楚一个经常让新手困惑的问题:我到底该装哪个?

Docker有两个主要的产品形态:

Docker Engine:这是Docker的核心引擎,纯命令行工具,没有图形界面。它直接运行在Linux上,就像一台汽车的发动机——动力十足,但你得自己来操控方向盘和换挡。生产服务器上通常用的就是它。

Docker Desktop:这是一个桌面应用程序,内置了Docker Engine以及一系列辅助工具,还有一个可视化的管理界面。它可以运行在macOS和Windows上。就像一辆自动挡的车——底下还是同一款发动机,但驾驶体验舒服多了。

如果你用的是macOS或Windows,装Docker Desktop就对了。如果你用的是Linux桌面或服务器,可以直接装Docker Engine。

还有一个小知识:macOS和Windows并不能原生运行Linux容器(因为容器直接依赖Linux内核)。Docker Desktop在底层悄悄帮你创建了一个轻量级的Linux虚拟机,容器实际上是跑在这个虚拟机里面的。作为使用者,你完全感知不到这一层,但了解这个事实有助于你理解后面可能遇到的一些性能和网络差异。

🤔 想一想 既然macOS上的Docker实际上是跑在一个Linux虚拟机里的,那么Docker Desktop号称的”启动快、占资源少”是不是打了折扣?跟直接在Linux上运行相比,确实是有一些性能差距的。你觉得这个Trade-off值不值得?


二、各平台安装指南

macOS安装

  1. 打开浏览器,访问 Docker Desktop官网

  2. 根据你的芯片类型选择对应的安装包:

    • Intel芯片的Mac:选择 “Mac with Intel chip”
    • Apple Silicon(M1/M2/M3/M4):选择 “Mac with Apple chip”

    不确定自己是哪种芯片?点击左上角的苹果图标,选”关于本机”就能看到。

  3. 下载完成后,双击 .dmg 文件,把Docker图标拖到Applications文件夹里

  4. 从启动台打开Docker,首次启动会要求你输入系统密码授权

  5. 等顶部菜单栏出现Docker的小鲸鱼图标并且状态显示”Running”,就说明安装成功了

也可以用Homebrew一条命令搞定:

brew install --cask docker

Windows安装

  1. 确认系统要求:Windows 10 64位(22H2 / Build 19045 及以上)或 Windows 11(23H2 / Build 22631 及以上)。使用 WSL 2 后端时需要 WSL 2.1.5 或更高版本

  2. 启用WSL 2(Windows Subsystem for Linux 2)。打开PowerShell(以管理员身份运行),执行:

    wsl --install

    执行完后需要重启电脑。

  3. 从Docker官网下载Docker Desktop for Windows安装包

  4. 双击安装包,按向导完成安装。确保勾选”Use WSL 2 instead of Hyper-V”

  5. 安装完成后启动Docker Desktop,等系统托盘的鲸鱼图标变绿色即可

Linux安装(以Ubuntu为例)

Linux上推荐用官方提供的安装脚本,简洁高效:

# 更新包索引
sudo apt-get update

# 安装必要的工具包
sudo apt-get install -y ca-certificates curl

# 添加Docker官方的GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 添加Docker软件源(使用DEB822格式)
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后,如果你不想每次都用sudo来运行docker命令,可以把当前用户添加到docker用户组:

sudo usermod -aG docker $USER

注意:执行这条命令后需要注销并重新登录才能生效。


三、确认安装成功

不管你用的是哪个平台,安装完成后都可以用以下命令来验证:

# 查看Docker版本信息
docker version

你应该能看到类似这样的输出:

Client:
 Version:           29.x.x
 API version:       1.x
 Go version:        go1.2x.x
 ...

Server:
 Engine:
  Version:          29.x.x
  ...

💡 提示:Docker Engine 的版本迭代较快,你看到的版本号可能与上面不同,以实际安装版本为准。

注意这里有Client和Server两部分。Docker采用的是客户端-服务器架构。你在终端里敲的docker命令是客户端,它通过API与后台运行的Docker守护进程(Server/Engine)通信。如果只看到Client的信息,没有Server,说明Docker引擎没有启动。

再来一个更直观的验证:

# 查看Docker系统信息
docker info

这会输出更详细的信息,包括容器数量、镜像数量、存储驱动类型等等。


四、你的第一个容器:Hello World

验证安装无误后,让我们来运行Docker世界的”Hello World”:

docker run hello-world

短暂等待后,你会看到一段友好的欢迎信息,大意是”恭喜你,Docker安装成功了”。

这条简单的命令背后,Docker其实做了一连串的事情。让我们像慢动作回放一样,一步步拆解:

第一步:解析命令。Docker客户端收到 run hello-world 指令,知道你想运行一个名为 hello-world 的镜像。

第二步:查找本地镜像。Docker在本地镜像仓库里搜索是否已经有hello-world这个镜像。因为是第一次运行,本地肯定没有。

第三步:拉取远程镜像。本地没找到,Docker就去Docker Hub(官方镜像仓库)上下载这个镜像。你会看到终端输出 Unable to find image 'hello-world:latest' locallyPulling from library/hello-world 这样的提示。

第四步:创建容器。镜像下载完成后,Docker基于这个镜像创建一个新的容器。

第五步:启动容器。容器创建好后立即启动,执行镜像中预设的命令——在这个例子里就是打印那段欢迎信息。

第六步:退出。命令执行完毕,容器自动停止。注意,容器停止不等于消失,它还在那里,只是不运行了。

整个过程就像你去图书馆借书:先在自己的书架上找(本地镜像),没有就去图书馆借一本回来(拉取镜像),然后坐下来阅读(启动容器),读完合上书(容器停止)。书还在你手边(容器仍然存在),只是你不再翻阅了。

来点更有趣的

hello-world只是打了个招呼就走了,太无聊了。让我们来点有意思的——启动一个交互式的Ubuntu容器:

docker run -it ubuntu bash

几秒钟后(可能需要先下载Ubuntu镜像),你会发现命令行提示符变了!你已经”进入”了一个全新的Ubuntu系统。试试这些命令:

# 看看当前系统版本
cat /etc/os-release

# 查看当前用户(你会发现自己是root)
whoami

# 列出根目录
ls /

# 安装一个小工具试试
apt-get update && apt-get install -y cowsay
/usr/games/cowsay "Docker is awesome!"

玩够了之后,输入 exit 退出容器。你回到了自己的终端。刚才那个Ubuntu容器里安装的cowsay?它不会影响你的宿主机系统一丝一毫。这就是隔离性的魅力。

让我们再试一个实用的例子——用Nginx容器启动一个Web服务器:

docker run -d -p 8080:80 --name my-nginx nginx

这条命令多了几个新参数:

  • -d:后台运行(detach模式),不会占用你的终端
  • -p 8080:80:把容器的80端口映射到宿主机的8080端口
  • --name my-nginx:给容器起个名字,方便后续操作
  • nginx:使用Nginx官方镜像

现在打开浏览器,访问 http://localhost:8080,你应该能看到Nginx的欢迎页面。一个Web服务器就这么跑起来了,没有下载安装包,没有改配置文件,没有重启任何服务。

用完之后清理掉:

# 停止容器
docker stop my-nginx

# 删除容器
docker rm my-nginx

⚠️ 常见误区

  • 误区一:“容器退出就消失了”。不是的!容器停止后仍然存在,占用磁盘空间。需要手动 docker rm 删除,或者在运行时加上 --rm 参数让它退出后自动删除。
  • 误区二:“每次docker run都是同一个容器”。每次 docker run 都会创建一个全新的容器。如果你想重新启动一个已停止的容器,应该用 docker start
  • 误区三:“装了Docker就能跑Windows容器”。默认情况下Docker运行的是Linux容器。Windows容器是另一套东西,需要Windows操作系统支持,而且生态远没有Linux容器成熟。

五、Docker基础命令速览

在后续章节中我们会深入每个命令,但现在你可以先认识几个最常用的:

# 查看本地已有的镜像
docker images

# 查看正在运行的容器
docker ps

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

# 从Docker Hub拉取镜像
docker pull nginx

# 运行容器
docker run [选项] 镜像名

# 停止容器
docker stop 容器名或ID

# 启动已停止的容器
docker start 容器名或ID

# 删除容器
docker rm 容器名或ID

# 删除镜像
docker rmi 镜像名或ID

# 查看容器日志
docker logs 容器名或ID

# 进入正在运行的容器
docker exec -it 容器名或ID bash

这些命令就像你学开车时的基本操作:启动、加速、刹车、倒车。先记住它们的大致用途,后面的章节会一个个详细拆解。

一个实用技巧:命令自动补全

如果你用的是bash或zsh,Docker支持命令行自动补全。在macOS上Docker Desktop会自动配置好,在Linux上可能需要手动设置:

# bash用户
sudo curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker

# zsh用户
mkdir -p ~/.zsh/completion
curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/zsh/_docker -o ~/.zsh/completion/_docker

配置好之后,输入 docker 然后按Tab键,就能看到所有可用的子命令了。这个小技巧能帮你省不少查文档的时间。

🤔 想一想 你刚才运行了Ubuntu容器,在里面安装了cowsay。退出后再次 docker run -it ubuntu bash,你会发现cowsay不见了。为什么?(提示:每次 docker run 都会创建新容器)


六、安装过程中的常见问题

即使Docker的安装过程已经非常简化了,你仍然可能遇到一些问题。这里列出最常见的几个:

问题一:权限不足(Linux)

Got permission denied while trying to connect to the Docker daemon socket

解决:把用户加入docker组 sudo usermod -aG docker $USER,然后重新登录。

问题二:WSL 2相关错误(Windows)

WSL 2 installation is incomplete

解决:打开PowerShell(管理员),运行 wsl --update,然后重启。

问题三:网络问题导致镜像拉取失败

Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

解决:配置镜像加速器。在Docker Desktop的Settings -> Docker Engine中添加可用的镜像源地址:

{
  "registry-mirrors": ["https://你的镜像加速地址"]
}

💡 提示:国内 Docker Hub 镜像加速服务变动频繁,阿里云、腾讯云等曾经稳定的加速地址可能已停止服务或限制访问。建议搜索”Docker 国内镜像加速 + 当前年份”获取最新可用的镜像源列表。部分云服务商仍为自家云主机用户提供内网加速服务,可查阅对应云服务商的文档。

问题四:磁盘空间不足 Docker镜像和容器会占用不少磁盘空间。如果空间紧张,可以定期清理:

# 清理所有停止的容器、未使用的网络、悬空的镜像和构建缓存
docker system prune

📝 掌握度自测

  1. Docker Desktop和Docker Engine的主要区别是什么?在macOS上为什么Docker需要额外创建一个Linux虚拟机?

  2. 请描述 docker run hello-world 背后的完整执行流程(至少说出4个步骤)。

  3. docker rundocker start 的区别是什么?什么时候用前者,什么时候用后者?

  4. 在运行 docker run -d -p 8080:80 nginx 时,-d-p 8080:80 分别是什么意思?

  5. 你在一个容器里安装了一些软件,退出容器后再次 docker run 同一个镜像,之前安装的软件还在吗?为什么?

💡 自我评估

  • 全部答对:你已经迈出了Docker实操的第一步,环境已经就绪,可以开始探索更深入的概念了。
  • 答对3-4题:很好的开始!建议把答错的部分对应的命令实际跑一遍加深理解。
  • 答对1-2题:别担心,Docker的命令在实践中会越用越熟。建议你多动手试试本章提到的那些命令。

购买课程解锁全部内容

告别「在我电脑上能跑」:Docker 容器化实战

¥29.90