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
原文地址:http://blog.51cto.com/13362895/2130744