Docker私有仓库的搭建与使用

Docker私有仓库的搭建与使用
和Maven一样,Docker不仅提供了一个中央仓库,同时也允许我们搭建私有仓库。
如果读者对Maven有所了解,将会很容易理解私有仓库的优势:
节省带宽,镜像无需从中央仓库下载,只需从私有仓库中下载即可
对于私有仓库中已有的镜像,提升了下载速度
便于内部镜像的统一管理


下面我们来讲解一下如何搭建、使用私有仓库
准备工作
准备两台安装有Docker的CentOS7的机器,主机规划如下(仅供参考):
主机 IP 角色
node0 192.168.11.143 Docker开发机
dockerhub 192.168.72.50 Docker私有仓库
安装、使用私有仓库
网上有很多 docker-registry 的教程,但是 docker-registry 已经过时,并
且已经2年不维护了。详见https://github.com/docker/docker-registry ,故而本文不
做探讨,对 docker-registry 有兴趣的童鞋可以查阅本节的参考文档。
本节讲解registry V2,registry V2需要Docker版本高于1.6.0。registry V2要求使用
https访问,那么我们先做一些准备,为了方便,这边模拟以域
名 reg.dockerhub.upenny.cn 进行讲解。
使用域名搭建https的私有仓库
首先修改两台机器的hosts,配置 192.168.72.50 到 reg.dockerhub.upenny.cn 的
映射


echo '192.168.72.50 reg.dockerhub.upenny.cn'>> /etc/hosts
既然使用https,那么我们需要生成证书,本文讲解的是使用openssl自签名证
书,当然也可以使用诸如 Let’s Encrypt 等工具生成证书,首先在dockerhub机
器上生成key:
mkdir -p ~/certs
cd ~/certs
openssl genrsa -out reg.dockerhub.upenny.cn.key 2048
再生成密钥文件:
openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.dockerhub.upenny.cn.key -x509 -days 365 -out reg.dockerhub.upenny.cn.crt
会有一些信息需要填写:
Country Name (2 letter code) [XX]:CN
# 你的国家名称
State or Province Name (full name) []:JS
# 省份
Locality Name (eg, city) [Default City]:NJ
# 所在城市
Organization Name (eg, company) [Default Company Ltd]:upenny
# 组织名称
Organizational Unit Name (eg, section) []:upenny
# 组织单元名称
Common Name (eg, your name or your server's hostname) []:reg.dockerhub.upenny.cn # 域名
Email Address []:eacdy0000@126.com
# 邮箱
这样自签名证书就制作完成了。
由于是自签名证书,默认是不受Docker信任的,故而需要将证书添加到Docker
的根证书中,Docker在CentOS 7中,证书存放路径


是 /etc/docker/certs.d/域名 :
dockerhub 端:
mkdir -p /etc/docker/certs.d/reg.dockerhub.upenny.cn
cp ~/certs/reg.dockerhub.upenny.cn.crt /etc/docker/certs.d/reg.dockerhub.upenny.cn/




node0 端:将生成的证书下载到根证书路径
mkdir -p /etc/docker/certs.d/reg.dockerhub.upenny.cn
scp root@192.168.72.50:/root/certs/reg.dockerhub.upenny.cn.crt /etc/docker/certs.d/reg.dockerhub.upenny.cn/


重新启动 node0 和 dockerhub 的Docker
service docker restart
在 dockerhub 上启动私有仓库
首先切换到家目录中,这一步不能少,原因是下面的-v 挂载了证书,如果不切换,
将会引用不到证书文件。
cd ~
启动Docker私有仓库(注意:如果直接粘贴运行,请删除掉注释):


docker run -d -p 443:5000 --restart=always --name registry \
-v `pwd`/certs:/certs \ # 将“当前目录/certs”挂载到容器的“/certs”
-v /opt/docker-image:/opt/docker-image \
-e STORAGE_PATH=/opt/docker-image \
# 指定容器内存储镜像的路径
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.dockerhub.upenny.cn.crt \
# 指定证书文件
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.dockerhub.upenny.cn.key \
# 指定key文件
registry:2


改正为:
docker run -d -p 443:5000 --restart=always --name registry4 \
-v `pwd`/certs:/certs \
-v /opt/docker-image:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.dockerhub.upenny.cn.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.dockerhub.upenny.cn.key \
registry:2
其中,之所以挂载/opt/docker-image目录,是为了防止私有仓库容器被删除,私有仓库中的镜像也会丢失。
在 node0 上测试,将镜像push到私服
docker pull kitematic/hello-world-nginx
docker tag kitematic/hello-world-nginx reg.dockerhub.upenny.cn/kitematic/hello-world-nginx # 为本地镜像打标签
docker push reg.dockerhub.upenny.cn/kitematic/hello-world-nginx
# 将镜像push到私服
会发现如下内容:
The push refers to a repository [reg.dockerhub.upenny.cn/kitematic/helloworld-nginx]
5f70bf18a086: Pushed
b51acdd3ef48: Pushed
3f47ff454588: Pushed
....
latest: digest: sha256:d3e1883b703c39556f2f09da14cc3b820f69a4343
6655c882c0c0ded0dda6a4b size: 3226
说明已经push成功。
从私服中下载镜像:


docker pull reg.dockerhub.upenny.cn/kitematic/hello-world-nginx
配置登录认证
在很多场景下,我们需要用户登录后才能访问私有仓库,那么我们可以如下操作:
建立在上文生成证书,同时重启过Docker服务的前提下,我们讲解一下如何配置:
为防止端口冲突,我们首先删除或停止之前启动好的私有仓库:
docker kill registry




在dockerhub机器上安装 httpd-tools :
yum install httpd-tools
在dockerhub机器上创建密码文件,并添加一个用户 zhaixl ,密码是 zhaixl :
cd ~
mkdir auth
htpasswd -Bbn zhaixl zhaixl > auth/htpasswd
在dockerhub机器上切换到 ~ 目录,并启动私有仓库(注意:如果直接粘贴运
行,请删除掉注释):


docker run -d -p 443:5000 --restart=always --name registry2 \
-v /opt/docker-image:/var/lib/registry \
# 挂载容器内存储镜像路径到宿主机
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.dockerhub.upenny.cn.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.dockerhub.upenny.cn.key \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2


docker run -d -p 443:5000 --restart=always --name registry2 \
-v /opt/docker-image:/var/lib/registry \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.dockerhub.upenny.cn.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.dockerhub.upenny.cn.key \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
测试:
docker push reg.dockerhub.upenny.cn/kitematic/hello-world-nginx
提示:
461f75075df2: Image push failed
no basic auth credentials
说明需要认证。
我们登陆一下,执行:
docker login reg.dockerhub.upenny.cn
再次执行
docker push reg.dockerhub.upenny.cn/kitematic/hello-world-nginx
就可以正常push镜像到私有仓库了。
注意:如果想要从私有仓库上下载镜像,同样需要登录。
docker pull reg.dockerhub.upenny.cn/kitematic/hello-world-nginx

深圳逆时针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值