📘 第01课:容器概念与安装

基础 从零开始理解容器技术,亲手安装Docker环境

🤔 为什么需要容器?

在容器出现之前,应用部署面临三大痛点:

容器技术的核心思想:将应用及其所有依赖打包成一个标准化单元,确保在任何环境都能一致运行。

📦 容器 vs 虚拟机

┌─────────────────────────────────────────────────────────┐ │ 虚拟机架构 │ ├──────────────┬──────────────┬──────────────┤ App A App B App C Bins/Libs Bins/Libs Bins/Libs Guest OS Guest OS Guest OS ├──────────────┼──────────────┼──────────────┤ Hypervisor ├─────────────────────────────────────────────────────────┤ Host OS (宿主机) ├─────────────────────────────────────────────────────────┤ Infrastructure (硬件) └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 容器架构 │ ├──────────────┬──────────────┬──────────────┤ App A App B App C Bins/Libs Bins/Libs Bins/Libs ├──────────────┼──────────────┼──────────────┤ Docker Engine ├─────────────────────────────────────────────────────────┤ Host OS (宿主机) ├─────────────────────────────────────────────────────────┤ Infrastructure (硬件) └─────────────────────────────────────────────────────────┘
对比维度虚拟机容器
启动时间分钟级秒级(甚至毫秒级)
磁盘占用GB级(含Guest OS)MB级(共享Host内核)
性能有虚拟化损耗接近原生
隔离性强(硬件级隔离)中(进程级隔离)
密度每主机几个~十几个每主机几十~几百个
镜像构建慢,需安装OS快,分层复用

🔬 容器技术的底层原理

Docker容器并非魔法,它依赖Linux内核的三大核心技术:

1. Namespaces(命名空间)—— 看到"什么"

Namespaces为容器提供隔离的视图,让每个容器以为自己独占系统:

Namespace隔离内容说明
PID进程ID容器内PID 1是自己的init进程
NET网络栈独立的网络接口、IP、端口
MNT文件系统挂载点独立的文件系统视图
UTS主机名和域名容器有自己的hostname
IPC进程间通信独立的信号量、共享内存
USER用户和用户组容器内root可映射为宿主普通用户

2. Cgroups(控制组)—— 能用"多少"

Cgroups限制容器可使用的系统资源:

3. UnionFS(联合文件系统)—— 怎么"存"

UnionFS将多个只读层叠加为一个统一的文件系统视图,这是Docker镜像分层存储的基础:

┌─────────────────────────────────┐ 可写层(Container Layer) ← 容器运行时的修改写在这里 ├─────────────────────────────────┤ Image Layer 3: 应用代码 ← 只读 ├─────────────────────────────────┤ Image Layer 2: 依赖包 ← 只读 ├─────────────────────────────────┤ Image Layer 1: 基础OS ← 只读 ├─────────────────────────────────┤ 宿主机文件系统 └─────────────────────────────────┘

🛠️ Docker安装

Ubuntu/Debian安装

# 1. 更新包索引
sudo apt-get update

# 2. 安装依赖
sudo apt-get install -y ca-certificates curl gnupg

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

# 4. 添加Docker仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

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

# 6. 验证安装 ✅
docker --version
Docker version 29.1.3, build 29.1.3-0ubuntu3~24.04.2

# 7. 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

CentOS/RHEL安装

# 1. 安装依赖
sudo yum install -y yum-utils

# 2. 添加Docker仓库
sudo yum-config-manager --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo

# 3. 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 4. 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 5. 验证 ✅
docker --version

👤 免sudo使用Docker

默认情况下,只有root用户和docker组用户可以运行Docker命令。将当前用户加入docker组:

# 创建docker组(通常已存在)
sudo groupadd docker

# 将当前用户加入docker组
sudo usermod -aG docker $USER

# 使组变更立即生效
newgrp docker

# 验证:无需sudo运行 ✅
docker run hello-world
⚠️ 安全提醒:docker组等同于root权限!加入docker组的用户可以通过容器挂载获得宿主机root权限。生产环境中请严格控制docker组成员。

🧪 验证Docker安装

# 查看Docker版本 ✅
docker version

Client: Docker Engine - Community
 Version:           29.1.3
 API version:       1.49
 Go version:        go1.23.7
 Git commit:        29.1.3-0ubuntu3~24.04.2
 Built:             Thu Mar  6 17:48:56 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          29.1.3
  API version:      1.49 (minimum version 1.24)
  Go version:       go1.23.7

# 查看Docker系统信息 ✅
docker info

# 运行hello-world测试容器 ✅
docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

🔧 Docker架构详解

Docker采用Client-Server架构:

┌──────────────────────────────────────────────────────────────┐ │ Docker 架构 │ │ │ ┌──────────────┐ REST API ┌──────────────────────────┐ │ Docker CLI │ ───────────▶ │ Docker Daemon (dockerd) │ │ (客户端) │ │ (服务端) │ └──────────────┘ │ │ │ ┌─────────┐ ┌─────────┐│ ┌──────────────┐ │ │Container│ │ Image ││ │ Docker SDK │ ───────────▶ │ │Management│ │Management││ │ (编程接口) │ │ └─────────┘ └─────────┘│ │ │ │ ┌──────────────────────┐│ │ │ containerd ││ │ │ (容器运行时管理) ││ │ └──────────┬───────────┘│ │ │runc │ │ ┌──────────▼───────────┐│ │ │ runc ││ │ │ (OCI容器运行时) ││ └──────────────────────────┘ └──────────────────────────────────────────────────────────────┘ ┌────────────────────┐ ┌────────────────────┐ │ Docker Registry │ │ Docker Registry │ │ (Docker Hub) │ │ (私有仓库) │ │ 公共镜像存储 │ │ 企业内部镜像存储 │ └────────────────────┘ └────────────────────┘

核心组件说明

组件作用说明
Docker Client命令行工具用户与Docker交互的入口,发送命令给daemon
Docker Daemon后台服务管理镜像、容器、网络、卷等Docker对象
containerd容器运行时管理负责镜像拉取、容器执行和监控
runcOCI容器运行时实际创建和运行容器的底层工具
Docker Registry镜像仓库存储和分发Docker镜像(如Docker Hub)

⚙️ Docker配置与镜像加速

国内访问Docker Hub可能很慢,配置镜像加速器:

# 创建或编辑Docker配置文件
sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://registry.docker-cn.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
EOF

# 重载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置 ✅
docker info | grep -A 5 "Registry Mirrors"
💡 配置说明

📋 常用Docker命令速查

# 系统信息
docker version            # 查看版本 ✅
docker info               # 查看系统信息 ✅
docker system df          # 查看磁盘使用 ✅

# 镜像操作
docker images             # 列出本地镜像
docker pull <image>       # 拉取镜像
docker rmi <image>        # 删除镜像

# 容器操作
docker ps                 # 列出运行中容器
docker ps -a              # 列出所有容器
docker run <image>        # 创建并运行容器
docker stop <container>   # 停止容器
docker rm <container>     # 删除容器

# 清理
docker system prune       # 清理未使用资源
docker system prune -a    # 清理所有未使用资源(含镜像)

🌍 Docker生态系统

Docker 生态系统 ┌───────────────┼───────────────┐ 开发工具 运行平台 编排调度 ┌───┴───┐ ┌───┴───┐ ┌───┴────┐ │Docker │ │Docker │ │K8s │ │Desktop│ │Engine │ │ │ └───────┘ └───────┘ └───────┘ ┌───┴───┐ ┌───┴───┐ ┌───┴────┐ │VS Code│ │Docker │ │Docker │ │Ext │ │Swarm │ │Compose│ └───────┘ └───────┘ └───────┘

❓ 常见问题

❓ Docker和Docker Desktop有什么区别? Docker Engine是Linux上的核心运行时,开源免费。Docker Desktop是面向Mac/Windows的集成开发环境,包含Docker Engine加上GUI和额外工具,个人免费但大型企业需付费许可。
❓ 容器安全吗?进程隔离够用吗? 容器提供的是进程级隔离,安全性低于虚拟机的硬件级隔离。但对于大多数应用场景已经足够。生产环境中建议:①不要在容器内运行特权进程 ②使用USER指令指定非root用户 ③启用用户命名空间 ④使用Seccomp/AppArmor限制系统调用。
❓ WSL2中能用Docker吗? 可以!Windows上推荐使用Docker Desktop + WSL2后端,性能接近原生Linux。也可以在WSL2中直接安装Docker Engine。
❓ 安装后报错"Cannot connect to the Docker daemon"怎么办? 检查:①Docker服务是否启动:sudo systemctl start docker ②当前用户是否在docker组:groups $USER ③加入后是否执行了newgrp docker或重新登录。
❓ Docker和Podman有什么区别? Podman是Red Hat推出的Docker替代品,主要区别:①无需daemon运行 ②支持rootless容器(更安全) ③CLI兼容Docker ④不支持docker-compose(但支持podman-compose)。学习Docker后迁移Podman成本很低。

🏆 第01课成就

下一课:我们将创建自己的第一个容器,体验容器的秒级启动!