5. podman -- 镜像仓库
1. 镜像源配置文件预备知识:TOML 语言
(感兴趣的话可以看看这一节,没兴趣的话直接从下一节开始)
TOML 是写配置文件的一种语言,
1.1 [table]
用来定义“表”,
TOML 中表示键值对的集合,类似于字典,
[table](称为表头)单独一行出现,
其下面(直到另外一个表头出现)的键值对都是这个表的键值对,如:
[table-1]
key1 = "some string"
key2 = 123
[table-2]
key1 = "another string"
key2 = 456
1.2 [[array_of_table]]
表数组
“表数组”出现的时候,就顺带定义了它的第一个元素,
后续再次出现这个“表数组”的时候,会在该“表数组”中创建新的元素,也就是说:
[[products]]
name = "Hammer"
sku = 738594937
[[products]] # 数组里第二个元素:空表
[[products]] # 数组里的第三个元素
name = "Nail"
sku = 284758393
color = "gray"
json 结构为:
{
"products": [
{ "name": "Hammer", "sku": 738594937 },
{ },
{ "name": "Nail", "sku": 284758393, "color": "gray" }
]
}
1.3 [[ ]] 的 子表
[[fruits]]
name = "apple"
[fruits.physical] # 子表
color = "red"
shape = "round"
[[fruits.varieties]] # 嵌套表数组
name = "red delicious"
[[fruits.varieties]]
name = "granny smith"
[[fruits]]
name = "banana"
[[fruits.varieties]]
name = "plantain"
json 结构
{
"fruits": [
{
"name": "apple",
"physical": {
"color": "red",
"shape": "round"
},
"varieties": [
{ "name": "red delicious" },
{ "name": "granny smith" }
]
},
{
"name": "banana",
"varieties": [
{ "name": "plantain" }
]
}
]
}
2. 镜像源(仓库)配置
Podman 引入了一个 registry 的概念,
registry(注册表、登记处)就是多个容器镜像源(如,docker.io 就可以是其中之一)
在使用 podman pull 一个镜像的时候,
如果镜像使用的是如下的写法,那么就会从指定的仓库进行下载。
但是如果使用的是
podman pull httpd-24-rhel7
的时候,也就是没有指明镜像源,会使用配置文件中定义的镜像仓库。
podman 的镜像源配置文件为 /etc/containers/registries.conf
/etc/containers/registries.conf
# There are multiple versions of the configuration syntax available,
# where the second iteration is backwards compatible to the first one.
# Mixing up both formats will result in an runtime error.
配置文件最开头就说:有多个 versions 的配置语法,
第三行表明,两种写法不能混用,否则会报错
Error: ...
"/etc/containers/registries.conf": mixing sysregistry v1/v2 is not supported
2.1 Version 2
/etc/containers/registries.conf
Version 2 在配置文件中的后面部分一点
接前文,当 pull 一个镜像,没有指定镜像源的时候,
下面字段指定的镜像源顺序获取
unqualified-search-registries = ["docker.io", "registry.access.redhat.com"]
由此,
通常会将镜像源替换为国内的,已加速访问下载,
man containers-registries.conf 里面给出了相关的示例:
1 # EXAMPLE
2
3 unqualified-search-registries = ["example.com"]
4
5 [[registry]]
6 prefix = "example.com/foo"
7 insecure = false
8 blocked = false
9 location = "internal-registry-for-example.com/bar"
10
11 [[registry.mirror]]
12 location = "example-mirror-0.local/mirror-for-foo"
13
14 [[registry.mirror]]
15 location = "example-mirror-1.local/mirrors/foo"
16 insecure = true
如上,行 3 - 9
假定在没有 行 11 之后内容的前提下,
a pull of example.com/foo/image:latest will try:
internal-registry-for-example.net/bar/image:latest
也就是请求 prefix 指定镜像源的时候,会到 location 指定的地方去找
当不指定 prefix 则默认和 location 一致。
(个人感觉有点 请求重定向 的意思,
prefix 字段对应行 3 列表里面的一个元素,也就是 pull 镜像时候,镜像名的前缀,也就是镜像源
location 则用来指向实际要操作的镜像源地址)
行 11 - 16
a pull of example.com/foo/image:latest will try:
- example-mirror-0.local/mirror-for-foo/image:latest
- example-mirror-1.local/mirrors/foo/image:latest
- internal-registry-for-example.net/bar/image:latest
in order, and use the first one that exists.
也就是会先尝试 行 12,接下来行 15,最后才是行 9
2.2 Version 1
(没兴趣就可以 pass 了,使用上面这种方法即可)
配置文件中前面部分,也是默认生效的部分
man containers-registries.conf
VERSION 1 FORMAT - DEPRECATED
(也就是 version 1 格式的配置已经是不推荐使用了)
...
VERSION 1 format is still supported but ...
...
The TOML format is used to build a simple list of registries under three categories:
1. registries.search,
2. registries.insecure,
3. registries.block.
(通过这三个字段((或者应该是说段落))来描述 registry)
/etc/containers/registries.conf
# To ensure compatibility with docker we've included docker.io
# in the default search list.
# (为了保证兼容性,已经将 docker.io 加入到镜像搜索地址的列表里面)
# ...
[registries.search]
registries = ['registry.access.redhat.com',
'registry.redhat.io',
'docker.io']
unqualified-search-registries = ["registry.fedoraproject.org",
"registry.access.redhat.com",
"registry.centos.org",
"docker.io"]
registries 字段
podman 默认会搜索镜像的地址,
如上可见,
优先排在前面的,又说 redhat 的地址排在前面,所以优先 redhat下载,但 redhat 的需要账号登录相关的步骤,可以把 docker.io 调整到最前面
unqualified-search-registries 字段
unqualified,无资格的;不受限制的;
3. 替换国内镜像源
3.1 阿里镜像源地址
使用账号登录阿里云后,
进入【控制台】
在【产品与服务列表】里面找到【容器镜像服务】
地址通常是 https://xxx.mirror.aliyuncs.com
xxx 根据个人账号有不同,写入 location 字段的时候,不用写 https 前缀
如:
location="rncxm540.mirror.aliyuncs.com"
3.2 修改配置文件
/etc/container/registries.conf
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "2jriwsnk.mirror.aliyuncs.com"
注释掉 Version 1 的内容,否则会报错,
虽然配置文件很长,但没注释的也就这几行,如下:
如上,通过 grep 排除掉与 # 开头的行和 空行
3.3 运行测试
如上,
当 pull 一个镜像的时候,
虽然表面上是 pull docker.io/bibrary/httpd:latest
但通过 ss 能够看到,目标 IP 地址为浙江杭州
4. 搜索镜像
4.1 命令行
podman search xxx
字段 Stars:
类似 GitHub 里面的 star
字段 Official:
是否 docker 官方发布
4.2 网页
也可以到 docker 的官网查找需要的镜像
hub.docker.com