docker registry仓库的配置使用

2020年12月25日 发表评论 阅读评论

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

一、简单安装使用

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

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

//查看私有仓库,如果目前没有存储镜像就会显示为空
[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该私有仓库里的镜像时,是会报错的。报错内容如下:

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服务生效:

[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文件中增加如下配置:

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

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

二、配置https的registry仓库

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

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

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

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

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

$ 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选项。如下:

[ v3_ca ]
subjectAltName= IP:47.99.240.20

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

# 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机器上:

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

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

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

三、配置带认证的https仓库

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

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

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

$ 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

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

$ docker login myregistrydomain.com:5000

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

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启动服务。

参考页面:

insecure registry

Deploy a registry server




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: Docker/k8s/etcd 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.