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:

  1. example-mirror-0.local/mirror-for-foo/image:latest
  2. example-mirror-1.local/mirrors/foo/image:latest
  3. 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

 

 

 
posted @ 2021-10-31 17:28  牛顿撕鸡  阅读(10383)  评论(1编辑  收藏  举报