Docker 基础概念、安装与命令速查
Docker 是一个开源的容器化平台。学习路径见 运维导读。它允许开发者将应用程序及其所有依赖(代码、运行时、库、配置文件等)打包成一个轻量级、可移植的容器,从而在任何支持 Docker 的环境中一致运行——「一次构建,到处运行」。
一、核心组件
| 组件 | 说明 |
|---|---|
| 镜像(Image) | 只读模板,包含运行应用所需的一切(操作系统层、代码、环境变量、启动命令)。类似于「类」或「安装包」。 |
| 容器(Container) | 镜像的运行实例,是一个隔离的进程空间。可以被创建、启动、停止、删除。类似于「对象」。 |
| 仓库(Repository) | 存储和分发镜像的地方。公共仓库如 Docker Hub,私有仓库如 Harbor。 |
| Docker 引擎(Engine) | 服务端守护进程(dockerd)+ REST API + 客户端(docker CLI)。负责管理容器、镜像、网络等。 |
| Registry | 镜像仓库服务,Docker Hub 是默认公共 Registry,一个 Registry 内可有多个 Repository。 |
二、Docker 架构:Client-Server 模型
Docker 采用客户端-服务端架构:
docker CLI(客户端)
│ REST API(通常经 Unix Socket 或 TCP)
▼
dockerd(守护进程,服务端)
│
├── containerd(容器生命周期管理)
│ └── runc(OCI 标准运行时,实际创建容器进程)
├── 镜像管理、构建(BuildKit)
└── 网络、数据卷管理
- 日常执行的
docker run、docker build等命令,本质上是客户端向dockerd发送 API 请求。 - 客户端和服务端可以在同一台机器,也可以通过
DOCKER_HOST指向远程 Docker 主机。 containerd与runc是 CNCF 下的独立项目,Docker 只是其中一种发行方式;Kubernetes 也可以直接使用containerd而不依赖完整的 Docker Engine。
三、底层原理:容器为什么这么轻量
容器并不是虚拟机,它复用宿主机内核,依赖 Linux 的几项核心机制:
| 机制 | 作用 |
|---|---|
| Namespace(命名空间) | 隔离视图:PID(进程号)、NET(网络)、MNT(挂载点)、UTS(主机名)、IPC、USER 等,让容器「看起来」像一个独立系统。 |
| Cgroups(控制组) | 限制资源:CPU、内存、磁盘 I/O、网络带宽,防止单个容器耗尽宿主机资源(对应 docker run 的 --memory、--cpus 等参数)。 |
| 联合文件系统(UnionFS / OverlayFS) | 将镜像的多个只读层与容器的一层可写层叠加挂载,多个容器可共享同一批底层镜像层,磁盘占用和启动速度都大幅优化。 |
镜像本身由若干**分层(Layer)**组成,每一条 Dockerfile 指令通常生成一层,层与层之间共享缓存,这也是 Dockerfile 构建 能够利用缓存加速的原因。
四、镜像与容器的关系
- 镜像 →
docker run→ 容器- 镜像定义了容器的「内容和配置」,容器是镜像的一个可写副本(在只读镜像层之上叠加一层可写层)。
- 同一个镜像可以启动多个容器,它们相互隔离,互不影响。
- 容器被删除后,其状态(写入的文件)通常丢失,除非使用数据卷(Volume)持久化,详见 容器、数据与网络。
五、Docker 与虚拟机的区别
| 特性 | Docker 容器 | 传统虚拟机(VM) |
|---|---|---|
| 内核 | 共享宿主机内核(Linux 容器需 Linux 宿主机) | 每个 VM 包含完整的 Guest OS(独立内核) |
| 启动速度 | 秒级(甚至毫秒级) | 分钟级(需引导操作系统) |
| 资源占用 | 轻量(只包含应用及其依赖,通常几十 MB) | 重量(每个 VM 占用数 GB 磁盘和内存) |
| 隔离级别 | 进程级隔离(Namespace + Cgroups) | 硬件级虚拟化(Hypervisor,完全隔离) |
| 性能 | 接近原生(几乎没有虚拟化开销) | 有一定性能损耗(Hypervisor 转换) |
| 迁移/复制 | 迁移镜像(分层存储,高效) | 复制整个 VM 镜像(体积大) |
总结:Docker 容器更轻、更快、更节省资源,适用于微服务、持续集成、弹性伸缩等场景;虚拟机提供更强的隔离和安全性,适合多租户、异构操作系统等场景。两者也可以组合使用(如在云主机 VM 中运行多个容器)。
六、Docker 工作流简图
Dockerfile (构建指令)
↓ docker build
镜像 (Image)
↓ docker run
容器 (Container)
↓ docker push / pull
仓库 (Registry)
理解这些核心概念,是学习 Docker 命令和编排工具(如 Docker Compose、Kubernetes)的基础。
七、安装与配置
1. Windows / macOS
- 下载 Docker Desktop(https://www.docker.com/products/docker-desktop/)。
- 运行安装程序,按向导完成安装(Windows 可能需要启用 WSL 2 或 Hyper-V;Apple Silicon 与 Intel 芯片各有对应安装包)。
- 安装后启动 Docker Desktop,任务栏/菜单栏出现 Docker 图标即表示运行中,Docker Desktop 已自带
docker compose(v2,无需再单独安装docker-compose)。
2. Linux(Ubuntu / Debian)
生产环境建议按 Docker 官方安装文档 使用 docker-ce 仓库;以下为常见 docker.io 包方式(版本可能略旧,仅适合快速体验):
sudo apt update
sudo apt install docker.io -y
# 启动 Docker 服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户加入 docker 组(避免每次输入 sudo)
sudo usermod -aG docker $USER
# 重新登录或执行 newgrp docker 使组生效
若使用官方 docker-ce 仓库安装,还会附带 docker-compose-plugin(即 docker compose 子命令)与 docker-buildx-plugin。
3. 验证安装
docker --version
# 示例输出:Docker version 24.0.7, build afdd53b
docker info
# 查看服务端详细信息:存储驱动、Cgroup 版本、根目录等
docker run hello-world
# 拉取并运行测试镜像,输出欢迎信息即表示安装成功
4. 配置镜像加速(国内推荐)
由于网络原因,从 Docker Hub 拉取镜像可能较慢。可配置国内镜像加速器(以 Linux 为例)。
- 创建或修改
/etc/docker/daemon.json(需要 sudo 权限):bashsudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] } EOF - 重启 Docker 服务:bash
sudo systemctl restart docker - 验证配置是否生效:bash
docker info | grep -A 1 "Registry Mirrors"
说明:
- Windows / macOS 用户:打开 Docker Desktop 设置 → Docker Engine,在 JSON 配置中添加
"registry-mirrors"数组,然后点击「Apply & Restart」。- 镜像加速地址会随时间失效,建议使用前先测试可用性;无法访问时可考虑改用
docker pull配合代理,或使用自建/云厂商镜像仓库。
完成上述步骤后,即可正常使用 Docker 拉取镜像和运行容器。
八、常用命令速查表
下表汇总了 Docker 最常用的命令,涵盖镜像、容器、网络、构建及清理等操作,日常开发基本够用。
| 操作 | 命令 | 说明 |
|---|---|---|
| 拉取镜像 | docker pull <image> | 从仓库下载镜像(默认 Docker Hub),可指定标签如 nginx:1.25 |
| 列出镜像 | docker images | 显示本地所有镜像,包含仓库、标签、ID、大小等 |
| 删除镜像 | docker rmi <image> | 删除本地镜像,可用镜像名或 ID;-f 强制删除 |
| 运行容器 | docker run -d --name <name> -p 8080:80 <image> | 创建并启动容器,-d 后台,--name 命名,-p 端口映射 |
| 查看运行中容器 | docker ps | 只显示正在运行的容器 |
| 查看所有容器 | docker ps -a | 显示所有容器,包括已停止的 |
| 停止容器 | docker stop <name> | 优雅停止运行中的容器(发送 SIGTERM) |
| 启动容器 | docker start <name> | 启动已停止的容器 |
| 删除容器 | docker rm <name> | 删除已停止的容器;-f 强制删除运行中的 |
| 进入容器 | docker exec -it <name> /bin/bash | 在运行中的容器内启动交互式 shell(或用 /bin/sh) |
| 查看日志 | docker logs -f <name> | 跟踪容器日志输出,-f 实时刷新,可加 --tail 限制行数 |
| 复制文件 | docker cp <src> <dest> | 在宿主机和容器之间复制文件或目录 |
| 创建网络 | docker network create <net> | 创建自定义桥接网络,便于容器间通过容器名通信 |
| 构建镜像 | docker build -t <name>:tag . | 根据当前目录的 Dockerfile 构建镜像,-t 指定名称和标签 |
| 清理悬空资源 | docker system prune | 删除所有未使用的容器、网络、悬空镜像和构建缓存(需确认) |
进阶命令(扩展)
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看资源占用 | docker stats | 实时查看所有容器的 CPU、内存、网络、I/O 使用情况 |
| 查看磁盘占用 | docker system df | 按镜像/容器/卷/构建缓存汇总磁盘占用 |
| 登录/登出仓库 | docker login / docker logout | 登录 Docker Hub 或私有 Registry 后才能 push |
| 导出/导入镜像 | docker save -o app.tar <image> / docker load -i app.tar | 离线迁移镜像(不经过 Registry) |
| 导出/导入容器 | docker export <name> > app.tar / docker import app.tar | 导出容器文件系统为一层新镜像(丢失历史层与元数据) |
| 查看文件变化 | docker diff <name> | 列出容器相对镜像新增、修改、删除的文件 |
| 挂接标准输入输出 | docker attach <name> | 挂接到容器主进程的终端(Ctrl+P Ctrl+Q 安全退出,避免终止容器) |
| 暂停/恢复容器 | docker pause <name> / docker unpause <name> | 冻结容器内所有进程(基于 cgroup freezer),常用于临时让出资源 |
| 强制终止 | docker kill <name> | 立即发送 SIGKILL,不等待优雅退出 |
| 动态调整资源 | docker update --memory 512m <name> | 运行时调整容器的 CPU/内存限制,无需重建容器 |
| 查看事件流 | docker events | 实时输出 Docker 守护进程的事件(创建、启动、销毁等),便于监控与调试 |
| 切换 Docker 上下文 | docker context ls / docker context use <name> | 管理多个 Docker 守护进程连接(本地、远程、云端) |
提示:
- 许多命令支持使用容器名或容器 ID(可用前几位唯一前缀)。
- 使用
--help查看每个命令的详细选项,如docker run --help。- 清理前建议用
docker system df查看磁盘占用情况,docker system prune -a会额外清理未被任何容器引用的镜像,请谨慎使用。
九、小结
- Docker 通过 Namespace 隔离视图、Cgroups 限制资源、联合文件系统实现分层存储,从而做到「秒级启动、几十 MB 占用」。
- 客户端-服务端架构(
dockerCLI ↔dockerd↔containerd/runc)是理解 Docker 命令背后发生了什么的关键。 - 安装完成后优先配置镜像加速,再通过命令速查表覆盖日常的镜像、容器、网络、清理操作。
- 后续深入内容见 镜像与 Dockerfile、容器、数据与网络、Docker Compose。
参考文献
| 资料 | 说明 |
|---|---|
| Docker 概览 | 官方 |
| Docker 命令参考 | 官方 CLI 手册 |
| Docker Engine 安装 | 各平台安装指南 |
| 运维导读 | 本目录路径 |
相关文章
Docker Compose 编排
Docker Compose 是定义和运行多容器 Docker 应用的工具,通过一个 compose.yml 文件即可管理 Web、数据库、缓存等多个服务。本文覆盖安装、完整字段说明、多服务示例、常用指令与常见排错。
镜像与 Dockerfile
镜像(Image)是 Docker 容器的只读模板,Dockerfile 则是构建镜像的蓝图。本文完整覆盖镜像的搜索、拉取、查看、删除、打标签、推送,以及 Dockerfile 常用指令、多阶段构建与体积优化技巧。
容器、数据与网络
容器是镜像的运行实例,掌握容器的创建、管理、日志查看,配合数据卷持久化与自定义网络通信,是使用 Docker 的日常核心,也是生产部署前必须掌握的三大基础能力。
运维与协作导读
本目录覆盖日常开发运维中的 Git 版本控制、Docker 容器化与 Nginx 服务网关,与 工程化 · Git、部署相关 等章节互补,提供完整的十阶段学习路径。
后端入门概览
本目录覆盖 JavaScript/TypeScript 服务端运行时与框架、数据存储,以及 Rust 系统编程入门,提供从零到部署的完整学习路径。前置建议:JavaScript 基础、工程化 · 环境变量。
Bun 基础与核心命令
Bun 是用 Zig 编写的 JavaScript 运行时,内置包管理(bun install)、打包(bun build)、测试(bun test)等,并持续兼容 Node.js API。本文介绍核心特点、安装方式,以及日常最常用的命令与包管理功能。见 运行时对比。
Series
docker
3 / 4