16、深入了解虚拟化与容器技术:从virsh到Linux容器

深入了解虚拟化与容器技术:从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等工具,能够轻松地创建、运行和管理容器,满足不同场景的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值