docker registry仓库的配置使用

docker registry仓库有点类似于yum原之于rpm包的感觉。内部环境搭建以后,就不用每次去外网拉取images镜像再到本地后运行了。也可以把本地自定义的镜像存放到registry里,不过registry如此便利,现网中还是不推荐使用,现网中更推荐使用<a href="https://www.361way.com/harbor-install/6511.html" target="_blank" rel="noopener noreferrer">Harbor仓库</a>。

一、简单安装使用

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



<br />
# docker pull registry
# 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目录里有镜像数据,就可以通过如下指令查看到内容:



<br />
//查看私有仓库,如果目前没有存储镜像就会显示为空
[root@localhost ~]# curl -XGET 127.0.0.1:5000/v2/_catalog
{"repositories":["python3.7"]}
//查看镜像版本列表
[root@localhost ~]# curl -XGET 127.0.0.1:5000/v2/image_name/tags/list
{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"image_name"}}]}
此时把一个外网下载的镜像push到该私有仓库或者在其他主机上pull该私有仓库里的镜像时,是会报错的。报错内容如下:



<br />
The push refers to a repository [192.168.159.135:5000/python3.7]
Get https://192.168.159.135:5000/v1/_ping: http: server gave HTTP response to HTTPS client
报错原因是这是个不受信息的仓库,想要成功使用,需要在对应的docker主机上的/etc/docker/daemon.json 文件中增加如下内容并重启docker服务生效:



<br />
[root@localhost docker]# cat /etc/docker/daemon.json
{"insecure-registries":["192.168.159.135:5000"] }
[root@localhost docker]# systemctl daemon-reload
[root@localhost docker]# systemctl restart docker
podman环境下,需要在/etc/containers/registries.conf文件中增加如下配置:



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

二、配置https的registry仓库

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



<br />
openssl 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机器上:



<br />
cp certs/domain.crt /etc/docker/certs.d/hub.361way.com:5000/ca.crt
如果使用的是其他端口,也可以把端口修改掉。将domain.crt内容放入系统的CA bundle文件当中,使操作系统信任我们的自签名证书。



<br />
CentOS中bundle文件的位置在/etc/pki/tls/certs/ca-bundle.crt:
# cat domain.crt >> /etc/pki/tls/certs/ca-bundle.crt
Ubuntu/Debian Bundle文件地址/etc/ssl/certs/ca-certificates.crt
$ cat domain.crt >> /etc/ssl/certs/ca-certificates.crt
启动DOCKER REGISTRY



<br />
$ docker run -d \
  --restart=always \
  --name registry \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -p 443:443 \
  registry:2
这里需要注意,访问需要使用域名方式。如果还想要使用IP地址,就需要在证书生成的时候修改openssl.cnf,支持IP地址方式,HTTPS访问。在Redhat7或者Centos系统中,文件所在位置是/etc/pki/tls/openssl.cnf。在其中的[ v3_ca]部分,添加subjectAltName选项。如下:



<br />
[ v3_ca ]
subjectAltName= IP:47.99.240.20
openssl生成自签名的证书的内容如下:



<br />
# openssl req -newkey rsa:2048 -nodes -sha256-keyout /root/certs/domain.key -x509 -days 365 -out /root/certs/domain.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:hangzhou
Locality Name (eg, city) [Default City]:hangzhou
Organization Name (eg, company) [DefaultCompany Ltd]:mycom
Organizational Unit Name (eg, section)[]:it
Common Name (eg, your name or your server'shostname) []:47.99.240.20
Email Address []:itybku@163.com
执行成功后会生成:domain.key 和domain.crt 两个文件,cp证书到使用Docker Registry的Docker机器上:



<br />
cp domain.crt/etc/docker/certs.d/47.99.240.20:5000/ca.crt
这里的IP和端口以实际使用中的为准,后面将domain.crt内容放入系统的CA bundle文件当中,使操作系统信任我们的自签名证书步骤是一样的。



<br />
cat domain.crt >>/etc/pki/tls/certs/ca-bundle.crt
或
cat domain.crt >> /etc/ssl/certs/ca-certificates.crt
<br />

三、配置带认证的https仓库

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



<br />
//容器方式生成
mkdir auth docker run \
  --entrypoint htpasswd \
  httpd:2 -Bbn testuser testpassword > auth/htpasswd
//命令方式直接生成
# htpasswd  -Bbn testuser testpassword > auth/htpasswd
因为上面已经说过证书的配置文件,这里就省略,不再赘述。对应的启动指令如下:



<br />
$ docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v "$(pwd)"/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2
这时候需要进行操作,就需要先通过登陆认证后,才可以进行操作,如下:



<br />
$ docker login myregistrydomain.com:5000
当然,也可以使用docker-compose的方式进行服务管理,对应的docker-compose.yml文件内容如下:



<br />
registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /path/data:/var/lib/registry
    - /path/certs:/certs
    - /path/auth:/auth
这样就可以使用docker-compose up -d启动服务。



参考页面:



<a href="https://docs.docker.com/registry/insecure/" target="_blank" rel="noopener noreferrer">insecure registry</a>



<a href="https://docs.docker.com/registry/deploying" target="_blank" rel="noopener noreferrer">Deploy a registry server</a>



<br />

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注