目录
一、理论
1.虚拟化
2.容器
3.podman
4.docker
5.podman与docker区别
二、实验
1.部署podman
2.部署docker
三、总结
一、理论
1.虚拟化
(1)概念
虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化使用软件的方法重新定义划分 IT 资源,可以实现 IT 资源的动态分配、灵活调度、跨域共享,提高 IT 资源利用率,使 IT 资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。
(2)虚拟化两大组件
虚拟机管理器功能:调用资源。
两大核心组件:QEMU、KVM。
① QEMU:
1)可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。
2)QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。
② KVM:
1)用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
2)只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。
3)对于workstation而言,硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。
(3)虚拟化类型
全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
半虚拟化:需要修改操作系统
直通:直接使用物理硬件资源(需要支持,还不完善)
全虚拟化:KVM → 产品vmware—ce(社区版)
半虚拟化:EXS → workststion vsphere
(4)虚拟化功能
① 在一个操作系统内,模拟多个操作系统
② 以软件的方式模拟物理设备的功能
2.容器
(1)概念
容器是一种技术,开发人员打包开发完成的一个应用(系统)以及所需的开发环境,然后通过容器可以运行在不同的计算机上面,也不需要重新配置相关环境,不同的是每一台计算机都需要配置运行容器的容器引擎,目前市场上主流就是Docker容器引擎,不过Docker容器引擎的配置很简单,比配置应用(系统)运行的环境简单,方便太多。每台要运行应用(系统)的计算机上面配置了Docker容器引擎之后,都单独独立可以运行之前打包完成的应用(系统)。
(2)优点
灵活:即使是最复杂的应用也可以集装箱化
轻量级:容器利用并共享主机内核
可互换:可以即时部署更新和升级
便携式:可以在本地构建,部署到云,并在任何地方运行
可扩展:可以增加并自动分发容器副本
可堆叠:可以垂直和即时堆叠服务
(3)缺点
复杂性增加:随着容器及应用数量的增加,同时也伴随着复杂性的增加。在生产环境中管理如此之多的容器是一个极具挑战性的任务,可以使用 Kubernetes 和 Mesos 等工具管理具有一定规模数量的容器。
原生 Linux 支持:大多数容器技术,比如 Docker,基于 Linux 容器(LXC),相比于在原生 Linux 中运行容器,在 Microsoft 环境中运行容器略显笨拙,并且日常使用也会带来复杂性。
不成熟:容器技术在市场上是相对新的技术,需要时间来适应市场。开发者中的可用资源是有限的,如果某个开发者陷入某个问题,可能需要花些时间才能解决问题。
3.podman
(1) 概念
Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。
Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。
Podman 官网地址:https://podman.io/
安装文档地址:Redirect to Podman Docs
podman是个Linux程序,不能在Windows上运行,但是可以运行客户端,发送到Linux服务端操作。
(2)常用命令
① 容器:
表1 podman常用容器命令
命令 | 功能 |
podman run | 创建并启动容器 |
podman start | 启动容器 |
podman ps | 查看容器 |
podman stop | 终止容器 |
podman restart | 重启容器 |
podman attach | 进入容器 |
podman exec | 进入容器 |
podman export | 导出容器 |
podman import | 导入容器快照 |
podman rm | 删除容器 |
podman logs | 查看日志 |
② 镜像:
表2 podman常用镜像命令
命令 | 功能 |
podman search | 检索镜像 |
podman pull | 获取镜像 |
podman images | 列出镜像 |
podman image Is | 列出镜像 |
podman rmi | 删除镜像 |
podman image rm | 强制删除镜像 |
podman save | 导出镜像 |
podman load | 导入镜像 |
podmanfile | 定制镜像(三个) |
podman build | 构建镜像 |
podman run | 运行镜像 |
podmanfile | 常用指令(四个) |
COPY | 复制文件 |
ADD | 高级复制 |
CMD | 容器启动命令 |
ENV | 环境变量 |
EXPOSE | 暴露端口 |
(3)安装 Podman
yum -y install podman
(4)Podman 加速器
① centos7配置加速器
//仓库配置
[root@localhost ~]# vim /etc/containers/registries.conf
[registries.search]
#registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"] #这个是查找,从这三个地方查找
registries = ["docker.io"] #如果只留一个,则只在一个源里查找
[[docker.io]]
location="XXX.mirror.aliyuncs.com"
② centos8配置加速器
#unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"] #直接注释掉
unqualified-search-registries = ["docker.io"] #添加一个docker.io
[[registry]]
prefix = "docker.io"
location = "XXX.mirror.aliyuncs.com" (不用加https:// 直接加地址)
4.docker
(1)概念
Docker是标准的容器管理技术。Docker在行业中举足轻重,以至于大多数人一想到容器,就会想到Docker。
Docker是容器编排世界的一把瑞士军刀,在其他替代方案出现之前就已经提供了诸多特性。随着容器管理复杂度的增加,它也必须成长为一个独立的、自给自足的工具,以便能提供开发人员的所有需求。
Docker也在很短的时间内,就成为All-in-one解决方案的关键工具之一。其中一款就是Docker Swarm,这是一款由Docker原生的,可以让你组建群集和调度Docker引擎,以及用来创建和管理容器群的解决方案。
Docker的诸多辅助工具处理所有与容器编排相关的任务,从负载均衡到网络,使其成为行业的首选,不光是作为行业技术参考。
尽管Docker是一个强大的系统,但这种自给自足的模式也有它的缺点。虽然可以在开发的所有阶段创建和运行容器,但其他工具在与Docker集成交互时或多或少存在些困难。
近年来,随着许多其他用于特定任务的专用工具的出现,Docker成为许多开发人员的起点,随之,他们将一些任务分配给其他更轻量级的平台和工具。
(2)核心
表3 docker核心
核心 | 功能 |
镜像 | Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。 |
库器 | Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。 可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。 |
仓库 | Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。 Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。 |
(4)基础命令
表4 docker基础命令
命令 | 功能 |
systemctl start docker | 启动docker |
systemctl stop docker | 关闭docker |
systemctl restart docker | 重启docker |
systemctl enable docker | docker设置随服务启动而自启动 |
systemctl status docker | 查看docker 运行状态 |
docker version | 查看当前安装的 Docker 的版本信息 |
docker info | 检查当前容器的安装情况(包括镜像数、容器书、多少个物理机节点) |
docker --help | docker 帮助命令 |
(5)常用命令
①容器声明周期相关命令:
表5 docker容器声明周期命令
命令 | 功能 |
docker run -d -p x:x --name xxx 镜像id | 以后台方式运行容器 |
docker create --name xxx nginx:latest | 创建一个新的容器,但是不启动 |
docker start/stop/restart | 启动\停止\重启一个容器 |
docker kill 容器id | 终止一个运行中的容器,kill 不管是否同意,直接强制终止 |
docker rmdocker rm docker rm -vf 容器id | 删除一个或者多个容器 |
docker execdocker exec docker exec -it id bash | 进入到容器内部 |
docker attach | 进入到容器内部 |
② 容器操作相关命令
表6 docker容器操作命令
命令 | 功能 |
docker ps -a | grep xxxx | 显示某一个组件 XXX 的容器列表 |
docker inspect docker inspect id | 获取容器或者镜像的元数据 |
docker top id | 查看容器中运行的进程信息 |
docker stats id | 实时显示容器资源的使用统计 |
docker events | 从服务器获取实时事件 |
docker logs id | 查看容器内的标准日志输出 |
docker port id | 列出指定容器的端口映射 |
docker cp ./t.txt id:/root/ | 将宿主机当前目录下的 t.txt 复制到 id 容器中的 root 目录下 |
docker diff id | 列出该容器自创建以来,容器内部文件的变化 |
docker commit -m "comment" -a "authon" 容器id repository:tag | 将指定容器打包成一个本地镜像 |
docker update --memory=16G | 修改容器运行中的配置,即时生效无需配置 |
③ 本地镜像管理相关命令
表7 docker本地镜像管理命令
命令 | 功能 |
docker images | 列出本地宿主机上的所有镜像 |
docker history id | 查看指定镜像的分层结构以及创建历史 |
docker image inspect id | 查看镜像的元数据信息 |
docker rmi id | 根据镜像 id 删除镜像 |
docker tag image-name:tag | 给指定镜像增加 tag |
docekr build -t tag . | 通过当前目目录下的 Dockerfile 来构建一个标签为 tag 的镜像 |
docker export -o xxx.tar id | 将镜像打包成文件 |
docker import xxx.tar name | 从归档文件中创建镜像 |
docker save -o xxx.tat id | 将指定镜像保存为归档文件 |
docker load --input xxx.tar | 用于将 docker save 生成的归档文件还原成镜像 |
④ 镜像仓库相关命令
表8 docker镜像仓库相关命令
命令 | 功能 |
docker loging -u xxx -p xxx | 登录一个 docker 镜像仓库,如果未指定镜像仓库地址,则默认为Docker Hub镜像仓库 |
docker logot | 退出登录的镜像仓库 |
docker pull nginx | 从默认的 Docker hub 上拉取 nginx 镜像 |
docker push image_name | 将本地镜像上传到镜像仓库(注意需要先登录) |
docker search xxx | 从默认的 Docker Hub 中搜索指定的镜像 |
⑤ docker run命令支持的相关参数:
1)容器运行相关参数:
表9 容器运行相关参数
参数 | 功能 |
-a,--attach=[] | 是否绑定到标准输入、输出、和错误. |
-d,--detach=true|false | 是否在后台运行,默认为 false |
--detach-keys="" | 从attach模式退出的快捷键,默认是 Ctrl+P |
--entrypoint="" | 镜像存在入口命令时覆盖新的命令. |
-expost=[] | 暴露出来的镜像端口 |
--group-add=[] | 运行容器的用户组 |
-i | 保持标准输入打开 |
--ipc="" | 容器 IP 命名空间 |
--isolation="default" | 容器使用的隔离机制 |
--log-driver="" | 指定容器的日志驱动类型 |
--log-opy=[] | 传递给日志驱动的选项 |
--net="bridge" | 指定容器的网络模式 |
--net-alias=[] | 容器在网络中的别名 |
--volume=[=[HOST-DIR]:]CONTAINER-DIR:[:OPTIONS]] | 挂载宿主机上的数据卷到容器内 |
--volume-driver="" | 挂载数据卷的驱动类型. |
--volumes-from=[] | 其他容器挂载数据卷 |
2)容器环境配置相关参数:
表10 容器环境配置相关参数
参数 | 功能 |
--add-host=[] | 在容器内添加一个宿主机名到 IP 地址的映射关系,修改 HOST 文件 |
--device=[] | 映射物理机上的设备到容器 |
--dns-search=[] | 指定容器 DNS 搜索域 |
--dns-opt=[] | 自定义的 DNS 选项 |
--dns=[] | 自定义的 DNS 服务器 |
-e,-env=[] | 指定容器内的环境变量 |
-env-file=[] | 从文件中读取环境变量到容器内 |
-h,--hostname="" | 指定容器中的主机名 |
--ip="" | 指定容器内 ip4 的地址 |
--ip6="" | 指定容器内 ip6 的地址 |
--link=[id] | 连接到其他容器,不需要其他容器暴露端口 |
--name=="" | 指定容器的别名 |
3)CPU 相关参数
表11 CPU 相关参数
参数 | 功能 |
--cpu-shares=0 | 允许容器使用 CPU 资源的相对权重,默认一个容器能用满一个 CPU,用于设置多个容器竞争 CPU 时,各个容器相对能分配到 CPU 时间占比 |
--cpu-period=0 | 限制容器在 CFS 调度下 CPU 占用的时间片,用于绝对设置容器能使用的 CPU 时间 |
--cpu-quota=0 | 限制容器在 CFS 调度器下的 CPU 配额,用于绝对设置容器能使用 CPU 的时间 |
--cpuset-cpus="" | 限制容器能使用那些 cpu 核数 |
--cpuset-mems="" | NUMA 架构下使用那些核心内存 |
4)内存资源相关参数
表12 内存资源相关参数
参数 | 功能 |
--kernel-memory="" | 限制容器使用内核的内存大小 |
-m,--memory="" | 限制容器内应用使用内存的大小 |
--memory-reservation="" | 当系统中内存过小时,容器会被强制限制内存到给定值默认情况下等于内存限制值 |
--memory-swap="LIMIT" | 限制容器使用内存和交换分区的大小 |
--oom-kill-disable=true | 内存耗尽时是否终止容器 |
--oom-score-adj="" | 调整容器的内存耗尽参数 |
--memory-swappiness="0-100" | 调整容器的内存交换分区参数 |
5)容器磁盘 IO 控制相关参数
表13 容器磁盘 IO 控制相关参数
参数 | 功能 |
--device-read-bps | 限制此设备上的读速率 |
--device-read-iops | 通过每秒读 IO 次数限制指定设备的读速率 |
--device-write-bps | 限制此设备的写速率 |
--device-write-iops | 通过每秒写 IO 次数限制指定设备的写速率 |
--blkio-weight | 容器默认磁盘 IO 的加权值 |
--blkio-weight-device | 针对特定设备的 IO 加权控制 |
(5)安装docker
①安装依赖包
1. #关闭防火墙和selinux
systemctl stop firewalld.service
setenforce 0
2.#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
-------------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
②设置阿里云镜像
1. #设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2. #安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io
3. #设置为开机自动启动
systemctl start docker.service
systemctl enable docker.service
1. #查看docker版本信息
docker version
2. #查看docker信息
docker info
③配置阿里云镜像加速器
1.浏览器访问
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
获取镜像加速器配置
2.配置镜像加速器
vim /etc/docker/daemon.json
添加自己的加速器地址
3.重新加载配置并重启服务
systemctl daemon-reload
systemctl restart docker
4.验证查看
docker info
5.podman与docker区别
(1)主要区别
Podman和Docker有许多共同的特性,但也有一些根本的区别。
podman不需要守护进程,而dorker需要守护进程。dorcker的containerd-shim与podman的common被归在Container一层。
表7 podman与docker区别
区别 | Podman | Docker |
架构 | Podman是无守护进程的架构,这意味着它可以在启动容器的用户下运行容器。Podman不需要此类守护进程。 | Docker使用守护进程,一个正在后台运行的程序,来创建镜像和运行容器。 Docker有一个由守护进程引导的客户端——服务器逻辑架构。 |
Root特权 | 由于Podman没有守护进程来管理其活动,也无需为其容器分配Root特权。 | Docker最近在其守护进程配置中添加了Rootless模式,但Podman首先使用了这种方法,并将其作为基本特性进行了推广。 |
安全 | Podman允许容器使用Rootless特权。Rootless容器被认为比Root特权的容器更安全。Podman中的容器默认情况下不具有Root访问权限,这在Root级别和Rootless级别之间添加了一个自然屏障,提高了安全性。不过,Podman可以同时运行Root容器和Rootless容器。 | 在Docker中,守护进程拥有Root权限,这使得它们易成为攻击者的首选入侵点。 |
Systemd | 如果没有守护进程,Podman需要另一个工具来管理服务并支持后台运行的容器。Systemd为现有容器创建控制单元或用来生成新容器。Systemd还可以与Podman集成,允许它在默认情况下运行启用了Systemd的容器,从而无需进行任何修改。通过使用Systemd,供应商可以将他们的应用程序封装为容器用来安装、运行和管理,因为现在大多数应用程序都是通过这种方式打包和交付的。 | |
构建镜像 | Podman则需要另一种名为Buildah的工具的辅助,该工具充分体现了它的特殊性:它是为构建镜像而设计的,而不是为构建容器而生。 | 作为一款自给自足的工具,Docker可以自己构建容器镜像。 |
Docker Swarm | Podman不支持Docker Swarm,这可能会在某些项目中被刨除在外,因为使用Docker Swarm命令会产生一个错误。然而,Podman最近增加了对Docker Compose的支持,使其与Swarm兼容,从而克服了这个限制。 | Docker由于其原生的特性,与Swarm当然融合得很好。 |
All in one vs 模块化(关键区别) | Podman采用模块化的方法,依靠专门的工具来完成特定的任务。 | Docker是一个独立的、强大的工具,在整个循环中处理所有的容器化任务,有优点也有缺点。 |
二、实验
1.部署podman
(1)yum安装podman
(2)查看版本信息
(3)配置podman加速器
(4)验证查看
2.部署docker
(1)yum安装docker依赖包
(2)设置阿里云镜像源
yum安装docker
设置为开机自动启动
(3)查看docker版本信息
(4)配置阿里云镜像加速器
①浏览器访问
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
获取镜像加速器配置
②配置镜像加速器
③ 重新加载配置并重启服务
④验证查看
三、总结
QEMU模拟IO设备(网卡,磁盘等),KVM负责cpu虚拟化+内存虚拟化。
podman不需要守护进程,而dorker需要守护进程。
podman采用模块化的方法,依靠专门的工具来完成特定的任务。
docker是一个独立的、强大的工具,在整个循环中处理所有的容器化任务。