FORMA

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 采用客户端-服务端架构:

text
docker CLI(客户端)
   │  REST API(通常经 Unix Socket 或 TCP)
   ▼
dockerd(守护进程,服务端)
   │
   ├── containerd(容器生命周期管理)
   │      └── runc(OCI 标准运行时,实际创建容器进程)
   ├── 镜像管理、构建(BuildKit)
   └── 网络、数据卷管理
  • 日常执行的 docker rundocker build 等命令,本质上是客户端向 dockerd 发送 API 请求。
  • 客户端和服务端可以在同一台机器,也可以通过 DOCKER_HOST 指向远程 Docker 主机。
  • containerdrunc 是 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 工作流简图

text
Dockerfile (构建指令)
   ↓ docker build
镜像 (Image)
   ↓ docker run
容器 (Container)
   ↓ docker push / pull
仓库 (Registry)

理解这些核心概念,是学习 Docker 命令和编排工具(如 Docker Compose、Kubernetes)的基础。

七、安装与配置

1. Windows / macOS

  • 下载 Docker Desktophttps://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 包方式(版本可能略旧,仅适合快速体验):

bash
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. 验证安装

bash
docker --version
# 示例输出:Docker version 24.0.7, build afdd53b

docker info
# 查看服务端详细信息:存储驱动、Cgroup 版本、根目录等

docker run hello-world
# 拉取并运行测试镜像,输出欢迎信息即表示安装成功

4. 配置镜像加速(国内推荐)

由于网络原因,从 Docker Hub 拉取镜像可能较慢。可配置国内镜像加速器(以 Linux 为例)。

  1. 创建或修改 /etc/docker/daemon.json(需要 sudo 权限):
    bash
    sudo 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
    
  2. 重启 Docker 服务
    bash
    sudo systemctl restart docker
    
  3. 验证配置是否生效
    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 占用」。
  • 客户端-服务端架构(docker CLI ↔ dockerdcontainerd/runc)是理解 Docker 命令背后发生了什么的关键。
  • 安装完成后优先配置镜像加速,再通过命令速查表覆盖日常的镜像、容器、网络、清理操作。
  • 后续深入内容见 镜像与 Dockerfile容器、数据与网络Docker Compose

参考文献

资料说明
Docker 概览官方
Docker 命令参考官方 CLI 手册
Docker Engine 安装各平台安装指南
运维导读本目录路径

相关文章