文章目录
一、docker仓库认识
docker 仓库,即所谓registry,实现了镜像的管理、分发,同时还包括用户的认证。dockerregistry仓库是一个无状态的、高可靠的服务器应用程序,用来存储docker镜像。
docker.io为docker官方的仓库,默认所有的pull均是从官方仓库拉取镜像。
有时候使用Docker Hub这样的公共仓库可能不方便,例如,公司内部平台应用如果使用docker镜像,则必须搭建私有仓库。
二、官方私有仓库registry
1. 私有仓库registry搭建
Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了。
docker pull registry
# $user改成你的用户名
docker run -d -p 5000:5000 --restart=always -v /home/$user/registry:/var/lib/registry registry
docker run -d -p 5000:5000 --restart=always -v /home/shepf/registry:/var/lib/registry registry
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,-v 映射宿主机路径。
–restart=always 代表当容器因为某些原因停止时,不管退出码是什么都自动重启。除了 always 还有 on-failure 代表只有退出码不为 0 时才重启,并且接受重启次数参数:–restart=on-failture:5
浏览器访问http://127.0.0.1:5000/v2,出现下面情况说明registry运行正常。
验证
现在通过push镜像到registry来验证一下。要上传镜像到私有仓库,需要在镜像的 tag 上加入仓库地址:
# 通过docker tag重命名镜像
docker pull busybox #先下载最新的镜像
docker tag busybox:latest 127.0.0.1:5000/busybox:v1 #tag
# push tag后的镜像到registry
docker push 127.0.0.1:5000/busybox:v1
访问 http://127.0.0.1:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了。
本地的简单上传下载docker镜像,这个已经够用了- -!
docker registry私库镜像查看与删除
1、列出所有的镜像
curl -X GET http://192.168.37.100:5000/v2/_catalog
2、列出指定镜像的所有标签
2.1查看镜像busybox下的tag
curl -X GET http://192.168.37.100:5000/v2/busybox/tags/list
- 删除registry中的镜像
docker registry私库镜像查看与删除
参考URL: https://blog.youkuaiyun.com/nklinsirui/article/details/80705306#%E5%88%A0%E9%99%A4registry%E4%B8%AD%E7%9A%84%E9%95%9C%E5%83%8F
删除registry比较复杂,需要先查到指定标签的镜像的digest (sha256校验和),再根据这个digest来删除。
下面以删除192.168.37.100:5000/busybox/:0.0.1 镜像为例。
curl -v --silent -H “Accept: application/vnd.docker.distribution.manifest.v2+json” -X GET http://192.168.37.100:5000/v2/busybox/manifests/0.0.1 2>&1 | grep Docker-Content-Digest | awk ‘{print ($3)}’
Digest输出例子:
Docker-Content-Digest: sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335
执行以下命令,根据digest删除镜像:
curl -v --silent -H “Accept: application/vnd.docker.distribution.manifest.v2+json” -X DELETE http://192.168.37.100:5000/v2/busybox/manifests/sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335
这里的删除镜像只是删除了一些元数据,需要执行下面的垃圾回收才能真正地从硬盘上删除镜像数据。
因为缺省Docker private registry不允许删除镜像,如果遇到“405 Unsupported” 错误,需要在运行registry容器时设置REGISTRY_STORAGE_DELETE_ENABLED环境变量或参数为true。
docker-compose.yaml 例子:
environment:
REGISTRY_STORAGE_DELETE_ENABLED: "true"
docker run 例子:
-e REGISTRY_STORAGE_DELETE_ENABLED="true"
2. 出现问题整理
push到本地docker镜像仓库报错 erver gave HTTP response to HTTPS client
Get https://10.111.111.201:5000/v2/: http: server gave HTTP response to HTTPS client
docker客户端主机上,执行
vi /etc/docker/daemon.json
添加
"insecure-registries":["xxx.xxx.xxx.xxx:5000"]
# 最后重启服务
$ systemctl daemon-reload
$ systemctl restart docker
DockerRegistry设置Https
DockerRegistry设置Https
参考URL: https://www.jianshu.com/p/37da34d7e4df
linux(ubuntu)环境搭建docker-registry-https
参考URL: http://www.imooc.com/article/277196
粘贴,如下,未测试验证。 本地测试完成可以不用改Registry服务器端为https,docker客户端修改
vi /etc/docker/daemon.json
添加
“insecure-registries”:[“xxx.xxx.xxx.xxx:5000”]
已经满足个人需求。
docker version 1.6.0以上
- 创建docker仓库数据和配置目录
sudo mkdir -p /opt/docker/registry/data
sudo mkdir -p /opt/docker/registry/conf
- 创建registry容器并挂载到/opt/docker/registry/data下
sudo docker run -d -p 5000:5000 \
-v /opt/docker/registry/data:/var/lib/registry \
--name docker-registry registry:2.6.2
- 给registry 添加用户
apt-get install apache2-utils \
htpasswd -c /opt/docker/registry/conf/docker-registry.htpasswd rennbon
添加完一个用户后再添加其他用户不需要 "-c"
- 获取SSL证书
网上很多用openssl生成证书的方法,我这里也照着试用了下,但是因为不被信任等问题导致docker login失败,这里主要通过letsencrypt生成证书
git clone https://github.com/letsencrypt/letsencryptcd letsencrypt
./letsencrypt-auto --help
这里菜兄我碰到了如下问题
OSError: Command /opt/eff.org/certbot/venv/bin/python2.7 - setuptools pkg_resources pip wheel failed with error code 2"解决方法"pip uninstall virtualenv
pip install virtualenv
给自己的域名生成证书
./letsencrypt-auto certonly --standalone -d <HOST>
执行成功后出现以下目录
/etc/letsencrypt/live/<HOST> 目录
然后执行copy,将公钥和私钥copy到当初建造了registry配置目录下,当然这里也可以不copy,在下面的Nginx代理的时候挂载当前目录
cp /etc/letsencrypt/live/<host>/fullchain.pem /opt/docker/registry/conf/docker-registry.crt
cp /etc/letsencrypt/live/<host>/privkey.pem /opt/docker/registry/conf/docker-registry.key
- docker nginx 代理
sudo docker run -d \
-p 443:443 \
--name docker-registry-proxy \
-e REGISTRY_HOST="docker-registry" \
-e REGISTRY_PORT="5000" \
-e SERVER_NAME="<host>" \
--link docker-registry:docker-registry \
-v /opt/docker/registry/conf/docker-registry.htpasswd:/etc/nginx/.htpasswd:ro \
-v /opt/docker/registry/conf:/etc/nginx/ssl:ro \
containersol/docker-registry-proxy
7. 远程登录宿主机docker registry
docker login <host>Username:
Password:
Login Succeeded
三、【推荐】Docker私有仓库管理之Harbor搭建
1. 什么是Harbor
官网: https://goharbor.io/
https://github.com/goharbor/harbor
Our mission is to be the trusted cloud native repository for Kubernetes
Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库【注:helm就相当于k8s的yum】。另外它还整合了两个开源的安全组件,一个是Notary,另一个是Clair,Notary类似于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的CVE漏洞库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。
harbor是VMWare公司提供的一个docker私有仓库构建程序,功能非常强大.
支持多租户签名和认证 支持安全扫描和风险分析 这次日志审计 基于角色的访问控制 支持可扩展的API和GUI Image replication between instances 国际化做的很好(目前仅支持英文和中文)
2. 为什么有了Docker registry还需要Harbor?
https://blog.youkuaiyun.com/zhangzijiejiayou/article/details/76472520
https://blog.youkuaiyun.com/luckytanggu/article/details/70285837
Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等。
官方地址:https://vmware.github.io/harbor/cn/
3. 安装
直接参考官网即可:https://goharbor.io/docs/2.4.0/install-config/
在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
离线安装:安装包包含部署的相关镜像,因此安装包比较大
OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor
https://github.com/goharbor/harbor/releases
比如我们下载 harbor-offline-installer-v2.4.1.tgz