深入了解虚拟化与容器技术:从virsh到Linux容器
在当今的技术领域,虚拟化和容器技术是两项极为重要的技术,它们为资源的高效利用和应用的部署提供了强大的支持。本文将详细介绍virsh工具对虚拟机的管理,以及Linux容器的相关知识和在Fedora 31上的实践操作。
1. virsh工具管理虚拟机
virsh是一个功能强大的工具,可用于创建、监控和管理虚拟机。它支持命令行和交互式两种使用模式,以下是其常见操作:
1.1 恢复暂停的系统
若要恢复暂停的系统,可使用以下命令:
# virsh resume guestName
需注意,若主机系统重启,暂停的会话将会丢失,且暂停的系统仍会占用内存。
1.2 保存和恢复虚拟机
可使用virsh工具保存和恢复正在运行的虚拟机,保存时,虚拟机的当前状态会被写入磁盘并从系统内存中移除,之后可随时恢复(包括主机系统重启后)。
- 保存虚拟机:
# virsh save guestName path_to_save_file
- 恢复保存的虚拟机会话:
# virsh restore path_to_save_file
1.3 重启虚拟机
重启虚拟机的命令如下:
# virsh reboot guestName
1.4 配置虚拟机内存
使用virsh命令的setmem选项可配置分配给虚拟机的内存。例如,将虚拟机系统的内存分配减少到256Mb:
# virsh setmem guestName 256
可接受的内存设置必须在当前域可用的内存范围内,可使用setmaxmem选项增加可用内存。
2. Linux容器简介
Linux容器是虚拟化的轻量级替代方案,与虚拟机有相似之处,但也存在关键差异。
2.1 Linux容器与内核共享
Linux容器利用内核共享的概念,基于Linux和UNIX操作系统的架构设计。操作系统主要由内核和根文件系统两部分组成,内核处理操作系统与物理硬件的交互,根文件系统包含操作系统运行所需的库、文件和实用程序。容器各自拥有自己的根文件系统,但共享主机操作系统的内核。
这种资源共享得益于内核动态更改当前根文件系统的能力(即chroot),无需重启整个系统。Linux容器是这种能力与容器运行时的结合,常见的容器运行时有Docker、lxd、containerd和CRI - O等。在Fedora 31中,默认的容器运行时已从Docker替换为Podman。
以下是Linux容器与虚拟机的对比表格:
| 对比项 | 虚拟机 | Linux容器 |
| ---- | ---- | ---- |
| 资源开销 | 大 | 小 |
| 启动速度 | 慢 | 快 |
| 隔离性 | 高 | 相对低 |
| 内核使用 | 每个虚拟机有独立内核 | 共享主机内核 |
2.2 容器的用途和优势
- 资源高效 :容器所需的资源开销远低于虚拟化,可在单台服务器上同时运行多个容器实例,并能根据需求快速启动和停止。
- 高性能 :容器在主机系统上原生运行,性能优于虚拟机。
- 可移植性 :容器具有极高的可移植性,可在不同系统间快速迁移。结合容器管理系统,可大规模部署和管理容器。
- 应用环境隔离 :常用于为应用创建轻量级执行环境,每个容器提供隔离环境,包含应用运行所需的所有依赖。
- 开发与生产环境一致性 :有助于弥合开发和生产环境之间的差距,确保应用在开发和测试环境中的运行状态与生产环境一致。
- 模块化部署 :促进大型复杂解决方案的模块化部署,将应用设计为多个相互交互的模块,每个模块运行在单独的容器中。
不过,容器也有一定限制,即客户操作系统必须与共享的内核版本兼容,例如不能在Linux系统的容器中运行Windows系统。但这些限制也可视为容器提供简单、可扩展和可靠部署平台的优势。
2.3 Fedora 31容器工具
Fedora 31提供了多个用于创建、检查和管理容器的工具:
-
buildah
:用于构建容器镜像的命令行工具。
-
podman
:基于命令行的容器运行时和管理工具,可从远程仓库下载容器镜像,检查、启动和停止镜像。
-
skopeo
:命令行实用程序,用于转换容器镜像、在仓库之间复制镜像以及检查仓库中存储的镜像,无需下载。
-
runc
:轻量级容器运行时,用于从命令行启动和运行容器。
这些工具都符合开放容器倡议(OCI)标准,确保容器在不同工具和平台间遵循相同标准。
2.4 Docker仓库
虽然Fedora提供了替代Docker的工具,但构建容器时仍需访问Fedora镜像。Fedora项目在Docker Hub中维护了一组Fedora容器镜像,Docker Hub是一个在线容器仓库,包含多个存储库,每个存储库有多种容器镜像可供下载。镜像有存储库标签(如30、31、latest等),下载时可引用这些标签。例如,Fedora 31镜像的URL为:
docker://docker.io/library/fedora:31
除了从Docker和其他第三方主机仓库下载镜像,还可使用仓库存储自己的镜像,可通过托管自己的仓库或使用现有服务(如Docker、Amazon AWS、Google Cloud等)实现。
2.5 容器网络
默认情况下,容器使用容器网络接口(CNI)桥接网络栈连接到网络。在桥接配置中,服务器上运行的所有容器属于同一子网(默认是10.88.0.0/16),可相互通信。容器通过桥接主机系统的网络连接与外部网络相连,主机可通过虚拟网络接口(通常名为cni0)访问容器。
以下是容器网络连接的mermaid流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(主机系统):::process -->|网络连接| B(CNI桥接网络栈):::process
B -->|子网10.88.0.0/16| C(容器1):::process
B -->|子网10.88.0.0/16| D(容器2):::process
C <-->|通信| D
A -->|虚拟网络接口cni0| C
A -->|虚拟网络接口cni0| D
在接下来的内容中,我们将详细介绍如何在Fedora 31上使用Podman、Skopeo和Buildah工具创建和管理容器。
深入了解虚拟化与容器技术:从virsh到Linux容器
3. 在Fedora 31上使用容器
3.1 安装容器工具
在开始使用容器之前,需要安装相关工具,可使用以下命令:
# dnf install podman skopeo buildah
3.2 拉取容器镜像
以拉取最新的Fedora镜像为例,在拉取之前,可使用
skopeo
工具获取镜像仓库的信息:
$ skopeo inspect docker://docker.io/library/fedora
输出示例如下:
{
"Name": "docker.io/library/fedora",
"Digest": "sha256:d4f7df6b691d61af6cee7328f82f1d8afdef63bc38f58516858ae3045083924a",
"RepoTags": [
"20",
"21",
"22",
"23",
"24",
"25",
"26-modular",
"26",
"27",
"28",
"29",
"30",
"31",
"32",
"branched",
"heisenbug",
"latest",
"modular",
"rawhide"
],
"Created": "2019-10-29T03:23:37.695123423Z",
"DockerVersion": "18.06.1-ce",
"Labels": {
"maintainer": "Clement Verna <cverna@fedoraproject.org>"
},
"Architecture": "amd64",
"Os": "linux",
"Layers": [
"sha256:d318c91bf2a81634e0283fb7e7362efdd7c21164b60b74498360756dc82a95d9"
],
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"DISTTAG=f31-updates-candidatecontainer",
"FGC=f31-updates-candidate",
"FBR=f31-updates-candidate"
]
}
确认仓库中有需要的镜像后,使用
podman
命令下载指定版本的镜像,语法如下:
$ podman pull docker://docker.io/library/fedora:<RepoTag>
例如,拉取最新的Fedora镜像:
$ podman pull docker://docker.io/library/fedora:latest
拉取完成后,可使用以下命令查看本地镜像:
$ podman images
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/fedora latest f0858ad3febd 2 months ago 201 MB
还可使用
podman inspect
命令查看本地镜像的详细信息:
$ podman inspect fedora:latest
3.3 在容器中运行镜像
拉取的镜像可直接在容器中运行,使用
podman run
命令。以下示例使用
--rm
选项,运行镜像并执行一个命令后退出容器,使用
cat
工具输出容器根文件系统中
/etc/passwd
文件的内容:
$ podman run --rm fedora:latest cat /etc/passwd
若要启动容器并保持运行,同时进入容器的shell,可使用以下命令:
$ podman run --name=mycontainer -it fedora:latest /bin/bash
在容器运行时,可在另一个终端窗口使用
podman ps -a
命令查看系统中所有容器的状态:
$ podman ps -a
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03c8e8ac8fd5 docker.io/library/fedora:latest /bin/bash 50 seconds ago Up About a minute ago mycontainer
若要在主机上对运行中的容器执行命令,可使用
podman exec
命令,例如启动容器中的第二个bash会话:
$ podman exec -it mycontainer /bin/bash
也可使用容器ID执行相同操作:
$ podman exec -it 03c8e8ac8fd5 /bin/bash
还可使用
podman attach
命令连接到运行中的容器并进入shell:
$ podman attach mycontainer
3.4 管理容器
停止容器可使用
podman stop
命令:
$ podman stop mycontainer
也可在容器的最后一个bash shell中按
Ctrl - D
组合键退出容器。容器退出后,可使用
podman ps -a
命令查看其状态:
$ podman ps -a
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03c8e8ac8fd5 docker.io/library/fedora:latest /bin/bash 7 minutes ago Exited (0) About a minute ago mycontainer
若要重启容器,可使用
podman start
命令:
$ podman start mycontainer
还可使用
podman pause
和
podman unpause
命令暂停和恢复容器:
$ podman pause mycontainer
$ podman unpause mycontainer
3.5 将容器保存为镜像
当容器配置满足需求后,可使用
podman commit
命令将容器保存为镜像:
$ podman commit mycontainer myfedora_image
保存后,使用
podman images
命令查看本地镜像列表:
$ podman images
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/myfedora_image latest aef244443f2d 7 seconds ago 201 MB
docker.io/library/fedora latest f0858ad3febd 2 months ago 201 MB
使用保存的镜像创建新容器:
$ podman run --name=mycontainer2 -it localhost/myfedora_image /bin/bash
3.6 从本地存储中删除镜像
若不再需要某个镜像,可使用
podman rmi
命令删除,例如删除之前创建的
myfedora_image
镜像:
$ podman rmi localhost/myfedora_image
注意,在删除镜像之前,必须先删除基于该镜像的所有容器。
3.7 删除容器
即使容器已退出或停止,它仍然存在。可使用
podman rm
命令删除容器,例如删除
mycontainer
:
$ podman rm mycontainer
以下是在Fedora 31上使用容器的操作流程mermaid流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(安装容器工具):::process --> B(拉取容器镜像):::process
B --> C(在容器中运行镜像):::process
C --> D(管理容器):::process
D --> E(保存容器为镜像):::process
E --> F(删除镜像):::process
D --> G(删除容器):::process
综上所述,通过virsh工具可以方便地管理虚拟机,而Linux容器则提供了一种轻量级、高效的应用部署和管理方式。在Fedora 31上,借助Podman、Skopeo和Buildah等工具,能够轻松地创建、运行和管理容器,满足不同场景的需求。
超级会员免费看
77

被折叠的 条评论
为什么被折叠?



