国内外的开源 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