大家好,今天来介绍podman和docker优势(centos8 podman)的问题,以下是渲大师小编对此问题的归纳和整理,感兴趣的来一起看看吧!
新手带你手把手搭建podman
1、最近发现了一个新的虚拟机podman,据说是比Docker更好的工具,首先搜搜podman是什么,有什么优势
为什么说他比Docker好?
因为Docker总是会遇到一个反复出现且令人头痛的问题:“Docker 守护程序在多个核心上占用 100% CPU 资源,并导致主机无法正常使用。”
而Podman不需要守护程序,也不需要访问 root 权限组。Podman 能够替代大部分子命令(run, push, pull 等等)。由于不需要守护程序,而且会利用用户命宏仔名空间模拟容器中的 root,所以 Podman 不需要接入具有 root 权限的 socket——这就解决了 Docker 长期以来一直面临的老大难问题。
2、开始搭建
我们都需要哪些依赖才能正常使用Podman?
Podman —— Podman 能够替代大部分伏贺子命令(run, push, pull 等等)。由于不需要守护程序,而且会利用用户命名空间模拟容器中的 root,所以 Podman 不需要接入具有 root 权限的 socket,这就解决了 Docker 长期以来一直面临的老大难问题。
Buildah —— Buildah 负责构建 OCI 镜像。令人困惑的是,podman build 也能够用于构建 Docker 镜像,但其速度太慢而且默认使用 vfs 存储驱动的设置会占用大量磁盘空间缺绝派。相比之下,buildah bud(「利用 Dockerfile 构建」)对我来说速度更快,而且能够自动覆盖存储驱动。
Skopeo —— Skopeo 工具允许我们对 Docker 与 OCI 镜像执行 psuh、pull 以及 copy 等操作。
知道这些后,我们就可以开始安装了。
首先来安装POdman
Mac安装的命令是brew install podman
Linux为sudo yum -y install podman
这就装好了
CentOS8的podman容器
笔者在使用CentOS8时安装docker失败,于是发现CentOS8自带容器podman,podman的使用方法和docker类似,命令行基本相同。同时和docker相比,podman是无守护程序容器引擎( Daemonless ),不能通过守护进程去实现自动重启容器的功能,可以通过Systemd守护进程管理来开机启动容器。同时,podman也不需要sudo访问( Rootless )。
podman来运行nginx容器,命令和docker一样,而且笔者使用的是docker的官方镜像 docker.io/library/nginx。
1、podman搜索镜像,有registry.redhat.io和docker.io可以选择。
podman search nginx
2、podman拉取镜像
podman pull docker.io/library/nginx
3、查看镜像
podman images
4、运行容器,映射到宿主机8080端口哗宏洞。
podman run -itd --name podman-nginx -p 8080:80 docker.io/library/nginx
需要注意的是,笔者使用的是centos8,乱枯映射到小于1024端口时会提示错误:Error: failed to expose ports via rootlessport: "cannot expose privileged port 80, you might need to add \"net.ipv4.ip_unprivileged_port_start=0\" (currently 1024) to /etc/sysctl.conf, or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied\n" 。
这时需要选择一个大于等于1024的端口可以方便的解决。再绝缺次运行前需要将运行失败的容器删除podman rm podman-nginx ,不然会提示错误。
5、进入容器
podman exec -it podman-nginx bash
进入到nginx的根目录:/usr/share/nginx/html,可以找到index.php文件。
6、查看容器运行成功
怎么设置nginx容器开机启动呢?可以参考文章-Systemd添加.service服务并设置开机启动。
1、在/usr/lib/systemd/system目录下新建podman_nginx.service
[Unit]
Description=Podman Nginx Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/podman start -a podman-nginx
ExecStop=/usr/bin/podman stop -t 10 podman-nginx
Restart=always
[Install]
WantedBy=multi-user.target
2、systemctl enable设置开机启动
systemctl enable podman_nginx.service,激活开机启动
systemctl enable --now podman_nginx.service ,可以激活开机启动并启动服务。
在/etc/systemd/system/multi-user.target.wants/目录下可以看到这个链接文件。
Podman解析
什么是 Linux 容器?
Linux 容器是由 Linux 内核所提供的具有特定隔离功能的进程,Linux 容器技术能够让你对应用及其整个运行时环境(包括全部所需文件)一起进行打包或隔离。从而让你在不同环境(如开发、测试和生产等环境)之间轻松迁移应用的同时,还可保留应用的全部功能。
Linux 容器还有利于明确划分职责范围,减少开发和运维团队间的冲突。这样,开发人员可以全心投入应用开发,而运维团队则可专注于基础架构维护。由于 Linux 容器基于开源技术构建,还将便于你在未来轻松采用各类更新、更强的技术产品。包括 CRI-O、Kubernetes 和 Docker 在内的容器技术,可帮助你的团队有效简化、加速和编排应用的开发与部署。
什么是 Docker?
Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者可以打包他们的应用以及依模让赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 是目前最流行的 Linux 容源烂器解决方案,即使 Docker 是目前管理 Linux 容器的一个非常方便的工具,但它也有两个缺点:
Docker 需要在你的系统上运行一个守护进程。
Docker 是以 root 身份在你的系统上运行该守护程序。
这些缺点的存在可能有一定的安全隐患,为了解决这些问题,下一代容器化工具 Podman 出现了 。
什么是 Podman ?
Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。
Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。
Podman 官网地址:https://podman.io/
Podman 项目地址:https://github.com/containers/libpod
安装 Podman
Podman 目前已支持大多数发行版本通过软件包来进行安装,下面我们来举几个常用发行版本的例子。
Fedora / CentOS
$ sudo yum -y install podman
Ubuntu
$ sudo apt-get update -qq$ sudo apt-get install -qq -y software-properties-common uidmap$ sudo add-apt-repository -y ppa:projectatomic/ppa$ sudo apt-get update -qq$ sudo apt-get -qq -y install podman
MacOS
$ brew cask install podman
RHEL 7
$ sudo subscription-manager repos --enable=rhel-7-server-extras-rpms$ sudo yum -y install podman
Arch Linux
$ sudo pacman -S podman
更多系统的安装方法,可参考官雹码漏方文档:https://github.com/containers/libpod/blob/master/install.md
使用 Podman
使用 Podman 非常的简单,Podman 的指令跟 Docker 大多数都是相同的。下面我们来看几个常用的例子:
运行一个容器
$ podman run -dt -p 8080:8080/tcp \-e HTTPD_VAR_RUN=/var/run/httpd \-e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d \-e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf \-e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/ \registry.fedoraproject.org/f27/httpd /usr/bin/run-httpd
列出运行的容器
$ podman ps -a
分析一个运行的容器
$ podman inspect -l grep IPAddress\":"SecondaryIPAddresses": null,"IPAddress": "",
查看一个运行中容器的日志
$ sudo podman logs --latest10.88.0.1 - - [07/Feb/2018:15:22:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"
查看一个运行容器中的进程资源使用情况
$ sudo podman top UID PID PPID C STIME TTY TIME CMD 0 31873 31863 0 09:21 ? 00:00:00 nginx: master process nginx -g daemon off; 101 31889 31873 0 09:21 ? 00:00:00 nginx: worker process
停止一个运行中的容器
$ sudo podman stop --latest
删除一个容器
$ sudo podman rm --latest
以上这些特性基本上都和 Docker 一样,Podman 除了兼容这些特性外,还支持了一些新的特性。
给容器设置一个检查点
$ sudo podman container checkpoint
需要 CRIU 3.11 以上版本支持,CRIU 项目地址:https://criu.org/
根据检查点位置恢复容器
$ sudo podman container restore
迁移容器
Podman 支持将容器从一台机器迁移到另一台机器。
首先,在源机器上对容器设置检查点,并将容器打包到指定位置。
$ sudo podman container checkpoint -e /tmp/checkpoint.tar.gz$ scp /tmp/checkpoint.tar.gz :/tmp
其次,在目标机器上使用源机器上传输过来的打包文件对容器进行恢复。
$ sudo podman container restore -i /tmp/checkpoint.tar.gz
配置别名
如果习惯了使用 Docker 命令,可以直接给 Podman 配置一个别名来实现无缝转移。你只需要在 .bashrc 下加入以下行内容即可:
$ echo "alias docker=podman" >> .bashrc$ source .bashrc
Podman 如何实现开机重启容器
由于 Podman 不再使用守护进程管理服务,所以不能通过守护进程去实现自动重启容器的功能。那如果要实现开机自动重启容器,又该如何实现呢?
其实方法很简单,现在大多数系统都已经采用 Systemd 作为守护进程管理工具。这里我们就可以使用 Systemd 来实现 Podman 开机重启容器,这里我们以启动一个 Nginx容器为例子。
首先,我们先运行一个 Nginx 容器。
$ sudo podman run -t -d -p 80:80 --name nginx nginx
然后,在建立一个 Systemd 服务配置文件。
$ vim /etc/systemd/system/nginx_container.service[Unit]Description=Podman Nginx ServiceAfter=network.targetAfter=network-online.target[Service]Type=simpleExecStart=/usr/bin/podman start -a nginxExecStop=/usr/bin/podman stop -t 10 nginxRestart=always[Install]WantedBy=multi-user.target
接下来,启用这个 Systemd 服务。
$ sudo systemctl daemon-reload$ sudo systemctl enable nginx_container.service$ sudo systemctl start nginx_container.service
服务启用成功后,我们可以通过 systemctl status 命令查看到这个服务的运行状况。
$ sudo systemctl status nginx_container.service● nginx_container.service - Podman Nginx Service Loaded: loaded (/etc/systemd/system/nginx_container.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2019-08-20 20:59:26 UTC; 1min 41s ago Main PID: 845 (podman) Tasks: 16 (limit: 4915) Memory: 37.6M CGroup: /system.slice/nginx_container.service └─845 /usr/bin/podman start -a nginxAug 20 20:59:26 Ubuntu-dev.novalocal systemd[1]: Started Podman Nginx Service.
之后每次系统重启后 Systemd 都会自动启动这个服务所对应的容器。
其它相关工具
Podman 只是 OCI 容器生态系统计划中的一部分,主要专注于帮助用户维护和修改符合 OCI 规范的容器镜像。其它的组件还有 Buildah、Skopeo 等。
Buildah
虽然 Podman 也可以支持用户构建 Docker 镜像,但是构建速度比较慢。并且默认情况下使用 VFS 存储驱动程序会消耗大量磁盘空间。
Buildah 是一个专注于构建 OCI 容器镜像的工具,Buildah 构建速度非常快并使用覆盖存储驱动程序,可以节约大量的空间。
Buildah 基于 fork-exec 模型,不以守护进程运行。Buildah 支持 Dockerfile 中的所有命令。你可以直接使用 Dockerfiles 来构建镜像,并且不需要任何 root 权限。Buildah 也支持用自己的语法文件构建镜像,可以允许将其他脚本语言集成到构建过程中。
下面是一个使用 Buidah 自有语法构建的例子。
Buildah 和 Podman 之间的一个主要区别是:Podman 用于运行和管理容器, 允许我们使用熟悉的容器 CLI 命令在生产环境中管理和维护这些镜像和容器,而 Buildah 主用于构建容器。
项目地址:https://github.com/containers/buildah
Skopeo
Skopeo 是一个镜像管理工具,允许我们通过 Push、Pull和复制镜像来处理 Docker和符合 OCI 规范的镜像。
项目地址:https://github.com/containers/skopeo
延伸阅读
什么是 OCI?
OCI (Open Container Initiative),是一个轻量级,开放的治理结构(项目)。在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。
OCI 项目由 Docker、CoreOS 和容器行业中的其它领导者在 2015 年 6 月的时候启动,OCI 的技术委员会成员包括 Red Hat、Microsoft、Docker、Cruise、IBM、Google、Red Hat 和 SUSE 等。
什么是 CRI?
CRI(Container Runtime Interface)是 Kubernetes v1.5 引入的容器运行时接口,它将 Kubelet 与容器运行时解耦,将原来完全面向 Pod 级别的内部接口拆分成面向 Sandbox 和 Container 的 gRPC 接口,并将镜像管理和容器管理分离到不同的服务。
什么是 CNI?
CNI(Container Network Interface)是 CNCF 旗下的一个项目,是 Google 和 CoreOS 主导制定的容器网络标准。CNI 包含方法规范、参数规范等,是 Linux 容器网络配置的一组标准和库,用户可以根据这些标准和库来开发自己的容器网络插件。CNI 已经被 Kubernetes、Mesos、Cloud Foundry、RKT 等使用,同时 Calico、Weave等项目都在为 CNI 提供插件。
总结
本文介绍三个了符合 CRI 标准的容器工具 Podman、 Buildah 和 Skopeo。这三个工具都是基于 *nix 传统的 fork-exec 模型,解决了由于 Docker 守护程序导致的启动和安全问题,提高了容器的性能和安全。
参考文档
https://igene.tw/podman-intro
https://zhuanlan.zhihu.com/p/77373246
https://zhuanlan.zhihu.com/p/47706426
https://xuanwo.io/2019/08/06/oci-intro/
https://www.jianshu.com/p/62e71584d1cb
https://kubernetes.feisky.xyz/cha-jian-kuo-zhan/cri
https://blog.csdn.net/networken/article/details/98684527
https://www.zcfy.cc/article/demystifying-the-open-container-initiative-oci-specifications
Docker容器是什么它比虚拟机强在何处
Docker容器是一个开源的应用容器引擎,可以让开发者用统一的形式打包其自身的应用,然后包装到一个可以移植的容器中,随后发布到任何可以安装Docker引擎的服务器上(比如主流的Linux机器或者是Windows机器),当然也可以实现虚拟化。Docker容器几乎没有性能开销,可以很容易的在机器和数据中心运行,其最大的特色就是不依赖任何系统,框架甚至是语言。
由于容器是进程级的,相比于虚拟机有着很多庆态的优势
一:启动速度快:由于容器里面的应用软件,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以启动容器时,不是启动一整个操作系统,培态速度就快了很多。
二:资源占用少:相比于虚拟机而言,容器只占用需要的资源,不会去占有无效的资源,而虚拟机则是一个完整的操作系统,不可避免的占用了所有资源。
三:体积小,轻量级:容器只需要包含用到的组件,对比于虚拟机,容器文件要比虚拟机小很多配差源。
四:方便移动:容器技术最重要的就是为不同的主机上运行服务一个轻便,一致的格式。容器的格式更加标准化且方便客户对工作负载的迁移,有效避免单一的平台提供商。
podman 在mac 上面远程链接到linux server上面的podman
podman是一个可以替代docker的容器技术。特色功能之一,就是可以在Mac或者Windows上面,通过ssh协议,远程连接到linux 上面,操作远程的podman。你用起来,就跟本地的podman一样的。比你在mac或者windows下面,跑虚拟机,要好很多。
但是配置起来,需要一点点耐心。
你先要准备好ssh的key,避免不必要的麻烦氏肆,我们直接得用 ssh key id_ed25519
首先远程linux服务器,你得先装podman, 我们以opensuse tumbleweed为例,你需要执行这样的命令安装,并配置podman
sshd也是必须要启用的,不然你无法以sshd协议链接linux 服务器。
systemctl enable sshd
记住,你得生成,或者自己准备ssh的 key, 以id_ed25519格式为佳。
保证可以通过ssh -v root@目标机器ip登录远程服务器
然后接下来你执行命令,在mac或者windows下面,利用podman的远程链接功能,链接到远程podman服务器。
podman --log-level=debug system connection add wsk -d --identity /Users/nomore/.ssh/前缓id_ed25519 ssh://root@172.30.1.112
查看连接信息
$ podman system connection ls
Name URI Identity Default
wsk ssh://root@172.30.1.112:22/run/podman/podman.sock /Users/nomore/.ssh/id_ed25519 true
然后看下版本信息
接下来我们运行一个容器试试
如果我们在远程linux服务器上执行命令,应该可以看得到刚刚我们运行的容器实例
当你完成这个简单的实例之后,你会发现,你已经初步掌握了podman 如何链接远程linux服务器。
这样你可以在本地开发代码,开发完了,可以利用远程linux,构建容器镜像
比如我的电脑是mac,我先clone一个很小的仓库,尝试构建镜像
我们分别在mac和远程linux看看我们的镜像是否慧核模构建成功了
到这里,容器的运行,镜像构建,这些基本操作,你都已经掌握了。
本文地址:https://gpu.xuandashi.com/71760.html,转载请说明来源于:渲大师
声明:本站部分内容来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。分享目的仅供大家学习与参考,不代表本站立场!