文章目录
我们在使用容器的时候,一般都是从公有库比如:
- docker.io
- registry.fedoraproject.org
- quay.io
- registry.access.redhat.com
- registry.centos.org
等地方进行拉取镜像的,如果有相应库的账号,也可以自己创建容器镜像推送到公有库中。
如果是不想推送到公有库中,比如公司内部使用的容器,想推送到公司自己的私有库中,那就需要自行搭建私有库。
笔者以Ubuntun 21.10下的podman为例,介绍如何搭建容器的私有库。
一、拉取registry容器
1、使用cockpit来拉取
如果系统安装了cockpit来管理容器,可以很方便地拉取,如下图所示:
Ubuntu系统可能没有公有库地址,可以参考:配置与管理Ubuntu 21.10一文中“Podman容器”部分。
2、使用命令拉取
使用下面的命令来拉取registry镜像
sudo podman pull registry
如果是docker就换成docker命令即可,格式是一样的
sudo docker pull registry
podman的输出如下所示:
witton@witton:~$ sudo podman pull registry
Trying to pull docker.io/library/registry:latest...
Getting image source signatures
Copying config b8604a3fe8 done
Writing manifest to image destination
Storing signatures
b8604a3fe8543c9e6afc29550de05b36cd162a97aa9b2833864ea8a5be11f3e2
使用命令
sudo podman images
查看拉取的镜像:
witton@witton:~$ sudo podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/registry latest b8604a3fe854 1 minutes ago 26.8 MB
3、生成密码:
生成密码时需要使用到htpasswd命令,如果没有,可以使用下面的命令来安装:
sudo apt install apache2-utils
使用下面的命令来生成验证文件:
htpasswd -Bbn witton 123456 >/con_registry/auth
这里直接存储到/con_registry目录,方便后面使用。
二、 运行registry镜像
1、使用cockpit运行registry
使用cockpit运行容器非常方便,如下图所示,命令一行默认就填写好了,名称会自动随机一个名字,其它的都可以不用管,直接点“运行”就好。这样运行的registry是只能在宿主机上使用容器的IP地址进行访问,如果容器IP地址发生变化,相应地使用时也需要跟着变化。同时registry存储的镜像也是保存在容器内部的,如果容器被删除,相应的镜像也会一同被删除。
所以为了使用方便,需要映射容器的端口到宿主机;同时为了安全起见需要把容器中存储镜像的地址映射到主机。
registry容器的配置文件为容器中的/etc/docker/registry/config.yml
可以在容器(名字为registry)运行起来后,使用下面的命令复制到宿主机上来查看:
sudo podman cp registry:/etc/docker/registry/config.yml ~/
内容如下:
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
从中可以看到镜像存储的路径为/var/lib/registry,监听的端口为5000,我们需要映射到宿主机,所以如下图所示进行填写,然后运行。
运行成功后,可以从日志窗口查看到相应的日志信息:
这里面有一条警告需要注意:
WARN[0000] No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable.
这里没有相应的情况,可以暂时不用管它,当然也可以按它的要求,在前面的运行对话框中填写REGISTRY_HTTP_SECRET环境变量。
需要注意的是这样搭建的registry容器是以http的方式提