返回介绍

Docker 自建私有仓库

发布于 2023-07-12 13:02:46 字数 3968 浏览 0 评论 0 收藏 0

首先创建存储 镜像的目录 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文