使用podman管理容器

2023-12-14 18:00:55

目录

1.安装及配置podman?

?2.镜像的命名

?3.对镜像重新做标签

4.删除镜像?

?5.查看镜像的层结构

6.导出和导入镜像?

7.创建容器

8.创建一个简单的容器?

?9.容器的生命周期

?10.创建临时容器

11.指定容器中运行的命令?

12.创建容器时使用变量?


对于初学者来说,不太容易理解什么是容器,这里举一个例子。想象一下,我们把系统安装在一个U盘中,此系统中安装好了MySQL。
然后我们把这个U盘插人一台正在运行的物理机上,这个物理机上并没有安装MySQL,如图27-1所示。
然后把U盘中的mysqld进程“曳”到物理机上运行。但是这个mysqld进程只能适应U盘中的系统,不一定能适应物理机上的系统。所以,我们找一个类似气球的东西把 mysqld进程在物理机中包裹保护起来,这个mysqld进程依然适应U盘中的生态环境(系统),却可以从物理机上吸收CPU和内存作为维持mysqld进程运行的“养分”。

那么,这个类似气球的东西就是容器,U盘就是镜像。 ?

在Linux中安装软件包时经常会遇到各种包依赖,或者有人不会在 Linux系统(如Ubuntu、CentOS)中安装软件包。这样以后我们就不需要安装和配置MySQL了,直接把这个“U盘”插到电脑上,然后运行一个容器出来,这样就有MySQL这个服务了。

所谓镜像,就是安装了系统的硬盘文件,这个系统中安装了想要运行的程序,如 MySQL.Nginx,并规定好使用这个镜像所生成的容器
里面运行什么进程。这里假设有一个安装了MySQL的镜像,如图27-2所示。

在服务器上有一个MySQL 的镜像(已经安装好了MySQL),然后使用这个镜像生成一个容器。这个容器中只运行一个mysqld进程,容器中的mysqld进程直接从物理机上吸收CPU和内存以维持它的正常运行。
以后需要什么应用,就直接拉取什么镜像下来,然后使用这个镜像生成容器。例如,需要对外提供MySQL服务,那么就拉取一个MySQL镜像,然后生成一个MySQL容器。如果需要对外提供 Web服务,那么就拉取一个Nginx镜像,然后生成一个Nginx容器。
一个镜像是可以生成很多个容器的,如图27-3所示。

1.安装及配置podman?

前面已经配置了yum源,所以这里直接使用yum install podman -y命令安装,命令如下。 ?

[root@RHEL813 ~]# yum -y install podman

?查看现在系统中有多少镜像,命令如下。

[root@RHEL813 ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
[root@RHEL813 ~]# 

?没有任何输出,说明现在还没有镜像。

查看系统中有多少容器,命令如下。 ?

[root@RHEL813 ~]# podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
[root@RHEL813 ~]# 

?没有任何输出,说明当前没有容器。

如果要拉取镜像,一般是从国外网站的镜像仓库中拉取,速度会很慢。默认podman从以下仓库中拉取镜像:registry.access.redhat.comregistry.redhat.iodocker.io。下面配置加速器,提高从docker.io中拉取镜像的速度。
登录阿里云控制台,找到容器镜像服务,单击镜像工具→镜像加速器,找到自己的加速器地址,这里使用的是https://XXXX.mirror.aliyuncs.com.

修改 podman 的配置文件/etc/containers/registries.conf,修改内容如下。?

unqualified‐search‐registries = ["docker.io"]

[[registry]]
prefix = "docker.io"
location = "/XXXX.mirror.aliyuncs.com"
(XXXX指的是用你自己的aliyun镜像加速器)
这里的意思是从 docker.io中拉取镜像时使用加速器XXXX.mirror.aliyuncs.com,注意这里不需要加https,配置好之后不需要重启什么服务

下面开始拉取docker.io/nginx镜像,命令如下。?

[root@RHEL813 ~]# podman pull docker.io/nginx

拉取Mysql的镜像,命令如下。

[root@RHEL813 ~]# podman pull mysql
网易仓库地址是https://c.163yun.com/hub#/home,在浏览器中打开此界面需要登录,然后搜索需要的镜像即可。下面从网易仓库中
拉取 CentOS镜像,命令如下。
[root@RHEL813 ~]# podman pull  hub.c.163.com/library/centos
Trying to pull hub.c.163.com/library/centos:latest...
Getting image source signatures
Copying blob a3ed95caeb02 done  
Copying blob a3ed95caeb02 done  
Copying blob 2409c3878ba1 done  
Writing manifest to image destination
Storing signatures
328edcd84f1bbf868bc88e4ae37afe421ef19be71890f59b4b2d8ba48414b84d

?2.镜像的命名

一般情况下,镜像的命名格式如下。 ?

服务器IP: 端口 /分类 /镜像名 :tag

?如果不指定端口则默认80,如果不指定 tag则默认latest

例如,192.168.26.101:5000/cka/centos:v2。?

?再如,hub.c.163.com/library/mysql:latest。

分类也是可以不写的,如docker.io/nginx:latest。?

在把镜像上传(push)到仓库时,镜像必须按这种格式命名,因为仓库地址就是由镜像前面的IP决定的。如果只是在本机使用镜像,命名可以随意。

?查看当前系统有多少镜像,命令如下

[root@RHEL813 ~]# podman images
REPOSITORY                    TAG         IMAGE ID      CREATED        SIZE
docker.io/library/nginx       latest      61395b4c586d  2 months ago   191 MB
docker.io/library/flink       latest      28308bbc7b60  24 months ago  665 MB
docker.io/library/mysql       5.7.19      3e3878acd190  6 years ago    420 MB
hub.c.163.com/library/centos  latest      328edcd84f1b  6 years ago    200 MB
[root@RHEL813 ~]# 

?3.对镜像重新做标签

?如果想给本地已经存在的镜像起一个新的名称,可以用tag来做,语法如下

podman tag 旧的镜像名 新的镜像名

?tag之后,新的镜像名和旧的镜像名是同时存在的。

步骤①:给镜像做新标签,命令如下。?

[root@RHEL813 ~]# podman tag docker.io/library/nginx 192.168.103.17/rhce/nginx:v2
[root@RHEL813 ~]# 
这里是为docker.io/library/nginx1重新做个tag,名称192.168.103.17/rhce/nginx,标签为2,这样命名的目的是让大家看到命名的随意性,建议tag 可以设置为版本号、日期等有意义的字符。

?步骤②:再次查看镜像,命令如下。

[root@RHEL813 ~]# podman images
REPOSITORY                    TAG         IMAGE ID      CREATED        SIZE
docker.io/library/nginx       latest      61395b4c586d  2 months ago   191 MB
192.168.103.17/rhce/nginx     v2          61395b4c586d  2 months ago   191 MB
docker.io/library/flink       latest      28308bbc7b60  24 months ago  665 MB
docker.io/library/mysql       5.7.19      3e3878acd190  6 years ago    420 MB
hub.c.163.com/library/centos  latest      328edcd84f1b  6 years ago    200 MB
[root@RHEL813 ~]# 
可以看到,对某镜像做了标签之后,看似是两个镜像,其实对应的是同一个(这类似于Linux中硬链接的概念,一个文件两个名称而已),镜像ID都是一样的。删除其中一个镜像,是不会删除存储在硬盘上的文件的,只有把 IMAGE ID所对应的所有名称全部删除,才会从硬盘上删除。

4.删除镜像?

如果要删除镜像,需要按如下语法来删除。 ?

podman rmi 镜像名:tag

?例如,下面要把 docker.io/library/nginx:latest删除。

步骤①:删除镜像,命令如下。?

[root@RHEL813 ~]# podman rmi docker.io/library/nginx:latest 
Untagged: docker.io/library/nginx:latest
[root@RHEL813 ~]# 

?可以看到,只是简单的一个Untagged操作,并没有任何Deleted操作。

步骤②:查看镜像,命令如下。?

root@RHEL813 ~]# podman images
REPOSITORY                    TAG         IMAGE ID      CREATED        SIZE
192.168.103.17/rhce/nginx     v2          61395b4c586d  2 months ago   191 MB
docker.io/library/flink       latest      28308bbc7b60  24 months ago  665 MB
docker.io/library/mysql       5.7.19      3e3878acd190  6 years ago    420 MB
hub.c.163.com/library/centos  latest      328edcd84f1b  6 years ago    200 MB
[root@RHEL813 ~]# 
可以看到,61395b4c586d对应的本地文件依然是存在的,因为(ID61395b4c586d)有两个名称,现在只是删除了一个名称而已,所以在硬盘上仍然是存在的。

只有删除最后一个名称,本地文件才会被删除。?

步骤③:删除镜像,命令如下?

[root@RHEL813 ~]# podman rmi 192.168.103.17/rhce/nginx:v2 
Untagged: 192.168.103.17/rhce/nginx:v2
Deleted: 61395b4c586da2b9b3b7ca903ea6a448e6783dfdd7f768ff2c1a0f3360aaba99
[root@RHEL813 ~]# 

?5.查看镜像的层结构

虽然我们所用的镜像都是从网上下载下来的,但这些镜像在制作过程中都是一点点修改、一步步做出来的。如果我们要看某镜像的这些步骤,可以用podman history命令,语法如下。
podman history镜像名
查看镜像的结构,命令如下。
[root@RHEL813 ~]# podman history hub.c.163.com/library/centos
ID            CREATED      CREATED BY                                     SIZE        COMMENT
328edcd84f1b  6 years ago  /bin/sh -c #(nop)  CMD ["/bin/bash"]           0 B         
<missing>     6 years ago  /bin/sh -c #(nop)  LABEL name=CentOS Base ...  0 B         
<missing>     6 years ago  /bin/sh -c #(nop) ADD file:63492ba809361c5...  200 MB      
[root@RHEL813 ~]# 

?最上层的CMD,定义的是当使用这个镜像生成的容器时,运行的进程为/bin/bash。

6.导出和导入镜像?

一些服务器是无法连接到互联网的,所以无法从互联网上下载镜像。在还没有私有仓库的情况下,如何把现有的镜像传输到其他机器上呢?这里就需要把本地已经pull下来的镜像导出为一个本地文件,这样就可以很容易地传输到其他机器。导出镜像的语法如下。

?步骤①:把docker.io/nginx:latest 导出为nginx.tar,命令如下。

[root@RHEL813 ~]# podman save docker.io/library/nginx:latest > nginx.tar
[root@RHEL813 ~]# ls
163mysql.tar  anaconda-ks.cfg  flink  initial-setup-ks.cfg  mysql  nginx  nginx.tar  tomcat

?既然上面已经把镜像导出为一个文件了,那么需要把这个文件导入,语法如下。

podman load ‐i file.tar

?步骤②:把nginx.tar导入为镜像,命令如下。

[root@RHEL813 ~]# podman load -i nginx.tar 
Getting image source signatures
Copying blob a7e2a768c198 skipped: already exists  
Copying blob eb7e3384f0ab skipped: already exists  
Copying blob d310e774110a skipped: already exists  
Copying blob ea43d4f82a03 skipped: already exists  
Copying blob 1dc45c680d0f skipped: already exists  
Copying blob 9c6261b5d198 [--------------------------------------] 0.0b / 0.0b
Copying blob d26d4f0eb474 [--------------------------------------] 0.0b / 0.0b
Copying config 61395b4c58 done  
Writing manifest to image destination
Storing signatures
Loaded image(s): docker.io/library/nginx:latest
[root@RHEL813 ~]# 

?查看现有镜像,命令如下。

[root@RHEL813 ~]# podman images
REPOSITORY                    TAG         IMAGE ID      CREATED        SIZE
docker.io/library/nginx       latest      61395b4c586d  2 months ago   191 MB
docker.io/library/flink       latest      28308bbc7b60  24 months ago  665 MB
docker.io/library/mysql       5.7.19      3e3878acd190  6 years ago    420 MB
hub.c.163.com/library/centos  latest      328edcd84f1b  6 years ago    200 MB
[root@RHEL813 ~]# 

7.创建容器

容器就是镜像在宿主机上运行的一个实例,大家可以把容器理解为一个气球,气球中运行了一个进程,这个进程透过气球吸收物理机的内存和 CPU 资源。

?查看当前有多少正在运行的容器,命令如下。

[root@RHEL813 ~]# podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
[root@RHEL813 ~]# 

?这个命令显示的仅仅是正在运行的容器,如果要查看不管是运行还是不运行的容器,需要加上-a选项,即 podman ps-a。

8.创建一个简单的容器?

运行一个最简单的容器,命令如下。?

[root@RHEL813 ~]# podman run hub.c.163.com/library/centos
[root@RHEL813 ~]# podman ps -a
CONTAINER ID  IMAGE                                COMMAND     CREATED       STATUS                   PORTS       NAMES
3c7b68e2106e  hub.c.163.com/library/centos:latest  /bin/bash   1 second ago  Exited (0) 1 second ago              stoic_newton
[root@RHEL813 ~]# podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
[root@RHEL813 ~]# 
可以看到,创建了一个容器,容器ID为3c7b68e2106e,容器名是随机产生的,名称为kind_elgamal,所使用的镜像是hub.c.163.com/library/centos,容器中运行的进程为/bin/bash(也就是镜像中的CMD指定的)。

?podman ps看不到,podman ps -a能看到,且状态为Exited,说明容器是关闭状态。容器运行的一瞬间就关闭了,为什么?

?9.容器的生命周期

把容器理解为人的肉体,里面运行的进程理解为人的灵魂。如果人的灵魂宕机了,肉体也就宕机了,只有灵魂正常运行,肉体才能正常运行,如图27-4所示。

同理,只有容器中的进程正常运行,容器才能正常运行,容器中的进程宕机了,容器也就宕机了。因为没有终端的存在,/bin/bash就像执行ls命令一样一下就执行完了,所以容器生命期也就到期了。
如果把这个bash附着到一个终端上,这个终端一直存在,bash就一直存在,那么是不是容器就能一直存活了呢?

删除容器的语法如下。?

podman rm 容器ID/容器名

?如果删除正在运行的容器,可以使用-f选项。

podman rm ‐f 容器ID/容器名?
步骤①:删除刚才的容器,命令如下。
[root@RHEL813 ~]# podman rm 3c7b68e2106e
3c7b68e2106ee6ef4fc8035e69317afd6824d9946a4c428fb4671eb802dc2c08
[root@RHEL813 ~]# 

?重新创建新的容器,加上-i -t选项,可以写作-it或-i-t。

(1)-t:模拟一个终端。
(2)-i:可以让用户进行交互,否则用户看到一个提示符之后就卡住不动了。

?步骤②:创建一个容器,命令如下。

[root@RHEL813 ~]# podman run -it hub.c.163.com/library/centos
[root@ce50a82b439c /]# exit
exit
[root@RHEL813 ~]# 

?创建好容器之后就自动进入容器中了,可以通过exit退出容器,命令如下

[root@RHEL813 ~]# podman ps -q
[root@RHEL813 ~]# 
[root@RHEL813 ~]# podman ps -aq
ce50a82b439c
[root@RHEL813 ~]# 

?但是一旦退出容器,容器就不再运行了。

步骤③:删除此容器,命令如下。?

[root@RHEL813 ~]# podman rm -f ce50a82b439c
ce50a82b439cdc40ff60178349975f2ee07f96f893868ab65b180df80c4a7887
[root@RHEL813 ~]# 

?如果希望创建好容器之后不自动进入容器中,可以加上-d选项。

步骤④:再次创建一个容器,命令如下。 ?

[root@RHEL813 ~]# podman run -dit hub.c.163.com/library/centos
8629a9e5a8d5191ca38d7ed7f8f4a427ec14b0e5dd58892a04ab74f44c9a0d0d
[root@RHEL813 ~]# 

?因为加了-d选项,所以创建好容器之后并没有自动进入容器中。进入此容器中,命令如下。

[root@RHEL813 ~]# podman attach 8629a9e5a8d5
[root@8629a9e5a8d5 /]# exit
exit

[root@RHEL813 ~]# podman ps -q
[root@RHEL813 ~]# 
[root@RHEL813 ~]# podman ps -aq
8629a9e5a8d5
[root@RHEL813 ~]# 

?可以看到,只要退出来容器就会自动关闭。

步骤⑤:删除此容器,命令如下。?

[root@RHEL813 ~]# podman rm 8629a9e5a8d5
8629a9e5a8d5191ca38d7ed7f8f4a427ec14b0e5dd58892a04ab74f44c9a0d0d
[root@RHEL813 ~]# 

?在运行容器时加上--restart=always选项可以解决退出容器自动关闭的问题。

步骤6:创建容器,增加--restart=always选项,命令如下。?

[root@RHEL813 ~]# podman run -dit --restart=always hub.c.163.com/library/centos
7713104e87c28bedeee3f18ff6d3220d51ef0bb320dc37a71e5dbb4476b66834
[root@RHEL813 ~]# 

?进入容器并退出,命令如下。

[root@RHEL813 ~]# podman ps -q
7713104e87c2
[root@RHEL813 ~]# podman attach 7713104e87c2
[root@7713104e87c2 /]# exit
exit

[root@RHEL813 ~]# podman ps -q
7713104e87c2
[root@RHEL813 ~]# 

?可以看到,容器依然是存活的。

步骤⑦:删除此容器,因为容器是运行的,所以需要加上-f选项,命令如下。?

[root@RHEL813 ~]# podman ps -q
7713104e87c2
[root@RHEL813 ~]# podman rm -f 7713104e87c2
7713104e87c28bedeee3f18ff6d3220d51ef0bb320dc37a71e5dbb4476b66834
[root@RHEL813 ~]# 

?每次删除容器时,都要使用容器ID,这种方式比较麻烦,在创建容器时可以使用--name选项指定容器名。

步骤⑧:创建容器,使用--name 选项指定容器的名称。 ?

[root@RHEL813 ~]# podman run -dit --restart=always --name=c1 hub.c.163.com/library/centos
14df0508ff3debda3c74d1d5721b00b5c46b7098224db66595e196fe73da0c0c
[root@RHEL813 ~]# 

?这样容器的名称为c1,以后管理起来比较方便,如切换到容器,然后退出,命令如下

[root@RHEL813 ~]# podman attach c1
[root@14df0508ff3d /]# 
[root@14df0508ff3d /]# exit
exit

[root@RHEL813 ~]# 

?步骤⑨:删除此容器,命令如下。

[root@RHEL813 ~]# podman rm -f c1
14df0508ff3debda3c74d1d5721b00b5c46b7098224db66595e196fe73da0c0c
[root@RHEL813 ~]# podman ps -aq
[root@RHEL813 ~]# 

?10.创建临时容器

如果要临时创建一个测试容器,又怕用完忘记删除它,可以加上--rm选项。
创建临时容器,命令如下。
[root@RHEL813 ~]# podman run -it --name=c1 --rm hub.c.163.com/library/centos
[root@05621e47c754 /]# exit
exit
[root@RHEL813 ~]# 

?创建容器时加了 --rm选项,退出容器之后容器会被自动删除

[root@RHEL813 ~]# podman ps -aq
[root@RHEL813 ~]# 

?可以看到,此容器被自动删除了,注意--rm和--restart=always选项不可以同时使用。

11.指定容器中运行的命令?

创建容器时,容器中运行的是什么进程,都是由镜像中的CMD指定的。如果想自定义容器中运行的进程,可以在创建容器的命令最后指定,如下所示。
[root@RHEL813 ~]# podman run -it --name=c1 --rm hub.c.163.com/library/centos sh
sh-4.2# 
sh-4.2# exit
exit
[root@RHEL813 ~]# 
这里就是以sh的方式运行,而不是以 bash的方式运行。

12.创建容器时使用变量?

在利用一些镜像创建容器时需要传递变量,例如,使用MySQL 的镜像、WordPress的镜像创建容器时都需要通过变量来指定一些必备的信息。需要变量用-e选项来指定,可以多次使用-e选项来指定多个变量。
[root@RHEL813 ~]# podman run -it --name=c1 --rm -e aa=123 -e bb=456 hub.c.163.com/library/centos
[root@9443e66a6a5b /]# echo $aa
123
[root@9443e66a6a5b /]# echo $bb
456
[root@9443e66a6a5b /]# exit
exit
[root@RHEL813 ~]# 
在创建容器时,通过-e选项指定了两个变量aa和 bb,然后进入容器之后可以看到具有这两个变量。

文章来源:https://blog.csdn.net/S483374558/article/details/134968967
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。