一些兴起原因:在使用虚拟化一段时间后,发现它存在一些问题:
不同的用户,有时候只是希望运行各自的一些简单程序,跑一个小进程。为了不相互影响,就要建立虚拟机。如果建虚拟机,显然浪费就会有点大,而且操作也比较复杂,花费时间也会比较长。而且,有的时候,想要迁移自己的服务程序,就要迁移整个虚拟机。显然,迁移过程也会很复杂。
有没有办法更灵活快速一些呢?有,这就引入了“容器(Container)”。
容器与虚拟机的区别
容器也是虚拟化,但是属于“轻量级”的虚拟化。它的目的和虚拟机一样,都是为了创造“隔离环境”。但是,它又和虚拟机有很大的不同——虚拟机是操作系统级别的资源隔离,而容器本质上是进程级的资源隔离。
虚拟机通常包括整个操作系统和应用程序。它们还需要一个与它们一起运行的管理程序来控制虚拟机。由于它们包括操作系统,因此它们的大小为几千兆字节。使用虚拟机的一个缺点是,它们需要花费几分钟来启动操作系统,并初始化它们所承载的应用程序。同时,这些容器是轻量级的,并且大部分在兆字节大小范围内。与虚拟机相比,容器的性能要好得多,几乎可以立即启动。
容器的优缺点
容器技术主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立
于宿主操作系统和其它隔离的进程。使用容器可以不修改应用程序代码,不需要开发人员学习
特定环境下的技术,就能够将现有的应用程序部署在其它机器上。
容器优缺点如下:
优点:
敏捷环境
提高生产力
版本控制
运行环境可移植
标准化
安全
缺点:
复杂性增加
原生 Linux 支持
不太成熟
容器的分类
常见的容器有操作系统容器和应用程序容器。
操作系统容器非常适合运行同一应用不同版本的需求,对相同版本的场景更不是问题。
应用程序容器设计为将服务打包并作为单个进程运行,而在操作系统容器中,可以运行多个服
务和进程。
当需要将应用程序打包并作为组件分发时,应用程序容器是个很好的选择。如果只想要一个可
以安装不同库、语言、数据库的操作系统,那么操作系统容器更适合。
容器技术:轻量级的「操作系统虚拟化」
不跟你讲长篇大论,直接从你最熟悉的场景切入,让你彻底明白容器是什么、为什么出现、怎么用。
一、先看一个你一定会遇到的痛点
你现在部署一个应用:
# 在 Rocky 上
yum install -y nginx
# 配了半天,终于跑起来了
# 在 OpenCloudOS 上
yum install -y nginx # 等等,版本不一样?
# 又要重新调配置
更大的坑:
- 开发用 Ubuntu,测试用 CentOS,生产用 OpenCloudOS
- 「在我电脑上是好的啊!」—— 环境不一致,天天吵架
容器的答案:
把「应用 + 完整环境」打包成一个镜像,哪里跑都一样。
二、容器是什么?
容器 = 进程级别的隔离,操作系统级别的共享。
和你的 VMware 对比:
| 维度 | VMware(虚拟机) | 容器 |
|---|---|---|
| 隔离级别 | 硬件虚拟化 | 进程隔离 |
| 每个单元包含 | 完整 OS(GB级) | 只包含应用+依赖(MB级) |
| 启动时间 | 分钟级 | 秒级 |
| 资源占用 | 高(每个 VM 一套 OS) | 低(共享宿主机内核) |
| 你的 Rocky | 一整台虚拟机 | 可以跑几十个容器 |
一个比喻让你再也忘不掉:
- 虚拟机 = 每家租客自己盖一套房子(有自己的地基、水电、墙)
- 容器 = 酒店房间(共享大楼的水电结构,只带自己的行李)
三、容器技术的三大核心
1. 镜像(Image)
容器的「模板」或「安装包」。
FROM nginx:alpine
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
- 包含:应用 + 运行时 + 依赖 + 配置
- 分层存储:每一层只记录变化,节省空间
- 不可变:镜像一旦建成,永不修改
你的类比:VMware 的 .vmdk 文件,但小得多。
2. 容器(Container)
镜像的「运行实例」。
docker run -d -p 80:80 nginx
- 镜像
nginx跑起来,就是一个容器 - 可以启动、停止、删除、暂停
- 容器内的修改不影响镜像
你的类比:VMware 里从模板克隆一台 VM。
3. 仓库(Registry)
存镜像的地方。
- Docker Hub(官方仓库)
- 私有仓库(Harbor、阿里云镜像服务)
docker pull nginx:latest # 下载
docker push myapp:v1.0 # 上传
你的类比:GitHub,但存的是镜像不是代码。
四、容器和虚拟机的本质区别
| 对比项 | 虚拟机 | 容器 |
|---|---|---|
| 架构 | [APP] [OS] [Hypervisor] [硬件] | [APP] [容器引擎] [宿主机OS] [硬件] |
| 内核 | 每个 VM 有自己的内核 | 所有容器共享宿主机内核 |
| 隔离 | 强(硬件级) | 弱(进程级,但够用) |
| 安全 | 高(完全隔离) | 中(内核共享有风险) |
| 密度 | 一台物理机跑十几个 VM | 一台物理机跑上百个容器 |
你现在两台 VM 各装一套系统 → 浪费资源。
如果用容器,一台 VM 就能跑十几个隔离的应用。
五、为什么容器现在这么火?
1. 微服务的「完美载体」
- 每个服务一个容器
- 独立开发、独立部署、独立扩缩容
2. DevOps 的「标准化交付」
- 开发 build 镜像
- 测试 run 镜像
- 生产 run 同一个镜像
3. 弹性伸缩的「原子单位」
- K8s 调度的是容器,不是 VM
- 不够了?再加 10 个容器副本
六、你的学习路径(从零到一)
第 1 步:在 Rocky 上安装 Docker
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
第 2 步:跑第一个容器
# 下载并运行 nginx
docker run -d -p 8080:80 --name my-nginx nginx
# 访问你的 Rocky:8080,看到 nginx 欢迎页
第 3 步:自己打一个镜像
mkdir myapp && cd myapp
cat > index.html <<EOF
<h1>Hello from Container!</h1>
EOF
cat > Dockerfile <<EOF
FROM nginx:alpine
COPY index.html /usr/share/nginx/html
EOF
docker build -t myapp:v1 .
docker run -d -p 8081:80 myapp:v1
第 4 步:推送到仓库
docker tag myapp:v1 你的用户名/myapp:v1
docker push 你的用户名/myapp:v1
七、容器 ≠ Docker
很多人把容器等同于 Docker,这是误区:
| 技术 | 角色 |
|---|---|
| 容器运行时 | runc、containerd(真正跑容器的) |
| 容器引擎 | Docker、Podman、CRI-O(用户操作的) |
| 镜像标准 | OCI(Open Container Initiative) |
| 编排工具 | K8s、Swarm、Nomad(管一群容器的) |
Docker 只是最流行的容器工具,不是唯一。
八、你现在的位置 + 下一步
| 你现在 | 下一步学什么 |
|---|---|
| 知道容器是什么 | Docker 常用命令(run、ps、exec、logs) |
| 知道镜像怎么打 | Dockerfile 最佳实践 |
| 跑了一个 nginx | 容器网络、存储卷 |
| – | docker-compose(多容器编排) |
等你容器玩熟了,就可以进 K8s 了。
九、一句话终结
容器 = 把你的应用和依赖打包,扔到哪里都能跑,再也不怕环境不一致。
你现在两台 VM 的环境差异,用容器就解决了。
发表回复