Docker 和 Podman的区别

文章目录

  • Docker 和 Podman的区别
    • 安装
    • 架构和特权要求
    • 运行容器方面
    • 安全性(root的权限)
    • 镜像管理方面
    • 命令方面
      • Docker常用命令
      • Podman常用命令

Docker 和 Podman的区别

安装

Docker安装:官方文档

Podman安装:官方文档

架构和特权要求

image-20240415183715593

Docker使用client-server架构,其中Docker daemon(服务端)在后台以root权限运行,并通过Docker客户端与之交互。这意味着使用Docker需要root权限或者给用户添加到docker用户组中

[root@docker ~]# ps -ef |grep docker
root        5131       1  0 16:30 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock   # Docker deamon
root        5768    3870  0 18:27 pts/0    00:00:00 grep --color=auto docker

[csq@docker ~]$ sudo docker version
Client: Docker Engine - Community  # 要使用这个Client需要root权限或者给用户添加到docker用户组里
 Version:           26.0.1
 API version:       1.45
 Go version:        go1.21.9
 Git commit:        d260a54
 Built:             Thu Apr 11 10:54:59 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community   # 这个就是docker deamon,就是后台启用的进程
 Engine:
  Version:          26.0.1
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.9
  Git commit:       60b9add
  Built:            Thu Apr 11 10:53:19 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.31
  GitCommit:        e377cd56a71523140ca6ae87e30244719194a521
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Podman是一个无守护进程的容器运行时,可以在非特权用户下运行,无需特殊权限

[csq@podman ~]$ ps -ef |grep podman  # podman无守护进程(daemon)
csq         5445    5411  0 18:53 pts/0    00:00:00 grep --color=auto podman
[csq@podman ~]$ podman version
Client:       Podman Engine
Version:      4.9.4-dev
API Version:  4.9.4-dev
Go Version:   go1.21.7 (Red Hat 1.21.7-1.el9)
Built:        Wed Mar 20 18:22:46 2024
OS/Arch:      linux/amd64

运行容器方面

docker

[csq@docker ~]$ sudo docker run -it busybox  # 普通用户要加上sudo才行
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
7b2699543f22: Pull complete 
Digest: sha256:c3839dd800b9eb7603340509769c43e146a74c63dca3045a8e7dc8ee07e53966
Status: Downloaded newer image for busybox:latest
/ # ls
bin    dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # 

podman

[csq@podman ~]$ podman run -it busybox       # 普通用户可以直接执行            
Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 7b2699543f22 done   | 
Copying config ba5dc23f65 done   | 
Writing manifest to image destination
/ # ls
bin    dev    etc    home   lib    lib64  proc   root   run    sys    tmp    usr    var
/ # 

安全性(root的权限)

Docker在默认配置下需要root权限或者特权用户访问,这会增加潜在的安全风险。但可以通过配置用户命名空间和其他安全措施来提高安全性

[demo@docker ~]$ groups   # demo用户在docker组里
demo docker
[demo@docker ~]$ sudo more /etc/sudoers  # 不具有sudo的权限
[sudo] demo 的密码:
demo 不在 sudoers 文件中。此事将被报告。
[demo@docker ~]$ docker version  # 可以执行docker命令
Client: Docker Engine - Community
 Version:           26.0.1
 API version:       1.45
 Go version:        go1.21.9
 Git commit:        d260a54
 Built:             Thu Apr 11 10:54:59 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.0.1
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.9
  Git commit:       60b9add
  Built:            Thu Apr 11 10:53:19 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.31
  GitCommit:        e377cd56a71523140ca6ae87e30244719194a521
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
# 将sudoers文件挂载出来,并把自己添加到sudoers当中
[demo@docker ~]$ docker run -it -v /etc/sudoers:/root/sudoers busybox sh
/ # cd /root/
~ # ls
sudoers
~ # more sudoers 
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
csq     ALL=(ALL)       ALL
~ # vi  sudoers   # 将自己添加进去
demo    ALL=(ALL)       ALL
~ # exit
[demo@docker ~]$ sudo more /etc/sudoers   # 之前不可以查看sudoer,现在就可以查看了  
[sudo] demo 的密码:
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
csq     ALL=(ALL)       ALL
demo    ALL=(ALL)       ALL

配置用户命名空间

Docker提供了一种称为用户命名空间的安全功能,它使得一个容器中的进程可以运行在一个虚拟的UID/GID空间中,从而将容器中的特权进程与主机系统分离出来,提高容器的安全性

# 第一步:在Docker daemon配置文件(/etc/docker/daemon.json)中加入用户命名空间的配置
{
   "userns-remap": "default"
}
# 这将配置Docker运行用户命名空间,并将容器内的UID/GID映射到主机上的一个非特权用户(default)


# 第二步:配置/etc/subuid和/etc/subgid文件,这些文件定义了用户到UID/GID的映射关系
csq:100000:65536
demo:165536:65536
# 这条配置定义了dockremap用户的UID从100000开始,分配65536个UID
# 同样的,还要为该用户分配一个GID范围


# 第三步:重启Docker daemon,使得配置生效
systemctl restart docker.service
# 此时,Docker容器应用就运行在一个特定用户空间了。


# 第四步:验证用户命名空间
[demo@docker ~]$ docker run -it -v /etc/sudoers:/root/sudoers busybox sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
7b2699543f22: Pull complete 
Digest: sha256:c3839dd800b9eb7603340509769c43e146a74c63dca3045a8e7dc8ee07e53966
Status: Downloaded newer image for busybox:latest
/ # more /root/sudoers 
more: /root/sudoers: Permission denied  # 看不到了
/ # 


# 如果还是希望root用户来启动容器呢,可以使用--userns=host来解决
[demo@docker ~]$ docker run -it --userns=host  -v /etc/sudoers:/root/sudoers busybox sh 
/ # more /root/sudoers 
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
csq     ALL=(ALL)       ALL
# 此时,容器root用户映射到宿主root用户,容器普通用户映射到宿主普通用户
# 等同于不使用User Namespace的默认情况

Podman可以在非特权用户下运行,并使用用户命名空间、Linux安全模块(如SELinux)等技术来提供更强的容器安全性

[csq@podman ~]$ podman run -it -v /etc/sudoers:/root/sudoers busybox sh
/ # cd /root/
~ # ls
sudoers
~ # more sudoers   # 无法进行修改
more: sudoers: Permission denied

镜像管理方面

Docker可以通过Docker Hub等公共或私有镜像仓库来获取和分享镜像

[csq@docker ~]$ sudo docker pull nginx
[sudo] csq 的密码:
Using default tag: latest
latest: Pulling from library/nginx
13808c22b207: Pull complete 
6fcdffcd79f0: Pull complete 
fbf231d461b3: Pull complete 
c9590dd9c988: Pull complete 
b4033143d859: Pull complete 
abaefc5fcbde: Pull complete 
bcef83155b8b: Pull complete 
Digest: sha256:9ff236ed47fe39cf1f0acf349d0e5137f8b8a6fd0b46e5117a401010e56222e1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest  # 通过Docker Hub获取镜像

与Docker兼容的Podman可以直接使用Docker镜像,但它还支持OCI(Open Container Initiative)标准的镜像

[csq@podman ~]$ podman pull nginx
? Please select an image: 
  ▸ registry.access.redhat.com/nginx:latest  # 通过上下左右来确定通过哪个registry拉取image
    registry.redhat.io/nginx:latest
    docker.io/library/nginx:latest
✔ docker.io/library/nginx:latest      # 选择Docker Hub仓库来获取镜像
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob abaefc5fcbde done   | 
Copying blob 13808c22b207 done   | 
Copying blob fbf231d461b3 done   | 
Copying blob 6fcdffcd79f0 done   | 
Copying blob c9590dd9c988 done   | 
Copying blob b4033143d859 done   | 
Copying blob bcef83155b8b done   | 
Copying config c613f16b66 done   | 
Writing manifest to image destination
c613f16b664244b150d1c3644cbc387ec1fe8376377f9419992280eb4a82ff3b

命令方面

命令方面的话docker和podman两个命令提供的功能大差不差

如果习惯docker,还想使用podman可以使用【alias docker=podman】命令别名

[csq@podman ~]$ alias docker=podman

Docker常用命令

管理容器(Containers):

  • docker create:创建一个新的容器但不启动它。

  • docker run:创建并启动一个新的容器。

  • docker start:启动一个或多个已经创建的容器。

  • docker stop:停止一个或多个正在运行的容器。

  • docker restart:重启一个或多个容器。

  • docker pause:暂停一个容器的所有进程。

  • docker unpause:取消暂停一个容器的所有进程。

  • docker kill:杀死一个或多个正在运行的容器。

  • docker rm:删除一个或多个容器。

管理镜像(Images):

  • docker images:列出本地主机上的镜像。

  • docker pull:从远程仓库下载一个镜像。

  • docker build:从Dockerfile构建一个镜像。

  • docker push:将一个本地镜像上传到仓库。

  • docker rmi:删除一个或多个本地镜像。

管理容器资源:

  • docker exec:在运行中的容器中执行命令。

  • docker cp:在容器与本地文件系统之间复制文件。

  • docker logs:查看容器的日志输出。

  • docker stats:显示容器资源的实时统计信息。

管理容器网络(Networking):

  • docker network ls:列出所有网络。

  • docker network create:创建一个网络。

  • docker network connect:将容器连接到一个网络。

  • docker network disconnect:将容器从一个网络断开。

其他常用命令:

  • docker version:显示Docker客户端和服务器的版本信息。

  • docker info:显示Docker系统信息,包括容器、镜像和存储的详细信息。

  • docker inspect:检查容器或镜像的详细配置信息。

Podman常用命令

  • attach: 连接到正在运行的容器以查看其输出和日志。
  • build: 使用 Containerfiles 中的指令构建一个镜像。
  • commit: 基于已更改的容器创建新的镜像。
  • compose: 通过外部提供者(如 docker-compose 或 podman-compose)运行 compose 工作负载。
  • diff: 显示对象文件系统的更改。
  • events: 显示 Podman 系统事件。
  • generate: 基于容器、Pods 或卷生成结构化数据。
  • healthcheck: 管理容器的健康检查。
  • history: 显示指定镜像的历史记录。
  • init: 创建一个或多个容器,但不启动它们。
  • kube: 从结构化文件中运行容器、Pods 或卷。
  • machine: 管理虚拟机。
  • manifest: 操作清单列表和镜像索引。
  • mount: 挂载工作容器的根文件系统。
  • network: 管理网络。
  • port: 列出容器的端口映射或特定映射。
  • push: 将镜像推送到指定的目标。
  • rename: 重命名一个现有容器。
  • rmi: 从本地存储中删除一个或多个镜像。
  • save: 将镜像保存到存档文件中。
  • search: 在镜像仓库中搜索镜像。
  • secret: 管理密钥。
  • tag: 为本地镜像添加额外的名称。
  • unshare: 在修改过的用户命名空间中运行命令。
  • version: 显示 Podman 的版本信息。
  • volume: 管理卷。

内容参考:

https://www.bilibili.com/video/BV1YU4y1p7jG/

https://zhuanlan.zhihu.com/p/607509062#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/556708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11、电科院FTU检测标准学习笔记-越限及告警上送功能

作者简介: 本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验 在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验 ———————————————————…

git 快问快答

我在实习的时候,是用本地开发,然后 push 到 GitHub 上,之后再从 Linux 服务器上拉 GitHub 代码,然后就可以了。一般程序是在 Linux 服务器上执行的,我当时使用过用 Linux 提供的命令来进行简单的性能排查。 在面试的时…

详解爬虫基本知识及入门案列(爬取豆瓣电影《热辣滚烫》的短评 详细讲解代码实现)

目录 前言什么是爬虫? 爬虫与反爬虫基础知识 一、网页基础知识 二、网络传输协议 HTTP(HyperText Transfer Protocol)和HTTPS(HTTP Secure)请求过程的原理? 三、Session和Cookies Session Cookies Session与…

抖音小店流量差怎么办?做好这三大细节,就可以完美解决!

大家好,我是电商糖果 很多刚开店的朋友,遇到的第一个难题就是店铺流量差。 没有流量,也就不会出单,更别提起店了。 糖果做抖音小店四年多了,也开了很多家小店。 很多新店没有流量,其实主要原因是这三个…

在mysql函数中启动事物和行锁/悲观锁实现并发条件下获得唯一流水号

业务场景 我有一个业务需求:我有一个报卡表 report里面有一个登记号字段 fcardno、地区代码 faddrno和发病年份 fyear,登记号由**“4位地区代码”“00”“发病年份”“5位流水号”**组成,我要在每次插入一张报卡(每一行数据&#…

【MATLAB源码-第46期】基于matlab的OFDM系统多径数目对比,有无CP(循环前缀)对比,有无信道均衡对比。

操作环境: MATLAB 2022a 1、算法描述 OFDM(正交频分复用)是一种频域上的多载波调制技术,经常用于高速数据通信中。以下是关于多径数目、有无CP(循环前缀)以及有无信道均衡在OFDM系统中对误码率的影响&am…

自如电费均摊问题

3月份搬了次家,嫌麻烦租了自如,第一个月的电费账单出来了,由于我是中途搬进去的,于是乎就好奇他会如何计算均摊,这个月电费账单出来了,算了下发现了点东西。 先说结论:按照我的这个均摊的方式&a…

刻度清晰耐酸碱腐蚀PFA材质实验室用塑料量具特氟龙量筒量杯

PFA量筒为上下等粗的直筒状,特氟龙量杯是上大下小的圆台形,底座均有宽台设计,保证稳定性,两者均可在实验室中作为定量量取液体的量具,上沿一侧有弧嘴设计,便于流畅地倾倒液体。 规格参考:5ml、…

主线程捕获子线程异常

正常情况下使用多线程出现异常时,都是按照单个任务去处理异常,在线程间不需要通信的情况下,任务之间互不影响,主线程也不必知道子线程是否发成异常。 那么只需要处理子线程异常即可 Task.Run(() > {try{throw new Exception(&…

【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站

您是否也觉得 Vision Pro 应用程序商店经常一遍又一遍地展示相同的几个 VisionOS 应用程序?许多有趣、好玩的应用程序似乎消失得无影无踪,让人很难发现它们。为了帮助大家更轻松地探索和体验最新、最有趣的 Vision Pro 应用程序,这里分享一个网站https://www.findvisionapp.…

IDEA @Autowired不显示红线

IDEA 中,Autowired 显示红线一般情况是注入 Mapper 或者 Dao 时出现的,如下图: 这个报错是因为 Mapper 或者 Dao 上没有加 Repository 或者 Mapper,Autowired 注入时就判断为这不是一个 Bean。 不建议通过加上面两个注解的方式解…

Java面试八股之hashCode()和equals()方法的重要性

hashCode()和equals()方法的重要性 逻辑判断:equals()方法用于定义对象逻辑上的相等标准,即当两个对象在业务意义上被视为“相同”时,equals()应返回true。 哈希表支持:hashCode()返回一个整数哈希码,用于在哈希表&a…

【电路笔记】-数字逻辑门总结

数字逻辑门总结 文章目录 数字逻辑门总结1、概述2、逻辑门真值表3、总结 数字逻辑门有三种基本类型:与门、或门和非门。 1、概述 我们还看到,数字逻辑门具有与其相反或互补的形式,分别为“与非门”、“或非门”和“缓冲器”,并且…

AIGC的崛起:定义未来内容创作的新纪元

🌟文章目录 🌟AIGC简介🌟 AIGC的相关技术与特点🌟AIGC有哪些应用场景?🌟AIGC对其他行业影响🌟面临的挑战与问题🌟AIGC未来发展 🌟AIGC十大热门网站推荐: 文心…

常用的7个免费ChatGPT网站

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

2022天梯赛 L3_2 关于深度优先搜索和逆序对的题应该不会很难吧这件事 【树上逆序对计数】

传送门:https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582895035215872?type7&page1 思路 观察发现,逆序对可以分成两类: 节点 u u u 和 v v v 有明确的父子关系(不一定是直属的直连边&#xff…

今天给大家推荐36套404页面模板

404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任。当用户访问不存在的页面时,服务器会返回404错误代码,并显示404页面。一个好的404页面可以帮助用户快速找到所需信息,并提升网站的用户体验。 以下是一些演示下载资…

Web3技术简介:重新定义互联网的未来

引言 在21世纪的数字时代,互联网已成为我们日常生活的不可或缺的一部分。然而,随着区块链和加密技术的快速发展,一个全新的互联网模型——Web3,正逐渐崭露头角。Web3不仅仅是技术的进步,它更是对传统互联网模型的挑战…

类和对象中阶3⃣️-默认成员函数(赋值运算符重载,取地址及 const取地址操作符重载等)

目录 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 5.4 重载流插入与流提取 流插入<<运算符重载 流提取运算符重载 6.日期类实现 7.const成员 8.取地址 及 const取地址操作符 重载 5.赋值运算符重载 5.1 运算符重载 C为了增强代码…

数仓建模—数据仓库初识

数仓建模—数据仓库初识 数据仓库之父Bill Inmon在1991年出版的"Building the Data Warehouse"一书中所提出的定义被广泛接受 数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integ…