docker registry仓库的配置使用
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 []:[email protected]
执行成功后会生成: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
2或
3cat 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启动服务。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/docker-registry/6561.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.