文章目录
- 前言
- 理论部分
-
- 1_发展与简介
-
- 1.1_云服务与虚拟化基础
-
- [① 云服务模型介绍](#① 云服务模型介绍)
- [② 虚拟化技术概述](#② 虚拟化技术概述)
- [③ 虚拟化产品](#③ 虚拟化产品)
- 1.2_Docker简介及其重要性
-
- [① 为什么使用 Docker?](#① 为什么使用 Docker?)
- [② Docker 发展历史(关键节点)](#② Docker 发展历史(关键节点))
- [③ Docker 版本:CE vs EE](#③ Docker 版本:CE vs EE)
- [④ Docker 与传统虚拟化区别](#④ Docker 与传统虚拟化区别)
- [⑤ 容器化技术生态系统](#⑤ 容器化技术生态系统)
- [⑥ Docker 核心优势](#⑥ Docker 核心优势)
- [⑦ 应用场景](#⑦ 应用场景)
- 1.3_Docker基础概念
-
- [① Logo 寓意](#① Logo 寓意)
- [② Linux 六大命名空间(Namespace)](#② Linux 六大命名空间(Namespace))
- [③ Docker 架构组件](#③ Docker 架构组件)
- [④ 核心技术](#④ 核心技术)
- [⑤ 核心概念](#⑤ 核心概念)
- 2_容器管理
- 实验部分
-
- [1_Docker 安装与配置](#1_Docker 安装与配置)
-
- [1.1_安装 Docker CE](#1.1_安装 Docker CE)
- 1.2_配置镜像加速器
- 2_镜像操作实验
- 3_容器操作实验
- 结语
- 扩展
前言
本文档聚焦 Docker 发展与简介 和 Docker 容器管理 两大核心章节,系统梳理容器化技术的演进背景、核心概念、镜像与容器操作命令及其实验流程。内容严格遵循"理论+实操"结构,保留所有关键命令、配置路径、端口号及操作细节,便于教学与后期查阅。
- 云服务
- 云服务(基础设施IaaS、平台PaaS、软件DaaS、数据DaaS)
- 云厂商:阿里云、腾讯云、华为云、Google云、AWS云,百度云、西部数码、天翼云。
- 虚拟化
- 虚拟化架构:全虚拟化、半虚拟化;裸金属虚拟化、宿主型虚拟化。
- 虚拟化产品:VMware、Openstack、KVM、VirtualBox、Hyper-V
- 实现IaaS服务的核心技术(但并非IaaS本身)
- 容器
- 轻量级
- 多台主机上可以在同环境上运行
- 实现PaaS服务的核心技术(但并非PaaS本身)
- 容器和虚拟化的区别
- 虚拟机安装完整操作系统,占用资源大,启动比较慢。
- 容器共享宿主机内核,只包含应用和依赖关系,占用资源小,启动快。
- 日常使用的容器产品
- Docker
- Podman
- Kubernetes
- Containerd/CRI-O
- OpenShift
- 容器技术的使用场景
- 云原生
- 混合云
- 微服务
- Docker概述(logo)
- 大鲸鱼:代表宿主机
- 集装箱:隔离出来的容器
- Docker版本
- 社区版(CE)
- 企业版(EE)
- Docker六大命名空间
- 挂载点隔离
- 网络隔离
- 进程ID隔离
- 进程通信隔离
- 用户/组隔离
- 主机名/域名隔离
- Docker架构与组件
- Docker Daemon:后台服务进程(
dockerd)。 - Client:命令行工具(
docker),与 Daemon 通信。 - Images:只读模板,用于创建容器。
- Registry:镜像仓库(如 Docker Hub)。
- Container:镜像的运行实例。
- Docker Daemon:后台服务进程(
- Docker核心技术
- Namespace:实现资源隔离。
- Cgroup:实现 CPU、内存等资源限制。
- Copy-on-Write (CoW):基于 UnionFS 的高效文件操作。
- 核心概念
- 镜像(Image):应用模板。
- 容器(Container):运行实例
- 仓库(Repository):存放镜像的地方。
- Docker管理命令:pull(拉取镜像)、push(上传镜像)、rmi(删除镜像)、(删除容器下节内容)、tag(标签)、image(查看镜像)、save(导出镜像)、load(导入镜像)、info(Docker系统信息)、--version(版本信息)
什么有人称 Docker 为"虚拟化"?
在广义语境下,"虚拟化"有时被泛化为"资源抽象与隔离",于是:
- 硬件虚拟化(Hardware Virtualization):VMware、KVM
- 操作系统虚拟化(OS-level Virtualization):Docker、LXC、Solaris Zones
- 应用虚拟化 :Java VM、.NET CLR(更抽象)
但这些只是术语分类,技术实现方式完全不同。
理论部分
1_发展与简介
Docker 是一种开源的容器化平台,通过将应用程序及其依赖打包为标准化单元(容器),实现"一次构建,到处运行"的部署目标。
1.1_云服务与虚拟化基础
① 云服务模型介绍
云计算按服务层级分为四类:
- IaaS(基础设施即服务):提供虚拟机、存储、网络等底层资源(如 AWS EC2)。用户需自行安装 OS 和应用。
- PaaS(平台即服务):提供开发和运行环境(如 Heroku),开发者只需关注代码。
- SaaS(软件即服务):直接使用云端软件(如 Gmail),无需维护。
- DaaS(数据即服务):提供数据存储与分析能力(如 Snowflake)。
各模型灵活性递减,运维复杂度递增。
主流云厂商:阿里云、腾讯云、AWS、Google Cloud、华为云等,提供计算、存储、CDN 等服务。
② 虚拟化技术概述
虚拟化是云服务的基础,主要类型包括:
全虚拟化:
- 虚拟机不知道自己是虚拟机。
- Hypervisor 完全模拟硬件(如 VMware),兼容多 OS,但性能损耗大。
半虚拟化:
- 虚拟机知道自己是虚拟机。
- Guest OS 与 Hypervisor 协作(如 Xen),性能更优,需修改内核。
裸金属虚拟化: - 虚拟化系统(Hypervisor)直接接管硬件。
宿主型虚拟化: - 虚拟化系统寄居在宿主机操作系统上。
③ 虚拟化产品
企业主流产品:
- VMware:企业级,支持 ESXi/vSphere。
- Hyper-V:微软 Windows Server 内置方案。
- VirtualBox:跨平台个人开发工具。
- KVM:Linux 内核原生虚拟化模块。
大型虚拟化产品推荐:Openstack
- 可编程的云操作系统,多地区部署,统一管理,支持私有转公有。
- OpenStack 的强大之处:统一入口,异构整合 ,可以通过开发插件、驱动或集成方式,与大量第三方产品(计算资源)协同工作。例如:KVM/QEMU(默认)、VMware vSphere (via
vmwareapi)等。
个人产品推荐:Proxmox VE
- 开箱即用的虚拟化一体机,架构简洁,去中心化的web管理,一个OS镜像就可以实现分布式部署和虚拟化管理,不需要复杂的模块参与。
- 裸金属虚拟化(Type-1) + 同时支持全虚拟化和容器虚拟化(LXC)。
- 基于Debian Linux系统,运行稳定,功能完善(定时备份、邮件提醒等),开源免费。
- 支持丰富的存储方式,可以配合Ceph提供虚拟机的高可用(HA)。
- 但集群规模有上限(建议 ≤32 节点),且不原生支持openstack接口,适合中小企业开支有限的私有云。
1.2_Docker简介及其重要性
① 为什么使用 Docker?
传统虚拟机每个实例需完整 OS,资源开销大;Docker 容器共享宿主机内核,仅隔离进程、文件系统等,启动快(秒级)、资源占用少(单机可运行上千容器)。
类比:集装箱(容器) vs 整艘货轮(虚拟机)。
② Docker 发展历史(关键节点)
- 2013年:Docker 项目发布(Solomon Hykes, DotCloud)。
- 2017年:推出 CE(社区版)与 EE(企业版)。
- 2018年:集成 Kubernetes,支持多阶段构建。
- 2019年:支持 GPU 加速。
- 2020年后:聚焦开发者体验,强化 CI/CD 与云原生支持。
③ Docker 版本:CE vs EE
| 特性 | Docker CE | Docker EE |
|---|---|---|
| 目标用户 | 个人/小团队 | 企业生产环境 |
| 费用 | 免费 | 付费 |
| 发布周期 | 月度 | 长期支持 |
④ Docker 与传统虚拟化区别
| 对比项 | Docker 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 计算损耗 | 几乎无 | ~50% |
| 单机支持量 | 上千 | 几十 |
| 隔离性 | Namespace/Cgroup | 完全硬件隔离 |
⑤ 容器化技术生态系统
- Docker:最流行容器引擎。
- Kubernetes:容器编排事实标准。
- Podman:无守护进程替代品。
- Containerd/CRI-O:底层运行时(K8s 使用)。
- OpenShift:Red Hat 的企业 K8s 平台。
⑥ Docker 核心优势
- 移植性:镜像跨平台一致运行。
- 隔离性:容器间互不影响。
- 高效性:轻量、快速启动。
- 简化部署:标准化交付单元。
⑦ 应用场景
- CI/CD 流水线(环境一致性)
- 微服务架构(独立部署)
- 多云/混合云迁移(无缝切换)
1.3_Docker基础概念
① Logo 寓意
- 蓝色鲸鱼:宿主机
- 集装箱:容器
- 大海:操作系统(Linux/Windows)
设计宗旨:Build, Ship and Run Any App, Anywhere。
② Linux 六大命名空间(Namespace)
| 缩写 | 作用 |
|---|---|
| MNT | 文件系统挂载点隔离 |
| NET | 网络栈(网卡、路由)隔离 |
| PID | 进程 ID 隔离 |
| IPC | 进程间通信隔离 |
| UTS | 主机名/域名隔离 |
| USER | 用户/组 ID 隔离 |
③ Docker 架构组件
- Docker Daemon :后台服务进程(
dockerd)。 - Client :命令行工具(
docker),与 Daemon 通信。 - Images:只读模板,用于创建容器。
- Container:镜像的运行实例。
- Registry:镜像仓库(如 Docker Hub)。
④ 核心技术
- Namespace:实现资源隔离。
- Cgroup:实现 CPU、内存等资源限制。
- Copy-on-Write (CoW):基于 UnionFS 的高效文件操作。
⑤ 核心概念
- 镜像(Image):包含应用及依赖的只读模板。
- 容器(Container):镜像的运行实例,具独立文件系统、网络、进程空间。
- 仓库(Repository):存放镜像的地方(Docker Hub 为公共仓库)。
2_容器管理
容器管理涵盖镜像操作与容器生命周期控制。
2.1_Docker镜像操作
镜像是容器的基础,管理包括:
- 搜索 :
docker search <关键词> - 拉取 :
docker pull <镜像> - 查看 :
docker images - 打标签 :
docker tag <源> <新标签> - 导出/导入 :
docker save/docker load - 删除 :
docker rmi
镜像由多层组成,每层对应 Dockerfile 一条指令;
latest为默认标签,建议使用明确版本号(如 v1.0)。
2.2_Docker容器操作
容器生命周期:创建 → 启动 → 停止 → 删除。
关键行为:
- 容器默认停止状态 ,需
docker start或docker run启动。 - 容器存活依赖 PID=1 的前台进程,该进程退出则容器停止。
- 支持 7 种状态:created, running, restarting, removing, paused, exited, dead。
常用操作:
- 创建 :
docker create - 启动/停止 :
docker start/stop - 后台运行 :
docker run -d - 交互进入 :
docker exec -it - 文件传输 :
docker cp - 导出/导入 :
docker export/docker import - 删除 :
docker rm
docker run=docker create+docker start。
实验部分
1_Docker 安装与配置
1.1_安装 Docker CE
① 关闭防火墙与 SELinux
shell
systemctl stop firewalld.service
setenforce 0
避免网络策略干扰 Docker 网桥通信。
② 安装依赖包
shell
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供yum-config-manager工具,用于拉取镜像源。
device-mapper-persistent-data、lvm2:Docker持久化存储驱动依赖
③ 配置阿里云yum源
- 添加yum源配置文件
shell
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 查看新添加的docker软件源
shell
cat /etc/yum.repos.d/docker-ce.repo
④ 安装 Docker CE
shell
yum install -y docker-ce docker-ce-cli containerd.io
可指定版本:
yum install -y docker-ce-20.10.18
⑤ 启动并设置开机自启
shell
systemctl start docker.service
systemctl enable docker.service
⑥ 验证安装
shell
docker --version # 查看版本
docker info # 查看详细系统信息
1.2_配置镜像加速器
① 创建配置文件
- 新建目录
shell
mkdir -p /etc/docker
- 阿里云Docker镜像加速器
shell
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xdisb0be.mirror.aliyuncs.com"]
}
EOF
具体获取方式:
阿里云 ACR→镜像工具→镜像加速器
- 华为云Docker镜像加速器
shell
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [ https://1c786b17d3614c7a876977ea63b80b7e.mirror.swr.myhuaweicloud.com ]
}
EOF
具体获取方式:
华为云 SWR→镜像资源→镜像中心→镜像加速器
- 其他国内Docker镜像加速器地址
shell
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
EOF
支持多个加速器,链接之间注意要加逗号。
- 一个国外的Docker镜像加速器
shell
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hub.littlediary.cn/"]
}
EOF
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://43.163.206.59:9211"]
}
EOF
② 重载并重启 Docker
shell
systemctl daemon-reload
systemctl restart docker
2_镜像操作实验
2.1_镜像基础操作
① 搜索镜像
shell
docker search nginx
显示名称、描述、星级等信息
② 拉取镜像
shell
docker pull nginx
默认拉取
latest标签
③ 查看本地镜像
shell
docker images
输出字段:REPOSITORY, TAG, IMAGE ID, CREATED, SIZE
④ 查看镜像详情
shell
docker inspect 41f689c20910
返回 JSON 格式,含层次、历史、配置等
⑤ 为镜像添加标签
shell
docker tag nginx:latest nginx:web
docker images | grep nginx
同一镜像可有多个标签,用于区分版本,例如:v0.1 v1.0。
⑥ 删除镜像
shell
docker rmi nginx:web # 仅删除标签
docker rmi 41f689c20910 # 彻底删除镜像(无容器依赖时)
若被容器使用,需先删除容器
⑦ 导出镜像
shell
docker save -o nginx.tar nginx:latest
生成 tar 包用于备份或迁移
⑧ 导入镜像
shell
docker load < nginx.tar
# 或
docker load -i nginx.tar
- 查看帮助信息
shell
docker load --help
⑨ 上传到 Docker Hub
- 登录 Docker Hub
shell
docker login
被墙了,需要加速,或使用国内仓库。
-
浏览器登陆公共仓库(例如:华为云 SWR、阿里云 ACR)
-
在公共仓库创建组织(阿里云 ACR 创建实例非常规,可以在华为云 SWR创建组织)。
-
以 华为云SWR 为例:
我的镜像→客户端上传→生成登陆指令 -
在服务器粘贴登陆指令,登陆 华为云SWR 公共仓库。
shell
docker login -u cn-east-3@ABCDEFGHIJKLMNOPQRST -p 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqr swr.cn-east-3.myhuaweicloud.com
- 先打一个标签
shell
docker tag {镜像名称}:{版本名称} swr.cn-east-3.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
docker tag nginx:web swr.cn-east-3.myhuaweicloud.com/toopen/nginx:web
- 然后推送
shell
docker push swr.cn-east-3.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
docker push swr.cn-east-3.myhuaweicloud.com/toopen/nginx:web
3_容器操作实验
3.1_容器生命周期管理
① 创建容器(不启动)
shell
docker create -it nginx:latest /bin/bash
-i:保持标准输入(STDIN)打开;-t:分配伪终端(tty);合起来就是运行一个交互式会话。
② 查看容器状态
shell
docker ps # 仅运行中
docker ps -a # 所有容器
③ 启动容器
shell
docker start 容器编号(CONTAINER ID)
docker start 8b0a7be0ff58
④ 停止容器
shell
docker stop 容器编号(CONTAINER ID)
docker stop 8b0a7be0ff58
⑤ 创建并启动容器
shell
docker run -it centos:7 /bin/bash
退出 shell 后容器停止(因主进程结束)
⑥ 后台持续运行
shell
docker run -itd --name test1 centos:7 /bin/bash
-d:后台运行;--name:指定容器名
- 重命名容器
shell
docker rename 旧容器名 新容器名
3.2_容器交互与数据传输
① 进入运行中容器
shell
docker exec -it test1 /bin/bash
退出后容器继续运行
② 复制文件到容器
shell
echo abc123 > ~/test.txt
docker cp ~/test.txt test1:/opt/
③ 从容器复制文件
shell
docker cp test1:/opt/test.txt ~/abc123.txt
3.3_容器迁移与清理
① 导出容器
shell
docker export test1 > centos7.tar # 旧版本方式
docker export test1 -o centos7.tar
无论容器运行与否均可导出
② 导入为镜像
shell
cat centos7.tar | docker import - centos7:test # 旧版本方式
docker import centos7.tar centos7:test
docker images # 查看导入的镜像
生成新镜像,不创建容器
③ 删除容器
shell
docker stop test1
docker rm test1 # 删除已停止容器
docker rm -f test1 # 强制删除运行中容器
④ 批量清理
shell
# 批量停止所有容器
docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop
# 批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm
# 删除所有未使用资源
docker system prune -a # 全删操作,谨慎操作!!
xargs:按行分隔管道输出的内容
system prune:清理系统"无用"的资源(停止的容器、未使用的网络、悬空镜像等)
结语
Docker 核心价值 :通过轻量级容器实现应用的标准化封装与跨环境一致运行。
镜像管理要点 :标签用于版本控制,save/load 适用于镜像迁移,rmi 需确保无容器依赖。
容器生命周期 :以 PID=1 进程为生命线,run -d 后台运行需保证主进程不退出。
数据持久化基础 :docker cp 实现宿主机与容器间文件传输,为后续数据卷学习铺垫。
!question\] 为什么 Docker 容器启动速度远快于虚拟机? 容器共享宿主机内核,无需启动完整操作系统,仅初始化隔离的用户空间进程。 \[!question\] 执行 `docker run -it centos:7 bash` 后退出终端,容器为何停止? 容器内 PID=1 的进程是 `bash`,退出后该进程终止,Docker 认为容器任务完成,自动停止。 \[!question\] `docker export` 与 `docker save` 的区别是什么? `export` 导出**容器快照** (不含历史层和元数据),生成新镜像时丢失构建信息;`save` 导出**完整镜像**(含所有层和标签),可完全还原。 \[!question\] 如何让容器在后台持续运行? 使用 `docker run -d` 并确保容器内主进程为**前台常驻进程** (如 `while true; do echo hello; sleep 1; done`)。 \[!question\] 删除镜像时提示 "image is being used by running container",如何解决? 先执行 `docker stop
` 停止容器,再 `docker rm ` 删除容器,最后 `docker rmi ` 删除镜像。
扩展
思考是否可以手动封装一个"容器"
当然可以!以下是从零开始,将 /opt/ls 目录制作成可用 Docker 镜像的完整简明步骤,适用于自定义 rootfs 场景(如最小化系统、调试环境等)。
✅ 最终目标
将一个能运行 ls、bash 的独立目录 /opt/ls
→ 打包为 Docker 镜像 myroot:latest
→ 可用命令:docker run -it myroot
🧰 前提条件
- 主机为 x86_64 Linux(CentOS/RHEL/Fedora/Ubuntu 等)
- 已安装
docker - 当前用户可执行
sudo
🔧 操作步骤(全程复制粘贴即可)
- 制作一个最小的可执行ls命令的依赖环境
bash
# 1. 创建目标目录
rm -rf /opt/ls && mkdir -p /opt/ls/{bin,lib64,etc,proc,sys,tmp}
# 2. 复制基本命令(bash 和 ls)
cp /bin/bash /opt/ls/bin/
cp /bin/ls /opt/ls/bin/
# 3. 复制必要共享库(自动提取依赖)
for lib in $(ldd /bin/bash /bin/ls | grep '/lib64/' | awk '{print $3}' | grep '^/'); do
cp $lib /opt/ls/lib64/
done
# 补上动态链接器(重要!否则报 "no such file")
cp /lib64/ld-linux-x86-64.so.2 /opt/ls/lib64/
# 4. 复制其他关键库(可能未被 ldd 列出,但运行时需要)
cp /lib64/libcap.so.2.22 /opt/ls/lib64/ 2>/dev/null || true
ln -sf libcap.so.2.22 /opt/ls/lib64/libcap.so.2
cp /lib64/libpcre.so.1.2.0 /opt/ls/lib64/ 2>/dev/null || true
ln -sf libpcre.so.1.2.0 /opt/ls/lib64/libpcre.so.1
cp /lib64/libattr.so.1.1.0 /opt/ls/lib64/ 2>/dev/null || true
ln -sf libattr.so.1.1.0 /opt/ls/lib64/libattr.so.1
# 5. 设置 PATH 环境变量:创建启动脚本
tee /opt/ls/chroot.sh > /dev/null <<'EOF'
#!/bin/bash
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
exec /bin/bash "$@"
EOF
chmod +x /opt/ls/chroot.sh
# 6. (可选)创建 passwd 文件避免警告
mkdir -p /opt/ls/etc
tee /opt/ls/etc/passwd > /dev/null <<'EOF'
root:x:0:0:root:/root:/bin/bash
EOF
# 7. 用chroot测试运行环境是否可用
chroot /opt/ls/ /bin/bash --login
chroot /opt/docker /chroot.sh
chroot是docker的灵感来源,但chroot只实现了根目录的挂载点隔离,而进程、用户、网络等资源并没有完全隔离,而隔离运行环境就是docker诞生的目的。
- 将这个环境打包成docker镜像
shell
# 8. 打包 ls 并以ls为根目录
tar -cf ls -C ls .
# 9. 或者直接将目录 打包为 Docker 镜像
tar -C /opt/ls -c . | docker import - myroot:latest
# 10. 验证镜像是否可用
docker run --rm -it myroot /bin/ls /
# 进入交互式 shell
docker run --rm -it myroot /chroot.sh
-C ls:先进入 ls 目录
-c .:然后从 ls/ 内部打包所有文件最终生成的 tar 文件里,路径就是:
bin/
lib64/
etc/
...
🐳 使用说明
bash
# 启动容器并进入 bash
docker run --rm -it myroot /chroot.sh
# 在容器内可直接使用:
ls
ps aux
cat /etc/passwd
⚠️ 不支持
systemd,service等守护进程操作(这是最小 rootfs)
📦 成果
你现在拥有了:
- ✅ 一个基于真实 Linux 二进制构建的 rootfs
- ✅ 包含 shell 和基础命令
- ✅ 正确的库依赖和解释器
- ✅ 可导入 Docker 的标准镜像
💡 扩展建议
想添加更多命令?比如 ip, ss, curl:
bash
cp /usr/sbin/ip /opt/ls/bin/
cp /usr/bin/ss /opt/ls/bin/
cp /usr/bin/curl /opt/ls/bin/
然后拷贝依赖的库文件,含软链接对应的实际文件,最后重新打包即可。