什么是Linux容器?Linux容器是Linux内核提供的具有特定隔离能力的进程。包括所有必需的文件)被打包或隔离在一起。这使您可以轻松地在不同环境(例如开发、测试和生产环境)之间迁移应用程序,同时保留应用程序的全部功能。Linux容器还有助于明确责任线,减少开发和运营团队之间的冲突。这样,开发人员可以专注于应用程序开发,而运营团队可以专注于基础架构维护。由于Linux容器是建立在开源技术之上的,这也将使您在未来更容易采用更新更强的技术产品。容器技术,包括CRI-O、Kubernetes和Docker,可以帮助您的团队有效地简化、加速和编排应用程序开发和部署。什么是码头工人?Docker是一个开源的应用容器引擎,是对Linux容器的封装。Docker提供了一个易于使用的容器接口,允许开发人员将他们的应用程序和依赖项打包到一个可移植的容器中。然后发布到任何流行的Linux机器。容器完全使用沙箱机制,它们之间不会有任何接口。Docker是当今非常流行的Linux容器解决方案,尽管Docker是当今管理Linux容器的非常方便的工具,但它有两个缺点:Docker需要一个守护进程才能在您的系统上运行。Docker以root身份在您的系统上运行守护进程。这些缺点的存在可能会带来一定的安全隐患。为了解决这些问题,下一代容器化工具Podman应运而生。什么是波德曼?Podman是大多数Linux平台上可用的开源容器运行时项目。Podman提供与Docker非常相似的功能。如前所述,它不需要在您的系统上运行任何守护进程,也可以在没有root权限的情况下运行。Podman可以管理和运行任何符合OCI(OpenContainerInitiative)规范的容器和容器镜像。Podman提供了一个与Docker兼容的命令行前端,用于管理Docker镜像。Podman官网地址:https://podman.io/Podman项目地址:https://github.com/containers/libpod安装PodmanPodman目前支持大部分发行版通过软件包安装。下面是一些常用的。分布的例子。Fedora/CentOS$sudoyum-yinstallpodmanUbuntu$sudoapt-getupdate-qq$sudoapt-getinstall-qq-ysoftware-properties-commonuidmap$sudoadd-apt-repository-yppa:projectatomic/ppa$sudoapt-getupdate-qq$sudoapt-get-qq-yinstallpodmanMacOS$brewcaskinstallpodmanRHEL7$sudosubscription-managerrepos--enable=rhel-7-server-extras-rpms$sudoyum-yinstallpodmanArchLinux$sudopacman-Spodman更多系统安装方法参考官方文档:https:///github.com/containers/libpod/blob/master/install.md使用Podman使用Podman非常简单,Podman的大部分使用说明与Docker相同。下面看一些常用的例子:运行一个容器httpd/conf\-eHTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/\registry.fedoraproject.org/f27/httpd/usr/bin/run-httpd列出正在运行的容器$podmanps-a分析正在运行的容器$podmaninspect-l|grepIPAddress\":"SecondaryIPAddresses":null,"IPAddress":"",检查正在运行的容器的日志$sudopodmanlogs--latest10.88.0.1--[07/Feb/2018:15:22:11+0000]"GET/HTTP/1.1"200612"-""curl/7.55.1""-"10.88.0.1--[07/Feb/2018:15:22:30+0000]"GET/HTTP/1.1"200612"-""curl/7.55.1""-"10.88.0.1--[07/Feb/2018:15:22:30+0000]"GET/HTTP/1.1"200612"-""curl/7.55。1""-"10.88.0.1--[07/Feb/2018:15:22:31+0000]"GET/HTTP/1.1"200612"-""curl/7.55.1""-"10.88.0.1--[07/Feb/2018:15:22:31+0000]"GET/HTTP/1.1"200612"-""curl/7.55.1""-"查看正在运行的容器中的进程资源使用情况$sudopodmantopUIDPIDPPIDCSTIMETTYTIMECMD03187331863009:21?00:00:00nginx:masterprocessnginx-gdaemonoff;1013188931873009:21?00:00:00nginx:workerprocess停止一个正在运行的容器$sudopodmanstop--latest删除一个容器$sudopodmanrm--latest以上功能与Docker基本相同。Podman不仅兼容这些特性,还支持一些新特性。为容器设置检查点。$sudopodmancontainercheckpoint需要CRIU3.11或更高版本的支持。CRIU项目地址:https://criu.org/根据检查点位置恢复容器$sudopodmancontainerrestore迁移容器Podman支持将容器从一台机器迁移到另一台机器。首先,容器在源机器上设置检查点并打包到指定位置。$sudopodmancontainercheckpoint-e/tmp/checkpoint.tar.gz$scp/tmp/checkpoint.tar.gz:/tmp其次,使用从源机器传输过来的包文件在目标机器上恢复容器.$sudopodmancontainerrestore-i/tmp/checkpoint.tar.gz配置别名如果习惯使用Docker命令,可以直接为Podman配置别名,实现无缝传输。你只需要在.bashrc下添加如下一行:$echo"aliasdocker=podman">>.bashrc$source.bashrcPodman如何实现重启容器由于Podman不再使用daemon进程来管理服务,它无法通过守护进程实现自动重启容器的功能。如果想在启动时自动重启容器,怎么办?其实方法很简单。现在大多数系统都使用Systemd作为守护进程管理工具。这里我们可以使用Systemd来实现Podman来启动和重启容器。这里我们以启动一个Nginx容器为例。首先,让我们运行一个Nginx容器。$sudopodmanrun-t-d-p80:80--namenginxnginx然后,创建一个Systemd服务配置文件。$vim/etc/systemd/system/nginx_container.service[Unit]Description=PodmanNginxServiceAfter=network.targetAfter=network-online.target[Service]Type=simpleExecStart=/usr/bin/podmanstart-anginxExecStop=/usr/bin/podmanstop-t10nginxRestart=always[Install]WantedBy=multi-user.target接下来,启用这个Systemd服务。$sudosystemctldaemon-reload$sudosystemctlenablenginx_container.service$sudosystemctlstartnginx_container.service服务开启成功后,我们可以通过systemctlstatus命令查看该服务的运行状态。$sudosystemctlstatusnginx_container.servicenginx_container.service-PodmanNginxServiceLoaded:loaded(/etc/systemd/system/nginx_container.service;enabled;vendorpreset:disabled)Active:active(running)sinceSat2019-08-2020:59:26UTC;1min41sagoMainPID:845(podman)Tasks:16(limit:4915)Memory:37.6MCGroup:/system.slice/nginx_container.service└─845/usr/bin/podmanstart-anginxAug2020:59:26Ubuntu-dev.novalocalsystemd[1]:StartedPodmanNginxService。每次系统重启后,Systemd都会自动启动这个服务对应的容器。其他相关工具Podman只是OCI容器生态计划的一部分,主要侧重于帮助用户维护和修改符合OCI规范的容器镜像。其他组件还有Buildah、Skopeo等。虽然BuildahPodman也可以支持用户构建Docker镜像,但是构建速度比较慢。并且默认使用VFS存储驱动程序会占用大量磁盘空间。Buildah是一个专注于构建OCI容器镜像的工具。Buildah构建速度非常快,并且使用了overlay存储驱动,可以节省大量空间。Buildah基于fork-exec模型,不作为守护进程运行。Buildah支持Dockerfile中的所有命令。您可以直接使用Dockerfiles构建镜像,无需任何root权限。Buildah还支持用自己的语法文件构建镜像,允许其他脚本语言集成到构建过程中。下面是使用Buidah自己的语法构建的示例。Buildah和Podman的一个主要区别是:Podman用于运行和管理容器,允许我们使用熟悉的容器CLI命令在生产中管理和维护这些镜像和容器,而Buildah主要用于构建容器。项目地址:https://github.com/containers/buildahSkopeoSkopeo是一个镜像管理工具,可以让我们通过Push、Pull和copy镜像来处理Docker和OCI兼容的镜像。项目地址:https://github.com/containers/skopeo延伸阅读什么是OCI?OCI(OpenContainerInitiative)是一个轻量级、开放的治理结构(项目)。它在Linux基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。OCI项目于2015年6月由Docker、CoreOS和其他容器行业的领导者发起。OCI的技术委员会成员包括RedHat、Microsoft、Docker、Cruise、IBM、Google、RedHat和SUSE。什么是CRI?CRI(ContainerRuntimeInterface)是Kubernetesv1.5引入的容器运行时接口。将Kubelet与容器运行时解耦,将原来完全面向Pod层面的内部接口拆分为gRPCforSandbox和Container接口,将镜像管理和容器管理分离到不同的服务中。什么是CNI?CNI(ContainerNetworkInterface)是CNCF下的一个项目,是由Google和CoreOS主导的容器网络标准。CNI包括方法规范、参数规范等,是Linux容器网络配置的一套标准和库。用户可以基于这些标准和库开发自己的容器网络插件。CNI已经被Kubernetes、Mesos、CloudFoundry、RKT等使用,同时Calico、Weave等项目也在为CNI提供插件。总结本文介绍了三个符合CRI标准的容器工具Podman、Buildah和Skopeo。这三个工具都是基于*nix传统的fork-exec模型,解决了Dockerdaemon带来的启动和安全问题,提高了容器的性能和安全性。