落日
2023-05-22 00:14 deepin
podman这算是薅docker的羊毛吗
Reply Like 0 View the author
podman这算是薅docker的羊毛吗
wow,膜拜大佬
点赞,收藏了。
点赞,收藏了。
感谢支持
wow,膜拜大佬
过奖了
据说使用 podman 需要配置仓库,怎么配置仓库?麻烦楼主给讲下。
据说使用 podman 需要配置仓库,怎么配置仓库?麻烦楼主给讲下。
deepin 23 上官方源里就有,不用配置仓库
deepin 20 则需要到上游仓库下载安装:https://github.com/containers/podman/releases/latest
deepin 23 上官方源里就有,不用配置仓库
deepin 20 则需要到上游仓库下载安装:https://github.com/containers/podman/releases/latest
我是说容器仓库,搜索下载容器的地址。
我可以分享到wiki吗
我是说容器仓库,搜索下载容器的地址。
这个据我所知 Docker / Podman 命令行本身没有线上容器仓库、镜像搜索功能,需要自行上百度搜索
常见的容器仓库有 Docker Hub (docker.io)、红帽容器仓库 quay.io、GitHub 容器仓库 ghcr.io,然后公有云上也一般提供公共及私人仓库服务
我可以分享到wiki吗
当然可以,感谢您的支持
Hello,I find you QR Code,Can you pass my post?
Hello,I find you QR Code,Can you pass my post?
阿白您好,您的意思我没太看懂,有什么需要可随时私信我哈 ~
Popular Events
More
此前在论坛上分享 deepin 23 上基于 Distrobox 及 Podman 的 deepin 20 兼容方案时,有坛友反馈他们相对于 Podman 一般比较熟悉 Docker,希望能出一期 Podman 的教程;刚好我今天有空,就弄一个 Podman 及容器技术的教程吧
教程对象
对电脑及 Linux 技术有兴趣的坛友,本教程假设您对虚拟化的概念有基本的认知,最好之前接触过 VirtualBox 或相关技术
容器概述
容器是一种轻量的虚拟化技术;相对于虚拟机,容器一般并不尝试虚拟化硬件及操作系统内核,只虚拟化文件系统、进程、网络等系统组件(俗称用户空间);因此容器的镜像大小及启动时间大大缩短,启动时间从几秒到几十秒不等缩短到约一秒甚至以毫秒计
(以上图片取自 Docker 官网: https://www.docker.com/wp-content/uploads/2021/11/docker-containerized-and-vm-transparent-bg.png )
当然,容器也有其弊端:由于容器一般不选择虚拟化硬件、操作系统内核,因此跟宿主系统及其他容器的隔离不及虚拟机;故容器遭遇入侵攻击时,黑客从容器跳到宿主系统继续攻击的难度相对较易
容器技术在 Linux 上最为活跃及成熟,但容器概念本身并不限于 Linux,其他操作系统也有类似的概念与技术:
Podman 概述
Podman 是一个用于创建及管理个别容器的引擎及客户端,一般适合个人用户及开发者使用。另外一个常用的容器引擎是 Docker,在此就不详细阐述了
相对于 Docker,Podman 拥有以下优势:
root
用户运行,故管理容器需要使用sudo
提权或把相关用户加到docker
群组,而且容器里的root
尽管受到各种限制也是宿主系统的root
,故有安全隐患;Podman 则不依靠root
运行的服务,故一般用户能直接创建管理容器,而且非root
运行的容器里,容器里的root
用户在宿主系统上只是一般用户(例如nobody
),故黑客倘若控制了容器里的root
再逃到宿主系统后也只是普通用户,故不能轻易对宿主系统进行破坏,这样更安全;从用户及开发者的角度看,Podman 客户端跟 Docker 客户端大体上一样,大部分简单情况下把命令里的
docker
替换为podman
即可,但未必适用于一些更复杂的情况初尝 Podman
本教程假设您在 deepin 23 上操作,若您在使用 deepin 20 或其他 Linux 发行版,则可能需要修改相应操作细节与命令
本教程不适用于非 Linux 操作系统,例如:Windows,但 Windows (或苹果等等)的用户也可以透过创建 deepin 23 虚拟机,在虚拟机内跟随教程操作
安装 Podman
deepin 23 源里有 Podman 软件包,名称为
podman
,调用 APT 安装即可:安装后可验证
podman
命令的存在及查询版本:输出:
Podman 您好
让我们快速创建及运行一个 Hello World 容器吧:
输出:
从输出里可以看到,Podman 做了以下事情:
docker.io/library/hello-world:latest
不在本地仓库里,所以 Podman 根据镜像全名从网上下载了相关镜像hello-podman
(命令里--name hello-podman
选项)的容器并运行了它--rm
选项,该容器运行完毕后 Podman 会把它自动删掉(但镜像会保留)如果您细心阅读以上的英文输出,会发现输出提及 Docker Daemon,但其实使用 Podman 时 Docker Daemon 并不存在,所以可以忽略
容器镜像
容器镜像是创建运行容器的基础,其功能类似于 Word 模板,像容器这么复杂的东西总不能从零开始吧 ~
查询本地已下载的镜像使用
podman images
命令,输出如下:您的输出或许不完全一样,但是倘若在 deepin 23 上安装启动过 deepin 20 兼容方案并运行了刚才的 Hello World 容器,则应该起码有以上三行输出
让我们看看每个列的意义吧:
REPOSITORY
:指镜像的全名称,repository 直译是「仓库」的意思。镜像全名一般分为三个部分,如docker.io/library/hello-world
可拆分为以下三个组件:docker.io
是镜像仓库的名称,这里指的是 Docker Hub,一些其他的例子有 GitHub 仓库ghcr.io
、红帽的quay.io
仓库,很多公有云如阿里云也有自己的镜像仓库,或者您也可以考虑搭建自己的镜像仓库library
是用户或机构的名称,例如:library
、donaldsebleung
、tetratelabs
hello-world
是镜像的名称,例如:hello-world
、nginx
、busybox
TAG
是镜像的版本,例如:v20.8-compatible
、latest
、22.04
IMAGE ID
是镜像的哈希,可用于验证镜像下载后的完整CREATED
是镜像创建的时间SIZE
是镜像的总大小我们也可以下载、删除、创建及上传镜像,其中下载及删除操作相对较简单,这里就先看这两个操作吧 ~
下载镜像
下载镜像可用
podman pull <镜像名称>:<镜像版本>
命令,例如下载docker.io/library/nginx
镜像的1.24
版本,命令如下:输出:
再查看本地的镜像,可以看到刚才的下载成功了:
删除镜像
删除镜像使用
podman image rm <镜像名称>:<镜像版本>
命令,让我们删除刚才的hello-world
镜像吧:再查看本地镜像,发现
hello-world
消失了,如我们预期一样:运行容器
学习如何创建、上传镜像前,让我们先学习如何运行容器吧 ~
运行容器基本方法使用
podman run <镜像名称>:<镜像版本>
命令,也建议添加--name <容器名称>
选项给容器起个名字,不然 Podman 会自动给容器起个奇怪中规中矩的名字,例如创建一个名为hello-podman
的容器,使用刚才的docker.io/library/hello-world
镜像,latest
版本:输出还是刚才 Hello World 的一大堆输出
然后用
podman ps
命令查看正在运行的容器(这里ps
是英文 processes 的缩写,指「进程」),返回结果为空:添加
-a
选项后能看到运行及已停止的容器:这里最后一行输出是刚才名为
hello-podman
的容器,看到它状态STATUS
为Exited
,即它已经运行完毕,运行的命令COMMAND
路径为/hello
删掉容器使用
podman rm <容器名称>
命令:运行 NGINX Web 服务器
刚才学习下载镜像时弄了个 NGINX 镜像,让我们基于这个镜像跑一个 Web 服务器吧 ~
跟刚才的 Hello World 程序不同,Web 服务器是长期后台运行的而且需要调用到网络
科普一下,Web 服务器一般为 HTTP 或 HTTPS 服务器,HTTP 服务的默认端口是 80,使用 TCP 协议
可是容器里的网络跟宿主的网络不同,而且宿主的网络打开
80/tcp
端口需要管理员权限,这样就抵消了 Podman 的安全性了让我们创建一个名为
my-web-server
的 NGINX 容器,并添加以下选项:-d
选项让 Podman 在后台运行该容器,不要占用终端-p 8080:80
是端口映射,意思是打开宿主的8080/tcp
端口(不需要管理员权限),然后把访问该端口的请求转发到容器里的80/tcp
端口,则 HTTP 服务端口您可以用
podman ps
命令确认该容器正在运行,然后打开浏览器访问 http://localhost:8080/ 验证结果:验证后,用
podman stop <容器名称>
命令停掉服务器:然后再移除该容器:
创建并上传自己的容器镜像
既然运行容器需要用到镜像,那镜像是怎么来呢?让我们创建并上传自己的镜像以回答这个问题吧 ~
首先创建一个
hello-deepin23-podman
目录并cd
进去:然后在该目录创建个
index.html
文档并输入以下 HTML 代码:创建容器镜像主要有两个部分:
index.html
Dockerfile
让我们写个
Dockerfile
吧,稍后解释:这个
Dockerfile
一共四行:FROM docker.io/donaldsebleung/linuxdeepin-apricot:v20.8-compatible
指示 Podman 从docker.io/donaldsebleung/linuxdeepin-apricot
的v20.8-compatible
版本底层镜像开始创建我们的新镜像 —— 容器镜像一般是一层层构建起来的,就像一颗洋葱WORKDIR /app
指示 Podman 往上加一层,并把新一层镜像的工作目录设置为/app
COPY index.html .
指示 Podman 再添加一层,并把index.html
文档拷到镜像里的工作目录.
下CMD ["python3", "-m", "http.server", "80"]
指示 Podman 往上再添加一层,并把基于该镜像创建的容器的默认命令设置为python3 -m http.server 80
然后用
podman build -t <镜像名称>:<镜像版本> <项目根目录>
命令基于源代码及Dockerfile
创建我们的镜像:这里我们选择了给镜像一个简单的名称
hello-deepin23-podman
,版本0.1.0
,项目根目录是工作目录.
;当镜像只供本地使用,不打算上传时,镜像名称不一定要严格遵循<仓库>/<个人或机构名称>/<镜像名称>
格式该镜像跟 NGINX 类似,两者都是后台长期运行的 Web 服务器,让我们运行这个服务器吧:
如同刚才 NGINX 的做法,我们打开浏览器造访 http://localhost:8080/ 看看:
验证后把容器停掉、删除,我们接着学习如何把镜像上传到仓库里:
上传容器镜像
把镜像上传前,我们要选择上传到哪个仓库以及确认对该仓库有上传权限。由于 Docker Hub 是免费的,我们就把镜像上传到 Docker Hub 吧 ~
Docker Hub 的仓库地址是
docker.io
,要取得上传权限得先到 https://hub.docker.com/ 创建账号假设您刚创建账号,账号名称是
student
,让我们把账号名称存到环境变量中吧,例如:以上把
student
换成您的 Docker Hub 用户名称把自创建镜像上传到仓库前,镜像名称必须严格遵守
<仓库>/<个人或机构名称>/<镜像名称>
格式,用podman tag <镜像旧名称>:<镜像旧版本> <镜像新名称>:<镜像新版本>
命令重新命名镜像(其实是给镜像起个新名称):然后上传镜像前需要验证身份,用
podman login --username <用户名称> <仓库>
命令登录并输入密码:看到
Login Succeeded!
输出则代表登录成功然后用
podman push <镜像名称>:<镜像版本>
命令把我们的镜像推到 Docker Hub 上:恭喜您!您成功把自己创建的镜像上传到 Docker Hub 分享出去!
最后记得用
podman logout <仓库>
命令注销 Docker Hub 账号:继续探索
刚才看到了,直接调用 Podman 客户端运行单一个容器也相当不简单。如果要运行更复杂的程序,例如一个依赖 MySQL 数据库的 Web 服务器,则您需要考虑以下的问题:
因此在生产环境中,光一个容器引擎是远远不足的 —— 我们需要一个更强大的容器编排工具,以高度弹性、可靠、自动化的方式实时管理大量的容器
目前在容器编排工具市场中占绝对主导地位的是 Kubernetes ,俗称 K8s,也有其他的容器编排工具:
若欲深入了解容器技术,进军互联网行业,那培训考取 K8s 认证是必须的,详情就不多说了,有兴趣可自行探索:https://kubernetes.io/training/
最后感谢大家的支持,希望该教程引起您对容器技术的兴趣