Docker 自建私有仓库
首先创建存储 镜像的目录 mkdir -p /opt/registry
默认情况下,会将仓库存放于容器内的/tmp/registry 目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry 下。
获取 docker 私有仓库镜像 docker pull registry
启动 registry
docker run -d -e SETTINGS_FLAVOR=dev -e STORAGE_PATH=/tmp/registry -v /opt/registry:/tmp/registry -p 5000:5000 registry
修改所有 docker 节点配置文件
[root@registry ~]# vi /lib/systemd/system/docker.service
找到 ExecStart 行末增加
--insecure-registry 192.168.20.113:5000
保存退出
上传镜像
[root@registry ~]# docker pull busybox
[root@registry ~]# docker tag busybox 192.168.20.113:5000/busybox
[root@registry ~]# docker push 192.168.20.113:5000/busybox
[root@registry ~]# curl http://192.168.20.113:5000/v2/_catalog
{"repositories":["busybox"]}
可以看到镜像已上传
其它节点下载镜像
[root@registry ~]# docker pull 192.168.20.113:5000/busybox
[root@registry ~]# docker images
界面
Docker 官方只提供了 REST API,并没有给我们一个界面。好在有热心人士出马,所以我们只需执行以下命令就可以给我们的私有库提供一个 UI 了:
docker run -d \
-p 8080:8080 \
--name docker-registry-web \
-e REGISTRY_HOST=192.168.20.113 \
-e REGISTRY_PORT=5000\
hyper/docker-registry-web
然后打开 http://192.168.20.113:8080 ,应该就能看到如下界面:
上面是个简易版,如果有更深入的需求,可以尝试 SUSE 的 Portus 。除了界面以外,它还提供了更细粒度的权限控制、用户认证等功能。
认证
我们刚刚配好的 insecure registry 是不支持认证的,如果要上产品环境,找 CA 申请一个证书吧。我们自己测试的话,可以用自签名证书。我们准备使用 IP 代替域名,所以需要在证书里面包含我们的 IP:
registry
sudo mkdir /certs
sudo sed -i '/^\[ v3_ca \]$/a subjectAltName = IP:192.168.33.18' /etc/ssl/openssl.cnf
sudo sh -c "openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout /certs/domain.key \
-x509 -days 365 -out /certs/domain.crt"
随便填点值完成这繁琐的流程,就能看见 certs 里面多了两个文件。现在可以用以下命令来启动 registry:
registry
docker rm -f registry
docker run -d \
-p 5000:5000 \
--name registry \
--restart=always \
-v /var/lib/registry:/var/lib/registry \
-v /certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2.3.0
客户端现在就不需要 --insecure-registry 了,但是由于这是自签名证书,客户端还需要把证书文件复制过去:
client
sudo sed -i '$d' /etc/default/docker
sudo mkdir -p /etc/docker/certs.d/192.168.33.18:5000/
sudo scp vagrant@192.168.33.18:/certs/domain.crt /etc/docker/certs.d/192.168.33.18:5000/ca.crt
sudo service docker restart
注意 vagrant 的默认密码也是 vagrant。现在 push 就没有问题了:
client
docker push 192.168.33.18:5000/busybox:1.24.1
提示镜像已经存在,并没有阻止我们提交。接下来我们加上认证。首先在 registry 生成用户名 hello 和密码 world:
registry
sudo mkdir /auth
sudo sh -c "docker run --entrypoint htpasswd registry:2.3.0 -Bbn hello world > /auth/htpasswd"
还得指定认证方式和认证文件等参数,重新启动 registry 容器:
registry
docker rm -f registry
docker run -d \
-p 5000:5000 \
--name registry \
--restart=always \
-v /var/lib/registry:/var/lib/registry \
-v /auth:/auth \
-v /certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2.3.0
这回客户端用 docker push 192.168.33.18:5000/busybox:1.24.1 来尝试 push 就会失败啦。但是我们可以用用户名 hello 和密码 world 登录了:
client
docker login -u hello -p world -e email_whatever 192.168.33.18:5000
再次 push,就没有问题了:
client
docker push 192.168.33.18:5000/busybox:1.24.1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论