docker registry仓库有点类似于yum原之于rpm包的感觉。内部环境搭建以后,就不用每次去外网拉取images镜像再到本地后运行了。也可以把本地自定义的镜像存放到registry里,不过registry如此便利,现网中还是不推荐使用,现网中更推荐使用Harbor仓库

一、简单安装使用

registry的安装本就是基于docker镜像进行安装的,直接可以一条指令完成简单安装,如果主机没有上外网的权限,也可以找到可以上外网的主机先pull镜像下来,再打包后,在主机上通过load的文件加载完成安装,具体下载和运行的指令如下:

1# docker pull registry
2# docker run -itd  --restart always --name docker-hub -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry:2

默认情况下,会将仓库存放于容器内的/var/lib/registry(官网Dockerfile中查看)目录下以防容器出问题导致镜像丢失,我们将挂载本地目录/opt/data/registry到容器的/var/lib/registry下。操作完成后,如果/opt/data/registry目录里有镜像数据,就可以通过如下指令查看到内容:

1//查看私有仓库,如果目前没有存储镜像就会显示为空
2[root@localhost ~]# curl -XGET 127.0.0.1:5000/v2/_catalog
3{"repositories":["python3.7"]}
4//查看镜像版本列表
5[root@localhost ~]# curl -XGET 127.0.0.1:5000/v2/image_name/tags/list
6{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"image_name"}}]}

此时把一个外网下载的镜像push到该私有仓库或者在其他主机上pull该私有仓库里的镜像时,是会报错的。报错内容如下:

1The push refers to a repository [192.168.159.135:5000/python3.7]
2Get https://192.168.159.135:5000/v1/_ping: http: server gave HTTP response to HTTPS client

报错原因是这是个不受信息的仓库,想要成功使用,需要在对应的docker主机上的/etc/docker/daemon.json 文件中增加如下内容并重启docker服务生效:

1[root@localhost docker]# cat /etc/docker/daemon.json
2{"insecure-registries":["192.168.159.135:5000"] }
3[root@localhost docker]# systemctl daemon-reload
4[root@localhost docker]# systemctl restart docker

podman环境下,需要在/etc/containers/registries.conf文件中增加如下配置:

1[registries.insecure]
2registries = ['192.168.159.135:5000']

并重启podman服务生效,这样执行[user@localhost ~]$ podman pull 192.168.159.135:5000/python3.7 操作才不会失败。

二、配置https的registry仓库

生效证书,可以使用以下命令生成:

1openssl req -newkey rsa:2048 -nodes -sha256 -keyout /root/certs/domain.key -x509 -days 365 -out /root/certs/domain.crt

如果我使用的域名是hub.361way.com,还需要通过如下将签名证书复制到使用Docker Registry的Docker机器上:

1cp certs/domain.crt /etc/docker/certs.d/hub.361way.com:5000/ca.crt

如果使用的是其他端口,也可以把端口修改掉。将domain.crt内容放入系统的CA bundle文件当中,使操作系统信任我们的自签名证书。

1CentOS中bundle文件的位置在/etc/pki/tls/certs/ca-bundle.crt:
2# cat domain.crt >> /etc/pki/tls/certs/ca-bundle.crt
3Ubuntu/Debian Bundle文件地址/etc/ssl/certs/ca-certificates.crt
4$ cat domain.crt >> /etc/ssl/certs/ca-certificates.crt

启动DOCKER REGISTRY

1$ docker run -d \
2  --restart=always \
3  --name registry \
4  -v "$(pwd)"/certs:/certs \
5  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
6  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
7  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
8  -p 443:443 \
9  registry:2

这里需要注意,访问需要使用域名方式。如果还想要使用IP地址,就需要在证书生成的时候修改openssl.cnf,支持IP地址方式,HTTPS访问。在Redhat7或者Centos系统中,文件所在位置是/etc/pki/tls/openssl.cnf。在其中的[ v3_ca]部分,添加subjectAltName选项。如下:

1[ v3_ca ]
2subjectAltName= IP:47.99.240.20

openssl生成自签名的证书的内容如下:

1# openssl req -newkey rsa:2048 -nodes -sha256-keyout /root/certs/domain.key -x509 -days 365 -out /root/certs/domain.crt
2Country Name (2 letter code) [XX]:CN
3State or Province Name (full name) []:hangzhou
4Locality Name (eg, city) [Default City]:hangzhou
5Organization Name (eg, company) [DefaultCompany Ltd]:mycom
6Organizational Unit Name (eg, section)[]:it
7Common Name (eg, your name or your server'shostname) []:47.99.240.20
8Email Address []:itybku@163.com

执行成功后会生成:domain.key 和domain.crt 两个文件,cp证书到使用Docker Registry的Docker机器上:

1cp domain.crt/etc/docker/certs.d/47.99.240.20:5000/ca.crt

这里的IP和端口以实际使用中的为准,后面将domain.crt内容放入系统的CA bundle文件当中,使操作系统信任我们的自签名证书步骤是一样的。

1cat domain.crt >>/etc/pki/tls/certs/ca-bundle.crt
23cat domain.crt >> /etc/ssl/certs/ca-certificates.crt

三、配置带认证的https仓库

对应的认证文件可以使用htpasswd生成,可以使用docker方式,如果机器上直接有该命令在,也可以直接命令生成:

1//容器方式生成
2$ mkdir auth
3$ docker run \
4  --entrypoint htpasswd \
5  httpd:2 -Bbn testuser testpassword > auth/htpasswd
6//命令方式直接生成
7# htpasswd  -Bbn testuser testpassword > auth/htpasswd

因为上面已经说过证书的配置文件,这里就省略,不再赘述。对应的启动指令如下:

 1$ docker run -d \
 2  -p 5000:5000 \
 3  --restart=always \
 4  --name registry \
 5  -v "$(pwd)"/auth:/auth \
 6  -e "REGISTRY_AUTH=htpasswd" \
 7  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
 8  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
 9  -v "$(pwd)"/certs:/certs \
10  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
11  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
12  registry:2

这时候需要进行操作,就需要先通过登陆认证后,才可以进行操作,如下:

1$ docker login myregistrydomain.com:5000

当然,也可以使用docker-compose的方式进行服务管理,对应的docker-compose.yml文件内容如下:

 1registry:
 2  restart: always
 3  image: registry:2
 4  ports:
 5    - 5000:5000
 6  environment:
 7    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
 8    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
 9    REGISTRY_AUTH: htpasswd
10    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
11    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
12  volumes:
13    - /path/data:/var/lib/registry
14    - /path/certs:/certs
15    - /path/auth:/auth

这样就可以使用docker-compose up -d启动服务。

参考页面:
insecure registry
Deploy a registry server