目录
一.虚拟化技术解决了哪些问题,优势是哪些?
1.1 虚拟化技术解决的问题
1. 物理资源利用率低下
问题:传统服务器通常仅运行单一应用,CPU利用率不足20%,内存和存储资源大量闲置。
解决:通过虚拟化将一台物理服务器划分为多个虚拟机(VM)或容器,使资源利用率提升至70%以上。
2. 硬件依赖性强
问题:应用与物理硬件绑定(如特定型号的服务器),迁移或扩展需重新部署。
解决:虚拟化抽象硬件层,应用以镜像形式运行在任意兼容的虚拟化平台上(如从本地迁移到云)。
3. 环境不一致性
问题:开发、测试、生产环境配置差异导致“在我机器上能跑”的经典问题。
解决:通过虚拟机模板或容器镜像实现环境标准化,确保全生命周期一致性。
4. 高可用性与灾备困难
问题:物理服务器故障导致服务中断,恢复时间长。
解决:虚拟机快照(Snapshot)、实时迁移(Live Migration)和容器编排(如K8s)实现秒级故障转移。
5. 成本高昂
问题:购买和维护大量物理服务器,电力、散热、机房空间成本高。
解决:服务器整合(如将10台物理机合并为1台运行10个VM),降低硬件和运维成本。
6. 安全隔离不足
问题:多个应用运行在同一OS上,漏洞可能横向扩散。
解决:虚拟机(完全隔离)或容器(进程级隔离)提供独立运行环境
1.2 虚拟化技术的优势
1. 资源池化与动态分配
2. 隔离性与安全性
3. 快速部署与自动化
4. 高可用与弹性
5. 降低成本
6. 兼容性与跨平台
二.容器增强了哪些能力、应用场景是什么
2.1 容器增强的能力
1. 极致的轻量化与高性能
2. 环境一致性
3. 快速弹性伸缩
结合编排工具(如Kubernetes),可实现秒级扩容/缩容,自动应对流量高峰。
支持动态负载均衡和自愈(故障容器自动重启)。
4. 跨平台与混合云部署
三. 虚拟化 vs 容器化
对比维度 | 虚拟化(VM) | 容器化(Docker) |
---|---|---|
隔离级别 | 硬件级(完整OS隔离) | 进程级(共享内核) |
启动速度 | 分钟级 | 秒级 |
资源占用 | 高(每个VM需独立OS) | 低(共享主机内核) |
性能损耗 | 较高(需通过Hypervisor转换指令) | 极低(直接调用主机内核) |
典型应用场景 | 传统企业应用、多操作系统需求 | 微服务、CI/CD、云原生应用 |
四. Docker
4.1 定义
Docker 是一种开源的容器化平台,用于快速构建、部署和运行应用程序。它通过轻量级的“容器”(Container)技术,将应用及其依赖环境打包在一起
4.2 docker的安装步骤
#修改主机名
[root@localhost ~]# hostnamectl set-hostname docker-luck-cloud01
[root@localhost ~]# su
#关闭防火墙与核心防护(永久)
[root@docker-luck-cloud01 ~]# systemctl stop firewalld
[root@docker-luck-cloud01 ~]# systemctl disable firewalld
[root@docker-luck-cloud01 ~]# setenforce 0
[root@docker-luck-cloud01 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
#安装依赖环境
[root@docker-luck-cloud01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
#设置阿里云镜像源
[root@docker-luck-cloud01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker-ce(社区版)
[root@docker-luck-cloud01 ~]# yum install -y docker-ce docker-ce-cli containerd.io
#设置开机自启动并立即启动
[root@docker-luck-cloud01 ~]# systemctl enable docker.service --now
#申请华为云镜像加速器
cd /etc/docker
vim daemon.json
{
"registry-mirrors": [ "https://0f8a3388042b4b0ab6611ccc6e866ab3.mirror.swr.myhuaweicloud.com" ]
}
systemctl daemon-reload
systemctl restart docker
4.3 docker的基本操作
# 镜像的增删改查
docker images 查看镜像列表
docker pull image_name:tag 下载镜像
docker tag image_name:tag new_name:new_tag 给镜像打标签
docker rmi image_id/image_name:tag 删除镜像
docker inspect image_id/image_name:tag 查看镜像的详细信息
docker save -o file_name image_name:tag 将镜像导出为文件(模板)
docker load -i file_name 将文件导入到docker内(导入为镜像)
#容器的增删改查
docker ps -a 查看所有状态的容器
docker run -itd image name:tag [/bin/bash......] 下载并将镜像运行为容器(-i
让容器可以接受宿主机的指令,-t 为容器分配一个伪终端,让用户可以“登录”进容器,-d分配一个守护进程,这样可以让容器运行时不占用前端终端)
docker rm [-f] 默认删除非运行状态的容器,加 -f 强制删除所有容器
docker ps -aq 列出所有容器的容器ID
docker export 容器ID/容器名字 > file_name 将容器导出为文件
cat file_name | docker import - new_image_name 将容器导出的文件导入为镜像
docker start/stop/restart 容器IDC 对容器进行开启/关闭/重启动作
docker inspect 容器ID/容器名字 查看容器详细信息
docker exec -it 容器ID/容器名字 bash [-c cmd] 进入容器,-c 像容器内部传入指令
docker run -itd -P/-p image_id:tag -P 将内部端口设备从32768开始的端口,-p映射,如:‘83:80’ 宿主机端口:容器内部端口
#容器网络的操作
docker network ls 查看当前docker的网络模式的信息
docker network create --driver name --subnet 子网段 --gateway 指定网关IP net_name 自定义网络
docker run -itd --name c_name --network net-name image_name:tag 指定使用哪个网络
docker run -itd --name c2_name --network=container:c1_name image_name:tag container模式
4.4 docker的网络实现原理
Docker 使用 Linux 桥接技术,在宿主机上虚拟一个名为 docker0
的 Docker 容器网桥。当 Docker 启动一个容器时,会根据 docker0
网桥的网段分配给容器一个 IP 地址(Container-IP)。由于同一宿主机内的容器都连接到同一个网桥,因此容器之间可以通过各自的 Container-IP 直接通信。
Docker 网桥是虚拟的,不是真实存在的网络设备,因此外部网络无法直接寻址到它,这意味着外部网络无法直接通过 Container-IP 访问容器。如果希望外部网络能够访问容器,可以通过端口映射将容器端口映射到宿主主机,即使用 docker run
命令的 -p
或 -P
参数。
4.5 Docker 的网络模式
1. Bridge 模式
当你启动一个容器而不指定网络模式时,Docker 默认使用 bridge 模式。
容器通过
docker0
网桥与宿主机通信,适用于单机容器网络。特点:容器分配独立 IP,通过 NAT 访问外部网络。
网络命名空间
每个容器启动时,Docker 会为其创建一个独立的 网络命名空间,隔离网络设备、IP、端口、路由等。
Veth 对
Docker 会为每个容器创建一对 veth 设备:
一端在容器内(通常命名为
eth0
)。另一端连接到宿主机的
docker0
网桥。
作用:实现容器与宿主机之间的网络通信。
docker0 网桥
docker0
是 Docker 默认创建的 Linux 网桥(软件交换机),所有容器(Bridge 模式)的 veth 端点都连接到它。功能:
为容器分配 IP(默认
172.17.0.0/16
)。实现容器间通信(同主机)。
通过 NAT 实现容器访问外网。
docker 0 的作用:网关,端口映射,负载均衡
面试题:介绍一下dicker0网桥
docker0 是所有容器的默认网关
docker0通过veth对与容器进行网络通讯
docker0可以将容器内部的端口(服务)映射到宿主机环境,从而被外网客户端访问到
2. Host 模式
容器直接使用宿主机的ip与端口,没有自己的ip
3. container模式
网络共享:两个容器共享 IP 地址、端口空间,可以通过
localhost
互相通信。独立文件系统:除了网络,其他命名空间(如进程、文件系统)仍然是独立的。
多个容器需要共享网络配置,如一组协作的微服务。
4. none模式
容器没有任何网络配置,相当于断网。
5. Overlay 网络模式
用于在多个 Docker 主机之间创建一个虚拟的分布式网络,让容器可以跨主机通信。
+-------------------------------------------------------+
| 物理网络(Underlay) |
| (e.g., 192.168.1.0/24, 10.0.0.0/16, 云厂商VPC) |
+-------------------------------------------------------+
↑ ↑ ↑
|VXLAN封装 |VXLAN封装 |
+----------+-------+ +------+--------+ +----+----------+
| Docker Node1 | | Docker Node2 | | Docker Node3 |
| +--------------+ | | +-------------+ | | +-----------+ |
| | Container A | | | | Container B | | | |Container C| |
| | 10.0.0.2 | | | | 10.0.0.3 | | | | 10.0.0.4 | |
| +-------+------+ | | +------+-------+ | | +-----+-----+ |
| |eth0 | | |eth0 | | |eth0 |
| v | | v | | v |
| +-------+------+ | | +------+-------+ | | +-----+-----+ |
| | veth (vethA) | | | | veth (vethB)| | | |veth (vethC)| |
| +-------+------+ | | +------+-------+ | | +-----+-----+ |
| | | | | | | | |
| +-------+------+ | | +------+-------+ | | +-----+-----+ |
| | docker_gwbridge| | | docker_gwbridge| | |docker_gwbr| |
| | (172.18.0.1) | | | (172.18.0.2) | | | (172.18.0.3)|
| +-------+------+ | | +------+-------+ | | +-----+-----+ |
| | | | | | | | |
| +-------+------+ | | +------+-------+ | | +-----+-----+ |
| | Overlay Net | | | | Overlay Net | | | | Overlay Net|
| | (VXLAN) | | | | (VXLAN) | | | | (VXLAN) |
| +--------------+ | | +-------------+ | | +-----------+ |
+------------------+ +----------------+ +---------------+
关键组件说明:
容器 (
Container A/B/C
)每个容器分配唯一的 Overlay IP(如
10.0.0.2/24
)。
veth 对
连接容器和宿主机网络栈(如
vethA ↔ eth0
)。
docker_gwbridge
宿主机上的桥接网络,处理容器对外通信(非 Overlay 流量)。
Overlay 网络 (VXLAN)
跨主机的虚拟网络,数据包通过 UDP 4789 端口封装传输。
物理网络
底层网络(如 AWS VPC、本地数据中心),承载 VXLAN 流量。