基础 从零开始理解容器技术,亲手安装Docker环境
在容器出现之前,应用部署面临三大痛点:
容器技术的核心思想:将应用及其所有依赖打包成一个标准化单元,确保在任何环境都能一致运行。
| 对比维度 | 虚拟机 | 容器 |
|---|---|---|
| 启动时间 | 分钟级 | 秒级(甚至毫秒级) |
| 磁盘占用 | GB级(含Guest OS) | MB级(共享Host内核) |
| 性能 | 有虚拟化损耗 | 接近原生 |
| 隔离性 | 强(硬件级隔离) | 中(进程级隔离) |
| 密度 | 每主机几个~十几个 | 每主机几十~几百个 |
| 镜像构建 | 慢,需安装OS | 快,分层复用 |
Docker容器并非魔法,它依赖Linux内核的三大核心技术:
Namespaces为容器提供隔离的视图,让每个容器以为自己独占系统:
| Namespace | 隔离内容 | 说明 |
|---|---|---|
| PID | 进程ID | 容器内PID 1是自己的init进程 |
| NET | 网络栈 | 独立的网络接口、IP、端口 |
| MNT | 文件系统挂载点 | 独立的文件系统视图 |
| UTS | 主机名和域名 | 容器有自己的hostname |
| IPC | 进程间通信 | 独立的信号量、共享内存 |
| USER | 用户和用户组 | 容器内root可映射为宿主普通用户 |
Cgroups限制容器可使用的系统资源:
UnionFS将多个只读层叠加为一个统一的文件系统视图,这是Docker镜像分层存储的基础:
# 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
# 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
默认情况下,只有root用户和docker组用户可以运行Docker命令。将当前用户加入docker组:
# 创建docker组(通常已存在)
sudo groupadd docker
# 将当前用户加入docker组
sudo usermod -aG docker $USER
# 使组变更立即生效
newgrp docker
# 验证:无需sudo运行 ✅
docker run hello-world
# 查看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采用Client-Server架构:
| 组件 | 作用 | 说明 |
|---|---|---|
| Docker Client | 命令行工具 | 用户与Docker交互的入口,发送命令给daemon |
| Docker Daemon | 后台服务 | 管理镜像、容器、网络、卷等Docker对象 |
| containerd | 容器运行时管理 | 负责镜像拉取、容器执行和监控 |
| runc | OCI容器运行时 | 实际创建和运行容器的底层工具 |
| Docker Registry | 镜像仓库 | 存储和分发Docker镜像(如Docker Hub) |
国内访问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"
registry-mirrors:镜像加速地址,优先从镜像拉取log-opts:日志大小限制,防止磁盘被日志撑满storage-driver: overlay2:推荐存储驱动,性能最优# 系统信息
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 Desktop有什么区别?Docker Engine是Linux上的核心运行时,开源免费。Docker Desktop是面向Mac/Windows的集成开发环境,包含Docker Engine加上GUI和额外工具,个人免费但大型企业需付费许可。
❓ 容器安全吗?进程隔离够用吗?容器提供的是进程级隔离,安全性低于虚拟机的硬件级隔离。但对于大多数应用场景已经足够。生产环境中建议:①不要在容器内运行特权进程 ②使用USER指令指定非root用户 ③启用用户命名空间 ④使用Seccomp/AppArmor限制系统调用。
❓ 安装后报错"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成本很低。
下一课:我们将创建自己的第一个容器,体验容器的秒级启动!