当前位置:   article > 正文

docker、podman容器与虚拟机的区别_docker podman

docker podman

一、什么是容器?

	容器:一种虚拟化的方案,操作系统级别的虚拟化,只能运行相同或相似内核的操作系统,依赖于linux内核特征:namespace和cgroup(control group)
	容器是一个不依赖于操作系统,运行应用程序的环境。它通过Linux的Namespaces和Cgroups技术对应用程序进程进行隔离和限制的,Namespace的作用是隔离,它让应用进程只能看到该Namespace内的世界;而Cgroups 的作用是限制分配给进程的宿主机资源。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
	容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核。
  • 1
  • 2
  • 3

1.1、docker容器

	Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。简单来说就是将开发应用程序自动部署到容器的开源引擎。
	docker的目标:提供简单轻量的建模方式,只需要不到1秒钟实现容器docker化,同一台宿主机上可以运行多个docker容器,尽可能充分的利用内存资源;职责的逻辑分离;快速高效的开发生命周期,缩短代码从开发、测试部署上线运行的生命周期,让应用程序具有可移植性,在容器中开发、以容器的形式交互和分发,这样开发测试生产都使用相同的环境,也就避免了调试部署花销,这样就有效缩短上线的周期;鼓励使用面向服务的架构。
	docker使用场景:使用docker容器开发、测试、部署服务;创建隔离的运行环境(同一服务的不同版本可能服务于不同的用户,使用docker可以创建不同的生产环境,运行不同的服务);搭建测试环境(利用docker在本地搭建测试环境,用来测试程序在不同的系统下的兼容性);构建多用户的平台即服务(PaaS)服务;提供软件即服务(SaaS)应用程序;高性能、超大规模的宿主机部署。
  • 1
  • 2
  • 3

1.1.1、docker的基本组成

docker client客户端
C/S架构    本地/远程
docker daemon守护进程
docker image镜像
镜像是容器的基础,容器基于镜像启动运行,层叠的只读文件系统、联合加载(union mount)
docker container容器
容器通过镜像启动,docker容器是docker的执行来源,容器中可以运行程序的一个和多个进程;迪庆和执行阶段;写时复制。
docker registry 仓库
docker Hub 查找镜像,搭建自己的镜像
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1.1.2、docker的容器能力

文件系统隔离:每个容器都有自已的root文件系统;
进程隔离:每个容器都运行在自己的进程环境中;
网络隔离:容器间的虚拟网络接口和IP地址都是分开的;
资源隔离和分组:使用cgroup将CPU和内存之类的资源独立分配给每个docker容器
  • 1
  • 2
  • 3
  • 4

1.1.3、docker容器中部署静态的网站–Nginx部署流程

创建映射80端口的交互式容器

docker run -p 80 --name web -it ubuntu /bin/bash
  • 1

安装Nginx

apt-get install -y nginx
  • 1

创建静态文本编辑器vim

apt-get install -y  vim
  • 1

创建静态页面

cd /  
mkdir html      vim index.html
  • 1
  • 2

修改Nginx配置文件

whereis nginx   //查找Nginx安装的位置
vi /etc/nginx/sites-enabled/default   //修改为root  /html
  • 1
  • 2

运行Nginx

Nginx
docker port web    docker top web  //查看端口映射
  • 1
  • 2

验证网站访问

curl http://127.0.0.1:32770
curl http://172.17.0.2
  • 1
  • 2

1.1.4、docker 容器数据卷

数据卷的特点:

数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这		些数据会拷贝到新初始化的数据卷中;
数据卷可以在容器质检共享和重用;
可以对数据卷里的内容直接进行修改;
数据卷的变化不会影响镜像的更新;
卷会一直存在,即时挂载数据卷的容器已经被删除
  • 1
  • 2
  • 3
  • 4
  • 5

1.2、podman容器

	Podman是一个由 RedHat 公司推出的无守护程序的容器引擎,用于在Linux系统上开发,管理和运行OCI容器。容器可以以root用户或无root权限模式运行。无root权限运行容器,能够使得容器更加安全。Podman 是一个开源的容器管理工具,用于开发、管理和运行OCI容器。Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。
  • 1

1.2.1、创建镜像

首先,我们将看看使用 Podman 创建镜像。让我们首先创建一个包含以下内容的 Dockerfile :

FROM centos:latest
RUN yum -y install httpd
CMD [ "/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80
  • 1
  • 2
  • 3
  • 4

现在让我们使用 build 命令创建镜像:

$ podman build .
  • 1

在这里,我们首先拉取 CentOS 的基本镜像,在其上安装 Apache ,然后将其作为前台进程运行,并暴露端口 80。我们可以通过运行这个镜像并将暴露的端口映射到主机端口来访问 Apache 服务器。build 命令递归地传递上下文目录中可用的所有文件夹。当没有指定目录时,当前工作目录默认成为构建上下文。因此, 建议不要在上下文目录中包含创建镜像不需要的文件和文件夹。

1.2.2、 列出可用镜像

podman images 命令列出所有可用的镜像。它还支持过滤镜像的各种选项

$ podman images
  • 1

此命令列出本地存储库中可用的所有镜像。它包含有关从哪个存储库中提取镜像、标签、其镜像 ID、创建时间和大小的信息。

REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/centos latest 0f3e07c0138f 2 months ago 227MB
  • 1
  • 2

<none 49030e844ce7 27 seconds ago 277MB

1.2.3、 运行镜像

podman run 命令创建指定镜像的容器,然后运行它。让我们运行上面创建的 CentOS 镜像。

$ podman run -p 80:80 -dit centos
  • 1

此命令首先检查是否有可用于 CentOS 的本地镜像。如果镜像不在本地,它会尝试从配置的注册表中拉取镜像。如果镜像不存在于注册表中,则会显示有关无法找到镜像的错误。
上面的 run 命令指定将容器暴露的 80 端口映射到主机的 80 端口, -dit 标志指定以分离和交互模式运行容器 。创建的容器的 id 将作为输出。

1.2.4、 删除镜像

podman rmi 命令删除本地存储库中存在的镜像。可以通过在输入中提供以空格分隔的 ID 来删除多个镜像。指定 -a 标志会删除所有镜像

$ podman rmi 785188cd988c
  • 1

1.2.5、 列出容器

可以使用 podman ps -a 命令列出所有可用容器,包括未运行的容器。与 podman images 命令类似,它也可以与各种选项一起使用。

$ podman ps -a
  • 1

上述命令的输出列出了所有容器的信息,例如创建它的镜像、启动命令、状态、正在运行的端口以及名称。

CONTAINER ID IMAGE COMMAND CREATED AT STATUS PORTS NAMES
eed30719cd37 centos /bin/bash 2019-12-09 02:57:37 +0000 UTC Up 14 minutes ago 0.0.0.0:80->80/udp, 0.0.0.0:80->80/tcp reverent_liskov
  • 1
  • 2

1.2.6、 删除容器

podman rm 命令删除容器。此命令不会删除处于运行或暂停状态的容器。需要先停止,然后再移除。

$ podman stop eed30719cd37
$ podman rm eed30719cd37
  • 1
  • 2

1.2.7、 创建 Pod

podman pod create 命令创建一个 pod 。 create 命令支持不同的选项。
$ podman pod create
pod create 命令默认创建一个带有 infra 容器的 pod,除非明确将 infra 标志设置为 false。
$ podman pod create --infra = false
Infra container 允许 Podman 连接 pod 中的各种容器。

1.2.8、 列出 Pod

podman pod list 命令显示所有可用的 pod
$ podman pod list
此命令的输出会显示 pod id、名称、关联容器的数量、infra 容器的 id 等信息:
POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID
7e0a68528aed gallant_raman Running 5 seconds ago 1 c6d06673c667

1.3、docker VS podman

在这里插入图片描述
Podman与Linux内核交互,通过runC容器运行时进程而不是Daemon来管理容器。Buildah实用程序用于替代Docker build作为容器镜像构建工具,Docker push被Skopeo替代,用于在注册表和容器引擎之间移动容器镜像。
podman的定位也是与docker兼容,因此在使用上面尽量靠近docker。在使用方面,可以分成两个方面来说,一是系统构建者的角度,二是使用者的角度。

在系统构建者方面,用podman的默认软件,与docker的区别不大,只是在进程模型、进程关系方面有所区别。如果习惯了docker几个关联进程的调试方法,在podman中则需要适应。可以通过pstree命令查看进程的树状结构。总体来看,podman比docker要简单。由于podman比docker少了一层daemon,因此重启的机制也就不同了。

在使用者方面,podman与docker的命令基本兼容,都包括容器运行时(run/start/kill/ps/inspect),本地镜像(images/rmi/build)、镜像仓库(login/pull/push)等几个方面。因此podman的命令行工具与docker类似,比如构建镜像、启停容器等。甚至可以通过alias docker=podman可以进行替换。因此,即便使用了podman,仍然可以使用http://docker.io作为镜像仓库,这也是兼容性最关键的部分。

在这里插入图片描述

架构

Docker使用守护进程,一个正在后台运行的程序,来创建镜像和运行容器。Podman是无守护进程的架构,这意味着它可以在启动容器的用户下运行容器。Docker有一个由守护进程引导的客户端——服务器逻辑架构;但Podman不需要此类守护进程。

Root特权

由于Podman没有守护进程来管理其活动,也无需为其容器分配Root特权。Docker最近在其守护进程配置中添加了Rootless模式,但Podman首先使用了这种方法,并将其作为基本特性进行了推广。原因如下。

安全

Podman比Docker安全吗?Podman允许容器使用Rootless特权。Rootless容器被认为比Root特权的容器更安全。在Docker中,守护进程拥有Root权限,这使得它们易成为攻击者的首选入侵点。

Podman中的容器默认情况下不具有Root访问权限,这在Root级别和Rootless级别之间添加了一个自然屏障,提高了安全性。不过,Podman可以同时运行Root容器和Rootless容器。

Systemd

如果没有守护进程,Podman需要另一个工具来管理服务并支持后台运行的容器。Systemd为现有容器创建控制单元或用来生成新容器。Systemd还可以与Podman集成,允许它在默认情况下运行启用了Systemd的容器,从而无需进行任何修改。
通过使用Systemd,供应商可以将他们的应用程序封装为容器用来安装、运行和管理,因为现在大多数应用程序都是通过这种方式打包和交付的。

构建镜像

作为一款自给自足的工具,Docker可以自己构建容器镜像。Podman则需要另一种名为Buildah的工具的辅助,该工具充分体现了它的特殊性:它是为构建镜像而设计的,而不是为构建容器而生。

Docker Swarm

Podman不支持Docker Swarm,这可能会在某些项目中被刨除在外,因为使用Docker Swarm命令会产生一个错误。然而,Podman最近增加了对Docker Compose的支持,使其与Swarm兼容,从而克服了这个限制。当然,Docker由于其原生的特性,与Swarm当然融合得很好。

All in one vs 模块化

也许这就是这两种技术的关键区别:Docker是一个独立的、强大的工具,在整个循环中处理所有的容器化任务,有优点也有缺点。Podman采用模块化的方法,依靠专门的工具来完成特定的任务。

二、什么是虚拟机?

虚拟机(VM)是共享一个服务器的物理资源的操作系统。它是主机硬件上的Guest,因此也被称为Guest虚拟机。

三、容器技术vs 虚拟机

运行的占用空间更少,只包含应用和依赖库(虚拟机还有操作系统),虚拟机需要模拟硬件的行为,对内存、CPU的损耗相当大,所以同样配置的服务器使用容器要比虚拟机能够提供更多的服务,服务更多的客户。
容器技术比较复杂,依赖linux的内核,不易安装、管理而实现自动化,而docker就是为了实现这一切。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/904072
推荐阅读
相关标签
  

闽ICP备14008679号