Featured image of post 程序员的树莓派(四):配置一个本地私有 Docker Registry 仓库

程序员的树莓派(四):配置一个本地私有 Docker Registry 仓库

决定将树莓派用作测试服务器以来,一些 api 项目的部署,还是用 docker 比较方便。虽然国内一些厂商也提供了免费的 docker registry 仓库服务,但是总体来说在局域网内能解决的测试部署,没必要再去外网兜一圈。

国内外的开源 docker 仓库有很多,比如 Harbor / Nexus 等,阿里云和腾讯云,也为有主机的用户提供了免费的 docker registry 仓库服务,虽然限量 3 个(阿里云),但聊胜于无,是能解决一些需求。不过本着测试站的方便部署,以及不想每次数百兆数据提交到外网,再拉回到自己的测试服务器,还是希望在树莓派上直接部署一个私有的 Docker Registry 仓库。

原理

本质上是从 Docker Hub 拉取一个 registry 镜像,然后建立目录映射和登录认证,同时使用另一个 httpd 镜像验证登录。

本文不讨论 Docker Hub 的国内源配置,如需了解相关问题可访问文章:

安装与配置

下载官方 registry 镜像:

sudo docker pull registry

创建本地映射目录:

sudo mkdir -p /mnt/yourusername/docker_repo

启动镜像并建立登录认证:

sudo docker run --entrypoint htpasswd registry -Bbn yourusername yourpassword

重启 docker :

sudo systemctl restart docker

增加登录验证

建立一个保存用户 auth 信息的目录:

sudo mkdir /home/yourusername/auth/docker_auth

启动一个 http:2 的镜像并生成一个 docker_auth 文件保存用户名与密码,该过程中如果本地没有 http:2 镜像,会自动从 Docker Hub 拉取。

sudo docker run --entrypoint htpasswd httpd:2 -Bbn 「username」 「userpassword」 > /home/yourusername/auth/htpasswd

启动一个带有登录验证的服务:

docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/yourusername/docker_repo:/var/lib/registry -v /home/yourusername/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

验证启动成功:

http://yourlocalhost:5000/v2/_catalog

命令行验证:

docker login yourlocalhostIP:5000

常用操作

一些常用的 docker 操作:

Tag 镜像至标准格式:URL:PROT/PRODUCTNAME:VERSION

docker tag IMAGE_ID yourlocalhostIP:5000/product_name:0.1

推送镜像到私有仓库

docker push yourlocalhostIP:5000/product_name:0.1

服务端从仓库拉取镜像

docker pull yourlocalhostIP:5000/product_name:0.1

服务端运行镜像(例)

docker run -d -p 7002:7002 product_name:0.1

删除服务端镜像仓库中的镜像

方法一,通过远程请求(需镜像仓库服务启用 https)

Step 1 先获取当前镜像的 sha256 值:

curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET -u yourusername:yourpassword
http://yourlocalhostIP:5000/v2/product_name/manifests/0.1

Step 2 再用 sha256 值删除镜像:

curl -I -XDELETE -u yourusername:yourpassword http://yourlocalhostIP:5000/v2/product_name/manifests/6fc35891a2364eaea1bf6ce3594a9b30b6af48d7524a88fa9bde10bf2545a5ae

经实践,本方法在启用并配置了 https 服务后可行,如果不为镜像仓库配置 https,删除请求会返回 405

方法二,无需启用并配置 https 服务

进入正在运行的 docker 容器:

docker exec -it 281a2179440a /bin/sh

进入 registry 仓库对应文件夹:

cd /var/lib/registry/docker/registry/v2/repositories

删除相关仓库:

rm -rf <image-name>

退出运行中的 docker 容器:

exit