docker 仓库及镜像的上传下载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker 仓库及镜像的上传下载相关的知识,希望对你有一定的参考价值。

                                                                       Docker 仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

一、搭建私有仓库

下载registry镜像

docker pull registry

下载完之后通过该镜像启动一个容器

[[email protected] ~]# docker run -d -p 5000:5000 --name registry registry:2.3.1
技术分享图片

查看,端口已打开

技术分享图片

查看存在镜像

[[email protected] ~]# docker images
技术分享图片



使用 docker tag 将 game2048 这个镜像标记为 localhost:5000/game2048

格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]


[[email protected] ~]# docker tag game2048 localhost:5000/game2048    给已存在的镜像打上tag

技术分享图片

[[email protected] ~]# docker images

技术分享图片


使用 docker push 上传标记的镜像

[[email protected] ~]# docker push localhost:5000/game2048

技术分享图片


curl 查看仓库中的镜像

[[email protected] ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["game2048"]}

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


先删除已有镜像,再尝试从私有仓库中下载这个镜像

[[email protected] ~]# docker rmi localhost:5000/game2048


技术分享图片


拉取镜像

[[email protected] ~]# docker pull localhost:5000/game2048

技术分享图片

[[email protected] ~]# 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和端口

[[email protected] docker]# vim daemon.json

技术分享图片


重起服务 ,手动开启registry

技术分享图片

再次上传

[[email protected] docker]# docker push 192.168.122.1:5000/nginx
技术分享图片

关闭和删除

技术分享图片


二、生成自签名证书


在服务器主机上生成自签名证书,创建一个文件夹用于存放证书

[[email protected] docker]# pwd
/tmp/docker
[[email protected] docker]# mkdir certs
[[email protected] 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 []:[email protected]


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

技术分享图片


运行仓库镜像

[[email protected] 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


如下,容器启动,端口打开
技术分享图片


域名要有解析

[[email protected] docker]# vim /etc/hosts
技术分享图片

配置客户端

我做实验的是一台服务器,所以均在一台主机上进行配置的。

如果你的服务器作为Docker仓库使用,客户端在另一台主机上作为客户端来上传或拉取镜像,则如下操作本应在客户端执行;


创建目录

[[email protected] certs]# mkdir -p /etc/docker/certs.d/mycara.com/
[[email protected] certs]# cp domain.crt /etc/docker/certs.d/mycara.com/ 服务器端生成的的.crt复制到客户端服务器的/etc/docker/certs.d/mycara.com/  目录下

将打了tag的镜像上传

[[email protected] certs]# docker tag game2048 mycara.com/game2048
[[email protected] certs]# docker push mycara.com/game2048
技术分享图片

拉取镜像

[[email protected] certs]# docker pull mycara.com/game2048
技术分享图片


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

技术分享图片


三、私有仓库认证

创建存放密码账号的文件

[[email protected] docker]# mkdir auth       建立目录
[[email protected] docker]# ls
auth  certs
[[email protected] docker]# docker run
> --entrypoint htpasswd
> registry:2.3.1 -Bbn admin cara > auth/htpasswd

[[email protected] docker]# cd auth/
[[email protected] auth]# ls
htpasswd
[[email protected] auth]# cat htpasswd
admin:$2y$05$LIb4zTANf0KCSPw0IrL2zOqO9zth5XpOYpdJRh/VTcILfX3hgU0P.

重新启动容器


[[email protected] 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就会提示报错,无法提交,需要登录私有仓库

技术分享图片

[[email protected] opt]# docker tag nginx mycara.com/nginx
[[email protected] opt]# docker login -u admin -p cara mycara.com        登录

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



上传成功

[[email protected] .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
[[email protected] .docker]# cd /opt/registryauth/docker/registry/v2/repositories/
[[email protected] repositories]# ls
nginx



退出登录

[[email protected] opt]# docker logout mycara.com   
技术分享图片




以上是关于docker 仓库及镜像的上传下载的主要内容,如果未能解决你的问题,请参考以下文章

Docker教程-8-DockerHub仓库及私有仓库的使用

Docker images详细介绍及管理制作镜像

Docker中通过模板创建镜像,Docker容器仓库及数据管理

将本地docker镜像上传至阿里云镜像仓库

云计算:Docker安装及本地镜像仓库配置

Docker Registry部署镜像私有仓库及鉴权认证