docker私有仓库搭建

文章目录

    • docker仓库认识
      • 官方私有仓库registry搭建
        • docker registry私库镜像查看与删除
      • 出现问题整理
        • push到本地docker镜像仓库报错 erver gave HTTP response to HTTPS client
    • DockerRegistry设置Https
    • Docker私有仓库管理之Harbor搭建
    • 阿里云镜像仓库使用
    • 网易蜂巢镜像仓库使用
    • docker 镜像导入导出

docker仓库认识

docker 仓库,即所谓registry,实现了镜像的管理、分发,同时还包括用户的认证。dockerregistry仓库是一个无状态的、高可靠的服务器应用程序,用来存储docker镜像。docker.io为docker官方的仓库,默认所有的pull均是从官方仓库拉取镜像。

公司内部平台应用如果使用docker镜像,则必须搭建私有仓库。

官方私有仓库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运行正常。
docker私有仓库搭建_第1张图片

验证
现在通过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

  1. 删除registry中的镜像
    docker registry私库镜像查看与删除
    参考URL: https://blog.csdn.net/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"

出现问题整理

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以上

  1. 创建docker仓库数据和配置目录
sudo mkdir -p /opt/docker/registry/data
sudo mkdir -p /opt/docker/registry/conf
  1. 创建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
  1. 给registry 添加用户
apt-get install apache2-utils \
htpasswd -c /opt/docker/registry/conf/docker-registry.htpasswd rennbon

添加完一个用户后再添加其他用户不需要 "-c"
  1. 获取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 
执行成功后出现以下目录


/etc/letsencrypt/live/ 目录

然后执行copy,将公钥和私钥copy到当初建造了registry配置目录下,当然这里也可以不copy,在下面的Nginx代理的时候挂载当前目录
cp /etc/letsencrypt/live//fullchain.pem  /opt/docker/registry/conf/docker-registry.crt
cp /etc/letsencrypt/live//privkey.pem /opt/docker/registry/conf/docker-registry.key
  1. 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="" \
--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 Username:
Password:
Login Succeeded

Docker私有仓库管理之Harbor搭建

为什么有了Docker registry还需要Harbor
https://blog.csdn.net/zhangzijiejiayou/article/details/76472520
https://blog.csdn.net/luckytanggu/article/details/70285837

Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等。

阿里云镜像仓库使用

https://dev.aliyun.com/search.html

目前上传本地镜像到网上有多种途径,一个是上传到hub上,一个是阿里云镜像仓库,还要其他服务器。
上传到hub上实在是太慢了,我的服务器用的是阿里云,所以选择上传到阿里云镜像仓库中。

阿里云docker register登录
参考URL: https://blog.csdn.net/qq_19674905/article/details/79705509
docker镜像上传到阿里云
参考URL: https://www.cnblogs.com/afangxin/p/6601099.html

网易蜂巢镜像仓库使用

https://c.163yun.com/hub

即使你配置了阿里的镜像源,还是可以通过如下类似的命令从 其他镜像源中下载docker镜像。

docker pull hub.c.163.com/public/nginx:1.2.1

对比阿里docker仓库和网易蜂巢,感觉网易做的好一点,镜像库给你做了分类比较清晰,而且每个镜像 pull 命令都带了网址信息,可以方便让你从他们的地址pull镜像。下载量、收藏数显示的都比较清晰。

docker 镜像导入导出

镜像导出

命令
docker save [options] images [images...]
示例
docker save -o nginx.tar nginx:latest

镜像导入

命令
docker load [options]
示例
docker load -i nginx.tar
[root@localhost ~]# docker load -i registry.tar 
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# 
[root@localhost ~]# systemctl restart docker.service

你可能感兴趣的:(Docker)