目录
1.安装及配置podman
2.镜像的命名
3.对镜像重新做标签
4.删除镜像
5.查看镜像的层结构
6.导出和导入镜像
7.创建容器
8.创建一个简单的容器
9.容器的生命周期
10.创建临时容器
11.指定容器中运行的命令
12.创建容器时使用变量
那么,这个类似气球的东西就是容器,U盘就是镜像。
在服务器上有一个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.com、registry.redhat.io、docker.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。
(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 ~]#