03搭建docker私有仓库

时间:2022-02-06 08:20:26

搭建docker私仓,可以使用docker官方提供的registry镜像。该镜像目前有2.0,2.3和2.3.1版本。它只与1.6.0以上版本的docker兼容。搭建私仓的步骤如下:

一:无代理、无认证的registry

1:下载registry镜像:

docker pull  registry:2

这里必须加上标签”:2”,否则的话,不加标签的registry,实际上下载的是标签为”latest”的registry镜像,则不能使用下面的nginx代理镜像:containersol/docker-registry-proxy

2:创建registry容器:

在registry:2创建的私有仓库中,上传的镜像保存在容器的/var/lib/registry目录下。创建registry:2的容器时,会自动创建一个数据卷(Data Volumes),数据卷对应的宿主机下的目录一般为:/var/lib/docker/volumes/XXX/_data。

可以在创建registry:2的容器时,通过-v参数,修改这种对应关系:

docker run -d -p 5000:5000 --restart=always –v \ /opt/docker/registry/data:/var/lib/registry --name docker-registry registry:2

除了可以将数据保存在当前主机的文件系统上,registry也支持其他基于云的存储系统,比如S3,Microsoft Azure, Ceph Rados, OpenStack Swift and Aliyun OSS等。可以在配置文件中进行配置:https://github.com/docker/distribution/blob/master/docs/configuration.md#storage

以上其实已经创建好了一个docker私有仓库,但是这时候向其push或者pull时还是有问题的:

[@hh_93_197 /]# docker tag hello-world 192.168.1.104:5000/hello-world
[@hh_93_197 /]# docker push 192.168.1.104:5000/hello-world
The push refers to a repository [192.168.1.104:5000/hello-world]
unable to ping registry endpoint https://192.168.1.104:5000/v0/
v2 ping attempt failed with error: Get https://192.168.1.104:5000/v2/: tls: oversized record received with length 20527
v1 ping attempt failed with error: Get https://192.168.1.104:5000/v1/_ping: tls: oversized record received with length 20527

这是因为从docker1.3.2版本开始,使用registry时,必须使用TLS保证其安全。

最简单的解决办法是,在需要连接该私有仓库的所有客户端docker宿主机上,修改dockerdaemon的配置文件,增加insecure-registry参数。

比如,对于Redhat7的宿主机来说,新增文件/etc/systemd/system/docker.service.d/docker.conf,其内容配置如下:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --insecure-registry=192.168.1.104:5000

然后,重启docker:

[root@localhost /]# systemctl daemon-reload
[root@localhost /]# service docker restart

此时就可以使用该私有仓库了。

但是,上面这种配置方式既不安全(所有人都可以push或pull),也很不方便(使用该私有仓库的所有宿主机上都这样进行配置)。

下面是带有认证的registry私仓构建过程:

二:无代理,有认证的registry

使用TLS认证registry容器时,必须有证书。一般情况下,是要去认证机构购买签名证书。这里使用openssl生成自签名的证书。

1:生成自签名证书

一般情况下,证书只支持域名访问,要使其支持IP地址访问,需要修改配置文件openssl.cnf。

在Redhat7系统中,文件所在位置是/etc/pki/tls/openssl.cnf。在其中的[ v3_ca]部分,添加subjectAltName选项:

[ v3_ca ]
subjectAltName = IP:192.168.1.104

接下来就是生成自签名的证书:

mkdir -p /opt/docker/registry/certs

openssl req -x509 -days 3650 -nodes -newkey rsa:2048 \
-keyout /opt/docker/registry/certs/domain.key \
-out /opt/docker/registry/certs/domain.crt
...
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:192.168.1.104:5000
Email Address []:

这里的服务器域名写成”192.168.1.104:5000”,后续就使用该地址访问私仓。其余项直接回车即可。

2:创建带有TLS认证的registry容器

docker run \
-d \
--name docker-registry-no-proxy --restart=always \
-v /opt/docker/registry/data:/var/lib/registry \
-u root \
-p 192.168.1.104:5000:5000 \
-v /opt/docker/registry/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2

3:配置客户端宿主机

目前,已经搭建好了一个registry私有仓库了。但是,访问该私仓还是会报错:

# docker pull 192.168.1.104:5000/redis
Using default tag: latest
Error response from daemon: unable to ping registry endpoint https://192.168.1.104:5000/v0/
v2 ping attempt failed with error: Get https://192.168.1.104:5000/v2/: x509: certificate signed by unknown authority
v1 ping attempt failed with error: Get https://192.168.1.104:5000/v1/_ping: x509: certificate signed by unknown authority

这是因为客户端宿主机上没有相应的证书。需要把registry所在主机上,刚生成的证书:

/opt/docker/registry/certs/domain.crt

复制到客户端宿主机上的:

/etc/docker/certs.d/192.168.1.104:5000/ca.crt

之后,就可以使用该私仓了:

# docker pull 192.168.1.104:5000/redis
Using default tag: latest
latest: Pulling from redis
80ab95908a2b: Pull complete
a3ed95caeb02: Pull complete
47a0d79f89b9: Pull complete
7190081b1686: Pull complete
fe09c22d81ac: Pull complete
a5eae2bcc645: Pull complete
662723161f77: Pull complete
b568670a8ccd: Pull complete
a1a961e320bc: Pull complete
Digest: sha256:769ac80a4711258ec4d6d325f3ad31fbce3bbfa006d5f8aae94c94917dfb0384
Status: Downloaded newer image for 192.168.1.104:5000/redis:latest

更好的方式是使用nginx代理,由nginx提供https的ssl的认证和basicauthentication。方法如下:

三:nginx代理,域名访问的registry

1:生成自签名证书:

mkdir -p /opt/docker/registry/conf
openssl req -x509 -days 3650 -nodes -newkey rsa:2048 \
-keyout /opt/docker/registry/conf/docker-registry.key \
-out /opt/docker/registry/conf/docker-registry.crt ...
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hh.registry.com
Email Address []:

这里的服务器域名写成”hh.registry.com”,其余项直接回车即可。

2:创建能够访问仓库的用户名和密码

htpasswd -b -c -d /opt/docker/registry/conf/docker-registry.htpasswd admin admin

这里的用户名和密码都是admin

3:运行nginx

这里使用容器containersol/docker-registry-proxy运行nginx:

docker run -d \
-p 443:443 \
--name docker-registry-proxy \
-e REGISTRY_HOST="docker-registry" \
-e REGISTRY_PORT="5000" \
-e SERVER_NAME="hh.registry.com" \
--link docker-registry:docker-registry \
-v /opt/docker/registry/conf/docker-registry.htpasswd:/etc/nginx/.htpasswd:ro \
-v /opt/docker/registry/conf:/etc/nginx/ssl:ro \
containersol/docker-registry-proxy

注意,这里的环境变量SERVER_NAME也要设置成”hh.registry.com”.

目前,就已经搭建好了一个registry私有仓库了。但是,还需要在使用它的客户端宿主机执行以下的操作。比如在私有仓库所在的主机上使用它,也要执行以下步骤:

4:修改/etc/hosts文件,增加以下内容,以使客户端宿主机可以解析域名”hh.registry.com”

192.168.1.104 hh.registry.com

5:复制证书

mkdir -p /etc/docker/certs.d/hh.registry.com
cp /opt/docker/registry/conf/docker-registry.crt /etc/docker/certs.d/hh.registry.com/ca.crt

这里是在registry所在主机上进行的操作。如果是其他docker宿主机,需要远程复制该crt文件。

客户端宿主机配置好以后,通过下面的方式验证私有仓库的可用性:

6:列出私有仓库上的所有镜像

#curl -X GET https://admin:admin@hh.registry.com/v2/_catalog -k
{"repositories":["hello-world","ubuntu"]}

7:登陆

#docker login -u admin -p admin -e a hh.registry.com
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded

8:pull镜像

#docker pull hh.registry.com/ubuntu
Using default tag: latest
latest: Pulling from ubuntu
5a132a7e7af1: Pull complete
fd2731e4c50c: Pull complete
28a2f68d1120: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:9409f5e54fdc68ef3f0aae3c5ffac22bfe2aabd0b363a4bdbe5292c93b75a661
Status: Downloaded newer image for hh.registry.com/ubuntu:latest

9:push镜像

# docker tag registry.aliyuncs.com/ddbmh/redis hh.registry.com/redis
# docker push hh.registry.com/redis
The push refers to a repository [hh.registry.com/redis]
5f70bf18a086: Mounted from ubuntu
7986f971c50f: Pushed
590d3336f33c: Pushed
4458b6e6f424: Pushed
39d2b75cc73d: Pushed
cbc6c973b349: Pushed
d53a2702e023: Pushed
5bca8d976dd8: Pushed
603fd967d41c: Pushed
latest: digest: sha256:769ac80a4711258ec4d6d325f3ad31fbce3bbfa006d5f8aae94c94917dfb0384 size: 3823

10:再次列出私有仓库中的所有镜像

# curl -X GET https://admin:admin@hh.registry.com/v2/_catalog -k
{"repositories":["hello-world","redis","ubuntu"]}

四:nginx代理,IP访问的registry

以上的步骤中,访问私仓只能使用域名”hh.registry.com”,如果使用IP访问,则会报错:

#docker login -u admin -p admin -e a 192.168.1.104
Error response from daemon: invalid registry endpoint https://192.168.1.104/v0/: unable to ping registry endpoint https://192.168.1.104/v0/
v2 ping attempt failed with error: Get https://192.168.1.104/v2/: x509: cannot validate certificate for 192.168.1.104 because it doesn't contain any IP SANs
...

如果想用IP地址访问,则执行以下的步骤:

1:在文件/etc/pki/tls/openssl.cnf的[ v3_ca ]部分,添加subjectAltName选项

[ v3_ca ]
subjectAltName = IP:192.168.1.104

2:重新生成证书

openssl req -x509 -days 3650 -nodes -newkey rsa:2048 \
-keyout /opt/docker/registry/conf_ip/docker-registry.key \
-out /opt/docker/registry/conf_ip/docker-registry.crt ...
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hh.registry.com
Email Address []:

这里的服务器域名还是写成”hh.registry.com”即可。其余项直接回车即可。

3:创建能够访问仓库的用户名和密码

htpasswd -b -c -d /opt/docker/registry/conf_ip/docker-registry.htpasswd admin admin

这里的用户名和密码都是admin

4:运行nginx容器

# docker stop docker-registry-proxy
docker-registry-proxy # docker run -d \
-p 443:443 \
--name docker-registry-proxy-ip \
-e REGISTRY_HOST="docker-registry" \
-e REGISTRY_PORT="5000" \
-e SERVER_NAME="hh.registry.com" \
--link docker-registry:docker-registry \
-v /opt/docker/registry/conf_ip/docker-registry.htpasswd:/etc/nginx/.htpasswd:ro \
-v /opt/docker/registry/conf_ip:/etc/nginx/ssl:ro \
containersol/docker-registry-proxy

搭建好registry私有仓库后,在需要访问该私仓的客户端docker宿主机上,无需修改/etc/hosts文件,直接将registry主机上的证书,复制成客户端docker宿主机上的/etc/docker/certs.d/192.168.1.104/ca.crt文件。

客户端docker宿主机配置好以后,验证步骤如下:

# curl -X GET https://admin:admin@192.168.1.104/v2/_catalog -k
{"repositories":["hello-world","redis","ubuntu"]}
# docker login -u admin -p admin -e a 192.168.1.104
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
# docker pull 192.168.1.104/redis
Using default tag: latest
latest: Pulling from redis
80ab95908a2b: Pull complete
a3ed95caeb02: Pull complete
47a0d79f89b9: Pull complete
7190081b1686: Pull complete
fe09c22d81ac: Pull complete
a5eae2bcc645: Pull complete
662723161f77: Pull complete
b568670a8ccd: Pull complete
a1a961e320bc: Pull complete
Digest: sha256:769ac80a4711258ec4d6d325f3ad31fbce3bbfa006d5f8aae94c94917dfb0384
Status: Downloaded newer image for 192.168.1.104/redis:latest

参考:

https://docs.docker.com/registry/

https://hub.docker.com/r/chalimartines/cdh5-pseudo-distributed/

http://www.pangxie.space/docker/353

https://docs.docker.com/registry/insecure/

http://www.tianmaying.com/tutorial/docker-registry

03搭建docker私有仓库的更多相关文章

  1. 一步步搭建docker私有仓库并从私有仓库中下载镜像

    一步步搭建docker私有仓库 #下载镜像 docker pull registry#查看镜像 docker images #运行私有仓库,指定端口和数据卷 docker run -d -p : -v ...

  2. 搭建docker私有仓库

    保存镜像的地方成为仓库(registry).目前有2种仓库:公共仓库和私有仓库. 最方便的是使用公共仓库上传和下载镜像,下载不需要注册,上传需要到公共仓库注册.公共仓库网站:https://hub.d ...

  3. windows 环境下搭建docker私有仓库

    windows 环境下搭建docker私有仓库 1.在公用仓库中pull仓库镜像 docker pull regitry 2.启动仓库镜像 //-d意思是后台运行,-p是做端口映射,这里是将本地的50 ...

  4. Docker自学纪实(六)搭建docker私有仓库

    docker的镜像仓库分两种:一种是从官方公有仓库拉取:还有就是自己搭建私有仓库.官方的镜像仓库是面对整个应用市场的:私有仓库一般用于公司内部,就是公司项目自身所需的镜像.搭建私有仓库有什么好处?私有 ...

  5. CentOS7搭建Docker私有仓库----Docker

    有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似.目前Docker Registry已经升级到了v2 ...

  6. 搭建docker私有仓库,建立k8s集群

    服务器IP角色分布 192.168.5.2 etcd server 192.168.5.2 kubernetes master 192.168.5.3 kubernetes node 192.168. ...

  7. 搭建docker私有仓库(https)

    1.修改openssl.cnf,支持IP地址方式,HTTPS访问在Redhat7或者Centos系统中,文件所在位置是/etc/pki/tls/openssl.cnf.在其中的[ v3_ca]部分,添 ...

  8. 手把手教你搭建Docker私有仓库

    章节一:centos7 docker安装和使用_入门教程 章节二:使用docker部署Asp.net core web应用程序 有了前面的基础,接下来的操作就比较简单了.先准备两台虚拟机,两台机器上都 ...

  9. 微服务探索之路03篇-docker私有仓库Harbor搭建+Kubernetes(k8s)部署私有仓库的镜像

    ❝ 目录: 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernet ...

随机推荐

  1. three.js模型

    Three.js有一系列导入外部文件的辅助函数,是在three.js之外的,使用前需要额外下载, 在https://github.com/mrdoob/three.js/tree/master/exa ...

  2. SQL语句操作大全

    SQL语句操作大全   本文分为以下六个部分: 基础部分 提升部分 技巧部分 数据开发–经典部分 SQL Server基本函数部分 常识部分 一.基础 1.说明:创建数据库CREATE DATABAS ...

  3. CentOS中由一般用户切换为root用户

    --->http://www.centoscn.com/CentOS/help/2014/0624/3173.html 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车 ...

  4. python + selenium <一>

    python 安装 python 下载地址: http://python.org/getit/ ez_setup.py 下载地址: https://pypi.python.org/packages/s ...

  5. Docker(二):Docker镜像使用

    1.Docker Image介绍 简单来说,Docker Image是用来启动容器的只读模板. Docker Image被划分了三个部分:Remote-dockerhub.com/namespace/ ...

  6. Number()和new Number()的区别以及一种简单实现

    看MDN Beginners文档的时候注意到了这种用法 var n1 = Number(123); , 冒出的第一个疑问就是和 var n2 = new Number(123); 有什么区别呢? 首先 ...

  7. ubuntu部分端口命令的使用----开启端口/开启防火墙

    环境系统: ubuntu 工具:xshell + virtualbox 1.测试远程主机的端口是否开启(windows命令行下执行) telnet 192.168.1.103 80 远程访问主机的80 ...

  8. ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  9. AutoHotKey (AHK) 按键表+自定义快捷键简化操作的教程

    自定义快捷键简化操作的教程 ① 下载安装AutoHotKey,并用记事本新建一个MyHotKey.ahk文件,录入如②中信息 ② 下图可以实现,按F6即可触发“Ctrl+C”的复制快捷键,同理F7可实 ...

  10. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...