设为首页 收藏本站
查看: 1202|回复: 0

[经验分享] docker 仓库及镜像的上传下载

[复制链接]

尚未签到

发表于 2019-2-21 11:03:24 | 显示全部楼层 |阅读模式
Docker 仓库
  仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
  一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
  仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
  当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
一、搭建私有仓库
  下载registry镜像
docker pull registry
  下载完之后通过该镜像启动一个容器
  [root@foundation12 ~]# docker run -d -p 5000:5000 --name registry registry:2.3.1

  查看,端口已打开

  
  查看存在镜像

  [root@foundation12 ~]# docker images


  使用docker tag 将 game2048 这个镜像标记为 localhost:5000/game2048
  格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
  
  [root@foundation12 ~]# docker tag game2048 localhost:5000/game2048    给已存在的镜像打上tag
  

  [root@foundation12 ~]# docker images


  

  使用 docker push 上传标记的镜像
  [root@foundation12 ~]# docker push localhost:5000/game2048
  
  
curl 查看仓库中的镜像
  [root@foundation12 ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["game2048"]}

以看到
{"repositories":["game2048"]},表明镜像已经被成功上传了

  先删除已有镜像,再尝试从私有仓库中下载这个镜像
  [root@foundation12 ~]# docker rmi localhost:5000/game2048
  

  拉取镜像
  [root@foundation12 ~]# docker pull localhost:5000/game2048
  

  [root@foundation12 ~]# docker image ls   


  

  如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.122.1:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。
  这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。
  再次上传一个镜像

  
  
  这个问题可能是由于客户端采用https,docker registry未采用https服务所致。一种处理方式是把客户对地址“192.168.1.100:5000”请求改为http。
  目前很多文章都是通过修改docker的配置文件“etc/systemconfig/docker",重启docker来解决这个问题。但发现docker1.12.3版本并无此文件,根据网上创建此文件,并填入相应内容,重启docker无效果,仍然报此错误。
  解决方法:
  在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:
{ "insecure-registries":["192.168.122.1:5000"] }
  保存退出后,重启docker。
  编辑daemon文件 ,写入本地ip和端口

  [root@foundation12 docker]# vim daemon.json


  重起服务 ,手动开启registry

  
  再次上传

  [root@foundation12 docker]# docker push 192.168.122.1:5000/nginx

  关闭和删除

  

二、生成自签名证书
  在服务器主机上生成自签名证书,创建一个文件夹用于存放证书
  [root@foundation12 docker]# pwd
/tmp/docker
[root@foundation12 docker]# mkdir certs
[root@foundation12 docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
Generating a 4096 bit RSA private key
................................................................................++
................................................................................++
writing new private key to 'certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:cara
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:mycara.com
Email Address []:root@mycara.com

  certs文件夹就可以看到生成两个文件
  
  

  运行仓库镜像
  [root@foundation12 docker]# docker run -d \
> --restart=always \
> --name registry \
> -v `pwd`/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
> -p 443:443 \
> registry:2.3.1

  如下,容器启动,端口打开

  域名要有解析

  [root@foundation12 docker]# vim /etc/hosts


配置客户端
  我做实验的是一台服务器,所以均在一台主机上进行配置的。
  如果你的服务器作为Docker仓库使用,客户端在另一台主机上作为客户端来上传或拉取镜像,则如下操作本应在客户端执行;
  创建目录
  [root@foundation12 certs]# mkdir -p /etc/docker/certs.d/mycara.com/
[root@foundation12 certs]# cp domain.crt /etc/docker/certs.d/mycara.com/ 服务器端生成的的.crt复制到客户端服务器的/etc/docker/certs.d/mycara.com/  目录下

  将打了tag的镜像上传

  [root@foundation12 certs]# docker tag game2048 mycara.com/game2048
[root@foundation12 certs]# docker push mycara.com/game2048

  拉取镜像

  [root@foundation12 certs]# docker pull mycara.com/game2048

  删除原启动的仓库容器,做下面实验
  

  
三、私有仓库认证
  创建存放密码账号的文件
  [root@foundation12 docker]# mkdir auth       建立目录
[root@foundation12 docker]# ls
auth  certs
[root@foundation12 docker]# docker run \
> --entrypoint htpasswd \
> registry:2.3.1 -Bbn admin cara > auth/htpasswd

  [root@foundation12 docker]# cd auth/
[root@foundation12 auth]# ls
htpasswd
[root@foundation12 auth]# cat htpasswd
admin:$2y$05$LIb4zTANf0KCSPw0IrL2zOqO9zth5XpOYpdJRh/VTcILfX3hgU0P.


  重新启动容器
  [root@foundation12 opt]# docker run -d --restart=always --name registryauth -v /tmp/docker/certs:/certs -v /opt/registryauth:/var/lib/registry -v /tmp/docker/auth:/auth -e REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2.3.1
9b12ab89f5a4c0434bad1b09e7bbde24c7c6a3d02a94d928719e85ff41c15339


  现在客户端再pull、push就会提示报错,无法提交,需要登录私有仓库
  

  [root@foundation12 opt]# docker tag nginx mycara.com/nginx
[root@foundation12 opt]# docker login -u admin -p cara mycara.com        登录

  Login Succeeded
[root@foundation12 opt]# cd
[root@foundation12 ~]# cd .docker/
[root@foundation12 .docker]# ls
config.json
[root@foundation12 .docker]# cat config.json
{
    "auths": {
        "mycara.com": {
            "auth": "YWRtaW46Y2FyYQ=="
        }
    }
}

  
  
上传成功
  [root@foundation12 .docker]# docker push mycara.com/nginx      
The push refers to a repository [mycara.com/nginx]
5f70bf18a086: Pushed
3f3324023e75: Pushed
f0d7d68f89e5: Pushed
917c0fc99b35: Pushed
latest: digest: sha256:e59bbe13ca0c309644d9bca972c1b660c170fbdee7ff81eda9ff966b86f14e63 size: 1978
[root@foundation12 .docker]# cd /opt/registryauth/docker/registry/v2/repositories/
[root@foundation12 repositories]# ls
nginx

  

  
退出登录
  [root@foundation12 opt]# docker logout mycara.com   





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675263-1-1.html 上篇帖子: docker 之网络配置 下篇帖子: docker之GLASSFISH部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表