在本文中,我们将为您详细介绍docker私有仓库搭建的相关知识,并且为您解答关于docker私有仓库搭建与使用实战的疑问,此外,我们还会提供一些关于4.Docker私有仓库搭建、CentOS7:Doc
在本文中,我们将为您详细介绍docker私有仓库搭建的相关知识,并且为您解答关于docker私有仓库搭建与使用实战的疑问,此外,我们还会提供一些关于4. Docker 私有仓库搭建、CentOS 7 : Docker私有仓库搭建和使用、CentOS 7 : Docker私有仓库搭建和使用 registry2.0、Centos 7 docker私有仓库的搭建的有用信息。
本文目录一览:- docker私有仓库搭建(docker私有仓库搭建与使用实战)
- 4. Docker 私有仓库搭建
- CentOS 7 : Docker私有仓库搭建和使用
- CentOS 7 : Docker私有仓库搭建和使用 registry2.0
- Centos 7 docker私有仓库的搭建
docker私有仓库搭建(docker私有仓库搭建与使用实战)
搭建环境
私有仓库机:192.168.100.21
生产环境:192.168.100.22
搭建私有仓库
在21机器上下载registry镜像
# docker pull registry
先启动容器(容器内/var/lib/registry是存放镜像的,所有挂载一个本地目录上去放在容器被删除,容器内具体位置自己查看)
# docker run -d -p 5000:5000 --name sonfer -v /tmp/registry:/var/lib/registry f32a97de94e1
在容器找镜像地址
# docker exec -it sonfer sh
/ # ls /tmp
/ #
/ # find / -name registry
/var/lib/registry
/var/lib/registry/docker/registry
/bin/registry
/etc/docker/registry
/ #
/ # exit
我们重新启动下 registry
# docker run -d -p 5000:5000 -v /tmp/registry:/var/lib/registry -v /data/config.yml:/etc/docker/registry/config.yml sonfer
// /data/config.yml 这个是什么呢?我们在下面删除仓库镜像介绍
// 这里需要说明一点,在启动仓库时,需在配置文件中的storage配置中增加delete=true配置项,允许删除镜像。默认的镜像是没有这个参数
可以看到我们启动了一个容器,地址为:192.168.100.21:5000
测试
接下来我们就要操作把一个本地镜像push到私有仓库中。首先在21机器下pull一个比较小的镜像来测试(此处使用的是nginx)。
docker pull nginx
修改镜像tag(这里我使用云服务器搭建,使用localhost比较快;其他在局域网中写IP比较明了)
# docker tag nginx:latest 192.168.100.21:5000/nginx:v1
上传到私有仓库
# docker push 192.168.100.21:5000/nginx:v1
可以看到 push 失败:
Error: Invalid registry endpoint https://192.168.0.153:5000/v1/: Get https://192.168.0.153:5000/v1/_ping: dial tcp 192.168.0.153:5000: connection refused. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 192.168.112.136:5000` to the daemon''s arguments. In the case of HTTPS, if you have access to the registry''s CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.0.153:5000/ca.crt
因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。修改docker启动配置文件:
vim /usr/lib/systemd/system/docker.service
找到 ExecStart
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.0.153:5000
红色字体是添加的
或者在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:
{ "insecure-registries":["192.168.1.100:5000"] }
{
"registry-mirrors": ["https://75ssp5b7.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.189:5000"]
}
重启docker
systemctl daemon-reload
systemctl restart docker
重启完之后我们再次运行推送命令,把本地镜像推送到私有服务器上。
# docker push 192.168.100.21:5000/nginx:v1
接下来我们从私有仓库中pull下来该镜像。
docker pull 192.168.100.21:5000/nginx:v1
查看镜像
# curl -XGET http://192.168.100.21:5000/v2/_catalog
{"repositories":["centos","mysql","nginx"]}
# curl -XGET http://192.168.100.21:5000/v2/image_name/tags/list
{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"image_name"}}]}
4. Docker 私有仓库搭建
环境:
有一个集群,里面有三台服务器
master: 192.168.1.106
nodes1: 192.168.1.104
nodes2: 192.168.1.105
操作系统: 使用的MacOS,windows同样有效
一. docker的Registry的安装和配置
选择将nodes1作为镜像仓库.
1. 在node节点上,获取并安装registry镜像
docker pull registry
2. 启动容器
docker run -p 5000:5000 -v /home/registry_images:/var/lib/registry -d --restart=always registry
这里将registry挂载到了本地home目录,避免docker重启后,镜像丢失
二. registry的使用
1. 修改master机器上的registry容器为所在的宿主机
/etc/docker/daemon.json
{ "insecure-registries":["192.168.1.104:5000"],//修改为registry所在容器的宿主机 "registry-mirrors": ["https://w52p8twk.mirror.aliyuncs.com"] }
"insecure-registries": 含义是,192.168.1.104不是一个安全的http请求,但请信任这个仓库地址.
我的registry在node节点上,node的ip是192.168.1.104
2. 重启docker
systemctl daemon-reload systemctl restart docker
3. 下载一个Nginx并上传到Registry仓库
领取Nginx镜像 docker pull Nginx 改名 docker tag Nginx 192.168.1.104:5000/Nginx:test
尝试把 192.168.1.104:5000/Nginx:test上传到我们的Registry仓库
docker push 192.168.1.104:5000/Nginx:test
可以成功push,说明我们的仓库是创建成功了.
4. 下面在其他master和node上做同样的操作. 修改/etc/docker/daemon.json文件
{ "insecure-registries":["192.168.1.104:5000"],"registry-mirrors": ["https://w52p8twk.mirror.aliyuncs.com"] }
重启docker
systemctl daemon-reload
systemctl restart docker
遇到的问题:
所有设置都没问题,但是上传就是失败
查询日志
cd /var/log tail -200f messages
错误信息如下:
Attempting next endpoint for push after error: Get https://192.168.198.142:5000/v2/: http: server gave HTTP response to HTTPS client"
出现这个问题有两种情况
1. 没有配置"insecure-registries":["192.168.1.104:5000"], 可以确定我是配置了的,上面有具体方法
2. 没有关闭防火墙
setenforce 0 关闭防火墙
查询防火墙
getenforce
5. 查询上传到仓库的镜像
有两个方法
方法一: 去镜像仓库地址查询:
cd /home/registry_images
详细目录如下:
cd /home/registry_images/docker/registry/v2/repositories
这个目录是我设置的镜像仓库在本地的挂载目录.
方法二: 通过接口查询
curl -XGET http:192.168.1.104:5000/v2/_catalog
{"repositories":["Nginx"]}
6. 查询仓库的tag标签
curl -XGET http:192.168.1.104:5000/v2/Nginx/tags/list
{"errors":[{"code":"NAME_UNKNowN","message":"repositoryname not kNown toregistry","detail":{"name":"image_name"}}]}
curl -XGET http:192.168.1.104:5000/v2/Nginx/tags/list
{"name":"Nginx","tags":["latest"]}
CentOS 7 : Docker私有仓库搭建和使用
系统环境: CentOS 7.2
192.168.0.179:docker仓库
192.168.0.60:客户端
安装并启动docker
yum -y install docker
systemctl start docker systemctl enable docker
搭建私有仓库
179上下载registry镜像
docker pull registry
防火墙添加运行5000端口
iptables -I INPUT 1 -p tcp --dport 5000 -j ACCEPT
下载完之后我们通过该镜像启动一个容器
docker run -d -p 5000:5000 --privileged=true -v /opt/registry:/tmp/registry registry
参数说明:
-v /opt/registry:/tmp/registry :默认情况下,会将仓库存放于容器内的/tmp/registry目录下,指定本地目录挂载到容器
–privileged=true :CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)错误
客户端上传镜像
修改/etc/sysconfig/docker(Ubuntu下配置文件地址为:/etc/init/docker.conf),增加启动选项(已有参数的在后面追加),之后重启docker,不添加报错,https证书问题。
OPTIONS='--insecure-registry 192.168.0.179:5000' #CentOS 7系统 other_args='--insecure-registry 192.168.0.179:5000' #CentOS 6系统
因为Docker从1.3.X之后,与docker registry交互默认使用的是https,而此处搭建的私有仓库只提供http服务
在docker公共仓库下载一个镜像
docker pull docker.io/centos
来修改一下该镜像的tag
docker tag centos 192.168.0.179:5000/centos
把打了tag的镜像上传到私有仓库
docker push 192.168.0.179:5000/centos
客户端添加私有仓库地址
# 添加这一行 ADD_REGISTRY='--add-registry 192.168.0.179:5000'
加上后,search镜像,私有仓库和docker hub上都会显示;
不加搜索私有仓库,需要命令中指定私有仓库ip
使用仓库中的镜像
查询私有仓库中的所有镜像,使用docker search命令:
curl -u myuser https://registry_ip:5000/v1/search curl registry_ip:5000/v1/search
docker search registry_ip:5000/ #centos 7 docker search registry_ip:5000/library #centos 6
查询仓库中指定账户下的镜像,则使用如下命令:
docker search registry_ip:5000/account/
转载请务必保留此出处:http://blog.csdn.net/fgf00/article/details/52040492
转自如上链接。
CentOS 7 : Docker私有仓库搭建和使用 registry2.0
http://www.cnblogs.com/xcloudbiz/articles/5526262.html
系统环境: CentOS 7.2
192.168.0.179:docker仓库
192.168.0.60:客户端
安装并启动docker
1、yum -y install docker
2、systemctl start docker 3、systemctl enable docker
搭建私有仓库
192.168.0.179服务端 上下载registry镜像
1、docker pull registry
- 防火墙添加运行5000端口
1、iptables -I INPUT 1 -p tcp --dport 5000 -j ACCEPT
下载完之后我们通过该镜像启动一个容器
1、docker run -d -p 5000:5000 --privileged=true -v /opt/registry:/tmp/registry-dev registry
- 参数说明:
-v /opt/registry:/tmp/registry :默认情况下,会将仓库存放于容器内的/tmp/registry目录下,指定本地目录挂载到容器
–privileged=true :CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)错误
Registry的存放目录在Docker Hub上显示的是/tmp/registry-dev,但是映射之后发现并没有存放在该目录,查看源码发现,镜像信息存放在/var/lib/registry目录下,因此这里修改为将/opt/registry目录映射到/var/lib/registry。
192.168.0.60客户端上传镜像
修改/etc/sysconfig/docker(Ubuntu下配置文件地址为:/etc/init/docker.conf),增加启动选项(已有参数的在后面追加),之后重启docker,不添加报错,https证书问题。
1、OPTIONS='--insecure-registry 192.168.0.179:5000' #CentOS 7系统 2、other_args='--insecure-registry 192.168.0.179:5000' #CentOS 6系统
- 因为Docker从1.3.X之后,与docker registry交互默认使用的是https,而此处搭建的私有仓库只提供http服务
在docker公共仓库下载一个镜像1、docker pull docker.io/centos
- 来修改一下该镜像的tag
1、docker tag centos 192.168.0.179:5000/centos
- 把打了tag的镜像上传到私有仓库
1、docker push 192.168.0.179:5000/centos
- 1
客户端添加私有仓库地址
1、# 添加这一行 2、ADD_REGISTRY='--add-registry 192.168.0.179:5000'
加上后,search镜像,私有仓库和docker hub上都会显示;
不加搜索私有仓库,需要命令中指定私有仓库ip使用仓库中的镜像
查询私有仓库中的所有镜像,使用docker search命令:
1、curl -u myuser https://registry_ip:5000/v1/search 2、curl registry_ip:5000/v1/search
1、docker search registry_ip:5000/ #centos 7 2、docker search registry_ip:5000/library #centos 6
- 查询仓库中指定账户下的镜像,则使用如下命令:
1、docker search registry_ip:5000/account/
转载请务必保留此出处:http://blog.csdn.net/fgf00/article/details/52040492
https://tonybai.com/2016/02/26/deploy-a-private-docker-registry/
部署私有Docker Registry
安装部署一个私有的Docker Registry是引入、学习和使用Docker这门技术的必经之路之一。尤其是当Docker被所在组织接受,更多人、项目和产品开始接触和使用Docker时,存储和分发自制的Docker image便成了刚需。Docker Registry一如既往的继承了“Docker坑多”的特点,为此这里将自己搭建”各类”Registry过程中执行的步骤、遇到的问题记录下来,为己备忘,为他参考。
Docker在2015年推出了distribution项目,即Docker Registry 2。相比于old registry,Registry 2使用Go实现,在安全性、性能方面均有大幅改进。Registry设计了全新的Rest API,并且在image存储格式等方面不再兼容于old Registry。去年8月份,docker官方hub使用Registriy 2.1替代了原先的old Registry。如果你要与Registry2交互,你的Docker版本至少要是Docker 1.6。
Docker的开发者也一直在致力于改善Registry安装和使用的体验,通过提供官方Registry Image以及Docker Compose工具等来简化Registry的配置。不过在本文中,我们只是利用Docker以及Registry的官方Image来部署Registry,这样更便于全面了解Registry的部署配置细节。
Registry2在镜像存储方面不仅支持本地盘,还支持诸多主流第三方存储方案。通过分布式存储系统你还可以实现一个分布式Docker Registry服务。这里仅以本地盘以及single node registry2为例。
一、环境
这里还是复用以往文章中的Docker环境:
Docker Registry Server: 10.10.105.71 Ubuntu 14.04 3.16.0-57-generic;docker 1.9.1 其他两个工作Server: 10.10.105.72 Ubuntu 14.04 3.19.0-25-generic; docker 1.9.1 10.10.126.101 Ubuntu 12.04 3.16.7-013607-generic; docker 1.9.1
本次Registry使用当前最新stable版本:Registry 2.3.0。由于镜像采用本地磁盘存储,root分区较小,需要映射使用其他volume。
二、初次搭建
本以为Docker Registry的搭建是何其简单的,甚至简单到通过一行命令就可以完成的。比如我们在Registry Server上执行:
在~/dockerregistry下,执行: $sudo docker run -d -p 5000:5000 -v `pwd`/data:/tmp/registry-dev --restart=always --name registry registry:2 Unable to find image 'registry:2' locally 2: Pulling from library/registry f32095d4ba8a: Pull complete 9b607719a62a: Pull complete 973de4038269: Pull complete 2867140211c1: Pull complete 8da16446f5ca: Pull complete fd8c38b8b68d: Pull complete 136640b01f02: Pull complete e039ba1c0008: Pull complete c457c689c328: Pull complete Digest: sha256:339d702cf9a4b0aa665269cc36255ee7ce424412d56bee9ad8a247afe8c49ef1 Status: Downloaded newer image for registry:2 e9088ef901cb00546c59f89defa4625230f4b36b0a44b3713f38ab3d2a5a2b44 $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry 2 c457c689c328 9 days ago 165.7 MB $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e9088ef901cb registry:2 "/bin/registry /etc/d" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp registry
Registry container已经跑起来了,其启动日志可以通过:docker logs registry查看。
我们在71本地给busyBox:latest打一个tag,并尝试将新tag下的image push到Registry中去:
$ docker tag busyBox:latest 10.10.105.71:5000/tonybai/busyBox:latest $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry 2 c457c689c328 9 days ago 165.7 MB busyBox latest 65e4158d9625 9 days ago 1.114 MB 10.10.105.71:5000/tonybai/busyBox latest 65e4158d9625 9 days ago 1.114 MB ... ...
push到Registry中:
$ docker push 10.10.105.71:5000/tonybai/busyBox The push refers to a repository [10.10.105.71:5000/tonybai/busyBox] (len: 1) unable to ping registry endpoint https://10.10.105.71:5000/v0/ v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: Tunnel or SSL Forbidden v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: Tunnel or SSL Forbidden
出错了!简单分析了一下,可能是71上docker daemon配置中加了http代理的缘故,导致无法ping通registry endpoint。于是在/etc/default/docker中注释掉export http_proxy=”xxx”的设置,并重启docker daemon。
再次尝试push:
$ docker push 10.10.105.71:5000/tonybai/busyBox The push refers to a repository [10.10.105.71:5000/tonybai/busyBox] (len: 1) unable to ping registry endpoint https://10.10.105.71:5000/v0/ v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527 v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527
虽然还是失败,但错误信息已有所不同了。这次看来连接是可以建立的,但client端通过https访问server端,似乎想tls通信,但这一过程并未完成。
在其他机器上尝试push image到registry也遇到了同样的错误输出,如下:
10.10.105.72: $ docker push 10.10.105.71:5000/tonybai/ubuntu The push refers to a repository [10.10.105.71:5000/tonybai/ubuntu] (len: 1) unable to ping registry endpoint https://10.10.105.71:5000/v0/ v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527 v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527
从错误信息来看,client与Registry交互,默认将采用https访问,但我们在install Registry时并未配置指定任何tls相关的key和crt文件,https访问定然失败。要想弄清这个问题,只能查看Registry Manual。
三、Insecure Registry
Registry的文档还是相对详尽的。在文档中,我们找到了Insecure Registry,即接收plain http访问的Registry的配置和使用方法,虽然这不是官方推荐的。
实际上对于我们内部网络而言,Insecure Registry基本能满足需求,部署过程也避免了secure registry的那些繁琐步骤,比如制作和部署证书等。
为了搭建一个Insecure Registry,我们需要先清理一下上面已经启动的Registry容器。
$ docker stop registry registry $ docker rm registry registry
修改Registry server上的Docker daemon的配置,为DOCKER_OPTS增加–insecure-registry:
DOCKER_OPTS="--insecure-registry 10.10.105.71:5000 ....
重启Docker Daemon,启动Registry容器:
$ sudo service docker restart docker stop/waiting docker start/running,process 6712 $ sudo docker run -d -p 5000:5000 -v `pwd`/data:/tmp/registry-dev --restart=always --name registry registry:2 5966e92fce9c34705050e19368d19574e021a272ede1575385ef35ecf5cea019
尝试再次Push image:
$ docker push 10.10.105.71:5000/tonybai/busyBox The push refers to a repository [10.10.105.71:5000/tonybai/busyBox] (len: 1) 65e4158d9625: Pushed 5506dda26018: Pushed latest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739
这回push ok!
我们将本地的tag做untag处理,再从Registry pull相关image:
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry 2 c457c689c328 9 days ago 165.7 MB 10.10.105.71:5000/tonybai/busyBox latest 65e4158d9625 9 days ago 1.114 MB busyBox latest 65e4158d9625 9 days ago 1.114 MB ubuntu 14.04 6cc0fc2a5ee3 5 weeks ago 187.9 MB $ docker rmi 10.10.105.71:5000/tonybai/busyBox Untagged: 10.10.105.71:5000/tonybai/busyBox:latest $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry 2 c457c689c328 9 days ago 165.7 MB busyBox latest 65e4158d9625 9 days ago 1.114 MB ubuntu 14.04 6cc0fc2a5ee3 5 weeks ago 187.9 MB $ docker pull 10.10.105.71:5000/tonybai/busyBox Using default tag: latest latest: Pulling from tonybai/busyBox Digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 Status: Downloaded newer image for 10.10.105.71:5000/tonybai/busyBox:latest $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry 2 c457c689c328 9 days ago 165.7 MB 10.10.105.71:5000/tonybai/busyBox latest 65e4158d9625 9 days ago 1.114 MB busyBox latest 65e4158d9625 9 days ago 1.114 MB ubuntu 14.04 6cc0fc2a5ee3 5 weeks ago 187.9 MB
可以看到:Pull过程也很顺利。
在Private Registry2中查看或检索Repository或images,将不能用docker search:
$ docker search 10.10.105.71:5000/tonybai/busyBox/ Error response from daemon: Unexpected status code 404
但通过v2版本的API,我们可以实现相同目的:
$curl http://10.10.105.71:5000/v2/_catalog {"repositories":["tonybai/busyBox"]} $ curl http://10.10.105.71:5000/v2/tonybai/busyBox/tags/list {"name":"tonybai/busyBox","tags":["latest"]}
在其他主机上,我们尝试pull busyBox:
10.10.105.72: $docker pull 10.10.105.71:5000/tonybai/busyBox Using default tag: latest Error response from daemon: unable to ping registry endpoint https://10.10.105.71:5000/v0/ v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527 v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527
我们发现依旧不能pull和push!在Registry手册中讲到,如果采用insecure registry的模式,那么所有与Registry交互的主机上的Docker Daemon都要配置:–insecure-registry选项。
我们按照上面的配置方法,修改105.72上的/etc/default/docker,重启Docker daemon,再执行pull/push就会得到正确的结果:
$ sudo vi /etc/default/docker $ sudo service docker restart docker stop/waiting docker start/running,process 10614 $ docker pull 10.10.105.71:5000/tonybai/busyBox Using default tag: latest latest: Pulling from tonybai/busyBox 5506dda26018: Pull complete 65e4158d9625: Pull complete Digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 Status: Downloaded newer image for 10.10.105.71:5000/tonybai/busyBox:latest $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.04 36248ae4a9ac 8 days ago 187.9 MB 10.10.105.71:5000/tonybai/ubuntu 14.04 36248ae4a9ac 8 days ago 187.9 MB 10.10.105.71:5000/tonybai/busyBox latest 65e4158d9625 9 days ago 1.114 MB $ docker push 10.10.105.71:5000/tonybai/ubuntu The push refers to a repository [10.10.105.71:5000/tonybai/ubuntu] (len: 1) 36248ae4a9ac: Pushed 8ea5373bf5a6: Pushed 2e0188208e83: Pushed e3c70beaa378: Pushed 14.04: digest: sha256:72e56686cb9fb38438f0fd68fecf02ef592ce2ef7069bbf97802d959d568c5cc size: 6781
四、Secure Registry
Docker官方是推荐你采用Secure Registry的工作模式的,即transport采用tls。这样我们就需要为Registry配置tls所需的key和crt文件了。
我们首先清理一下环境,将上面的Insecure Registry停掉并rm掉;将各台主机上Docker Daemon的DOCKER_OPTS配置中的–insecure-registry去掉,并重启Docker Daemon。
如果你拥有一个域名,域名下主机提供Registry服务,并且你拥有某知名CA签署的证书文件,那么你可以建立起一个Secure Registry。不过我这里没有现成的证书,只能使用自签署的证书。严格来讲,使用自签署的证书在Docker官方眼中依旧属于Insecure,不过这里只是借助自签署的证书来说明一下Secure Registry的部署步骤罢了。
1、制作自签署证书
如果你有知名CA签署的证书,那么这步可直接忽略。
$ openssl req -newkey rsa:2048 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt Generating a 2048 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) [AU]:CN State or Province Name (full name) [Some-State]:Liaoning Locality Name (eg,city) []:shenyang Organization Name (eg,company) [Internet Widgits Pty Ltd]:foo Organizational Unit Name (eg,section) []:bar Common Name (e.g. server FQDN or YOUR name) []:mydockerhub.com Email Address []:bigwhite.cn@gmail.com
2、启动Secure Registry
启动带证书的Registry:
$ docker run -d -p 5000:5000 --restart=always --name registry -v /root/openssl/data:/tmp/registry-dev -v /root/openssl/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key docker.io/registry:2.0 35e8ce77dd455f2bd50854e4581cd52be8a137f4aaea717239b6d676c5ea5777
由于证书的CN是mydockerhub.com,我们需要修改一下/etc/hosts文件:
10.10.105.71 mydockerhub.com
重新为busyBox制作一个tag:
$docker tag busyBox:latest mydockerhub.com:5000/tonybai/busyBox:latest
Push到Registry:
$ docker push mydockerhub.com:5000/tonybai/busyBox The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1) unable to ping registry endpoint https://mydockerhub.com:5000/v0/ v2 ping attempt Failed with error: Get https://mydockerhub.com:5000/v2/: x509: certificate signed by unkNown authority v1 ping attempt Failed with error: Get https://mydockerhub.com:5000/v1/_ping: x509: certificate signed by unkNown authority
push失败了!从错误日志来看,docker client认为server传输过来的证书的签署方是一个unkNown authority(未知的CA),因此验证失败。我们需要让docker client安装我们的CA证书:
$ sudo mkdir -p /etc/docker/certs.d/mydockerhub.com:5000 $ sudo cp certs/domain.crt /etc/docker/certs.d/mydockerhub.com:5000/ca.crt $ sudo service docker restart //安装证书后,重启Docker Daemon
再执行Push,我们看到了成功的输出日志。由于data目录下之前已经被push了tonybai/busyBox repository,因此提示“已存在”:
$docker push mydockerhub.com:5000/tonybai/busyBox The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1) 65e4158d9625: Image already exists 5506dda26018: Image already exists latest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739需要用域名,直接用IP地址会报错:
如果要想支持IP方式
如果Docker registry要想支持https,需要生成证书。这里我们采用openssl生成证书,一般情况下,证书只支持域名访问,要使其支持IP地址访问,需要修改配置文件openssl.cnf。
修改openssl.cnf,支持IP地址方式,HTTPS访问
在Redhat7或者Centos系统中,文件所在位置是/etc/pki/tls/openssl.cnf。在其中的[ v3_ca]部分,添加subjectAltName选项:
[ v3_ca ]
subjectAltName= IP:129.144.150.111
用openssl生成自签名的证书:
我们直接在root用户下操作,创建一个目录: /root/certs
然后执行:
openssl req -newkey rsa:2048 -nodes -sha256-keyout /root/certs/domain.key -x509 -days 365 -out /root/certs/domain.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg,city) [Default City]:bj
Organization Name (eg,company) [DefaultCompany Ltd]:mycom
Organizational Unit Name (eg,section)[]:it
Common Name (eg,your name or your server'shostname) []:129.144.150.111
Email Address []:xcjing@yeah.Net
执行成功后会生成:domain.key 和domain.crt 两个文件
3、外部访问Registry
我们换其他机器试试访问这个secure registry。根据之前的要求,我们照猫画虎的修改一下hosts文件,安装ca.cert,去除–insecure-registry选项,并重启Docker daemon。之后尝试从registry pull image:
$ docker pull mydockerhub.com:5000/tonybai/busyBox Using default tag: latest latest: Pulling from tonybai/busyBox Digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 Status: Downloaded newer image for mydockerhub.com:5000/tonybai/busyBox:latest $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 10.10.105.71:5000/tonybai/ubuntu 14.04 36248ae4a9ac 9 days ago 187.9 MB ubuntu 14.04 36248ae4a9ac 9 days ago 187.9 MB 10.10.105.71:5000/tonybai/busyBox latest 65e4158d9625 9 days ago 1.114 MB mydockerhub.com:5000/tonybai/busyBox latest 65e4158d9625 9 days ago 1.114 MB
这样来看,如果使用自签署的证书,那么所有要与Registry交互的Docker主机都需要安装mydockerhub.com的ca.crt(domain.crt)。但如果你使用知名CA,这一步也就可以忽略。
五、Registry的鉴权管理
Registry提供了一种基础的鉴权方式。我们通过下面步骤即可为Registry加上基础鉴权:
在Register server上,为Registry增加foo用户,密码foo123:(之前需要停掉已有的Registry,并删除之)
//生成鉴权密码文件 $ mkdir auth $ docker run --entrypoint htpasswd registry:2 -Bbn foo foo123 > auth/htpasswd $ ls auth htpasswd //启动带鉴权功能的Registry: $ docker run -d -p 5000:5000 --restart=always --name registry \ -v `pwd`/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v `pwd`/data:/var/lib/registry \ -v `pwd`/certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ registry:2 199ad0b3591fb9613b21b1c96f017267f3c39661a7025d30df636c6805e7ab50
在105.72上,我们尝试push image到Registry:
$ docker push mydockerhub.com:5000/tonybai/busyBox The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1) 65e4158d9625: Image push Failed Head https://mydockerhub.com:5000/v2/tonybai/busyBox/blobs/sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4: no basic auth credentials
错误信息提示:鉴权失败。
在72上执行docker login:
$docker login mydockerhub.com:5000 Username: foo Password: Email: bigwhite.cn@gmail.com WARNING: login credentials saved in /home/baiming/.docker/config.json Login Succeeded
login成功后,再行Push:
$ docker push mydockerhub.com:5000/tonybai/busyBox The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1) 65e4158d9625: Image already exists 5506dda26018: Image already exists latest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739
Push ok!
六、Registry中images的管理
前面提到过,通过V2版Rest API可以查询Repository和images:
$ curl --cacert domain.crt --basic --user foo:foo123 https://mydockerhub.com:5000/v2/_catalog {"repositories":["tonybai/busyBox","tonybai/ubuntu"]}
但如果要删除Registry中的Repository或某个tag的Image,目前v2还不支持,原因见Registry的roadmap中的说明。
不过如果你的Registry的存储引擎使用的是本地盘,倒是有一些第三方脚本可供使用,比如:delete-docker-registry-image。
七、小结
Registry2发布不到1年,目前还有许多问题待解决,就比如delete image的问题,相信在2.4以及后续版本这些问题会被逐个解决掉或能找到一个相对理想的方案。
© 2016,bigwhite. 版权所有.
Related posts:
- Go和HTTPS
- 搭建自己的ngrok服务
- docker容器内服务程序的优雅退出
- WordPress迁移到Docker容器
- 理解Docker跨多主机容器网络
- 因为Docker从1.3.X之后,与docker registry交互默认使用的是https,而此处搭建的私有仓库只提供http服务
Centos 7 docker私有仓库的搭建
Centos 7 docker registry的搭建
系统配置: 内核 ,
运行 docker registry
执行下列命令:
docker run / -d / --name private_registry --restart=always / -e SETTINGS_FLAVOUR=dev / -e STORAGE_PATH=/registry-storage / -v /data/docker/private-registry/storage:/registry-storage / -u root / -p 5000:5000 / registry:2如果本地已有registry镜像,它会直接运行,否则它会到docker hub共有仓库下载之后再运行, 该命令将之后私有仓库的镜像存放到本地。
之后执行:
docker tag docker.io/docker:1.8 192.168.100.9:5000/docker:1.8 docker push 192.168.100.9:5000/docker:1.8这时会报很多错误:
FATA[0000] Error response from daemon: v1 ping attempt Failed with error: Get https://192.168.100.9:5000/v1/_ping: tls: oversized record received with length 20527/. If this private registry supports only HTTP or HTTPS with an unkNown CA certificate,please add `--insecure-registry 192.168.100.9:5000` to the daemon's arguments. In the case of HTTPS,if you have access to the registry's CA certificate,no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.100.9:5000/ca.crt最简单的解决方法是修改 文件添加,的配置文件在 在该文件里添加 ,添加过之后重启,重新运行 即可生效。这样做的缺点是你的私有仓库不安全,其次,其他要下载或者上传镜像的机器都要修改相应的配置文件。
安全的做法是去认证机构购买签名证书,在此我们使用自认证的方式。
自签名认证
首先执行:
# mkdir -p certs && openssl req / -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key / -x509 -days 365 -out certs/domain.crt Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:Beijing Locality Name (eg,city) []:Beijing Organization Name (eg,company) [Internet Widgits Pty Ltd]:SERCXTYF Organizational Unit Name (eg,section) []:IT Common Name (e.g. server FQDN or YOUR name) []:192.168.100.9:5000 Email Address []:xxx.yyy@ymail.com生成认证证书和密钥。接下来将刚生成的 复制到 ,之后重启 并运行:
docker run / -d / --name private_registry --restart=always / -e SETTINGS_FLAVOUR=dev / -e STORAGE_PATH=/registry-storage / -v /data/docker/private-registry/storage:/registry-storage / -u root / -p 5000:5000 / -v /root/certs:/certs / -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt / -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key / registry:2这样之后应该可以成功了吧,于是执行:
# docker push 192.168.100.9:5000/docker:1.8结果它还是报错了:
The push refers to a repository 192.168.100.9:5000/docker:1.8 unable to ping registry endpoint https://192.168.100.9:5000/v0/ v2 ping attempt Failed with error: Get https://192.168.100.9:5000/v2/: x509: cannot validate certificate for 192.168.100.9 because it doesn't contain any IP SANs v1 ping attempt Failed with error: Get https://192.168.100.9:5000/v1/_ping: x509: cannot validate certificate for 192.168.100.9 because it doesn't contain any IP SANs解决方法:修改 配置,在该文件中找到 ,在它下面添加如下内容:
[ v3_ca ] # Extensions for a typical CA subjectAltName = IP:123.56.157.144之后再次重启docker,并重新 ,启动成功之后,执行:
# docker push 192.168.100.9:5000/docker:1.8 The push refers to a repository [192.168.100.9:5000/docker] (len: 1) 793ab2f3d322: Pushed e1232be51d09: Pushed 71ef33d4e0e5: Pushed e9d235d200dc: Pushed 3fb9a265fbfc: Pushed 9f50b4b1f00b: Pushed 413668359dd0: Pushed da0daae25b21: Pushed f4fddc471ec2: Pushed 1.8: digest: sha256:28a02a8a50b750a300904b53e802bdf76516d591b2d233ae21cf771b8c776d44 size: 17621至此,上传终于成功。换台机器下载刚上传的镜像:
# docker pull 192.168.100.9:5000/docker:1.8 Trying to pull repository 192.168.100.9:5000/docker ... Failed unable to ping registry endpoint https://192.168.100.9:5000/v0/ v2 ping attempt Failed with error: Get https://192.168.100.9:5000/v2/: x509: certificate signed by unkNown authority v1 ping attempt Failed with error: Get https://192.168.100.9:5000/v1/_ping: x509: certificate signed by unkNown authority仔细分析错误信息,发现是没有证书,将在 上生成的证书拷贝到相应的目录下 ,拷贝之后重启 ,再次执行:
# docker pull 192.168.100.9:5000/docker:1.8 1.8: Pulling from docker 9d58b928bc15: Pull complete dbe7e8a7807c: Pull complete ce14982b73d4: Pull complete b9f70905d763: Pull complete b9c93a2fb3cf: Pull complete 1321a4d5d3ea: Pull complete 5941048a7e27: Pull complete f57edf7c2e71: Pull complete 5de2ade00f1b: Pull complete Digest: sha256:28a02a8a50b750a300904b53e802bdf76516d591b2d233ae21cf771b8c776d44 Status: Downloaded newer image for 192.168.100.9:5000/docker:1.8至此, 私有仓库安装成功。如果要部署到生产环境还需要进一步的配置,具体可以参考 Registry Configuration Reference。
查看原文:http://www.zoues.com/2016/10/25/centos-7-docker%e7%a7%81%e6%9c%89%e4%bb%93%e5%ba%93%e7%9a%84%e6%90%ad%e5%bb%ba/Centos 73.10.0-229.20.1.el7.x86_64Docker version 1.8.2-v /data/docker/private-registry/storage:/registry-storage/etc/sysconfig/dockerINSECURE_REGISTRY='--insecure-registry 192.168.100.9:5000'Ubuntu 14.04/etc/default/dockerDOCKER_OPTS="--insecure-registry 192.168.100.9:5000"dockerdocker registrycerts/domain.crt/etc/docker/certs.d/192.168.100.9:5000/ca.crtdocker/etc/pki/tls/openssl.cnf[ v3_ca ]run registry192.168.100.9/etc/docker/certs.d/192.168.100.9:5000/ca.crtdockerdocker registry
我们今天的关于docker私有仓库搭建和docker私有仓库搭建与使用实战的分享就到这里,谢谢您的阅读,如果想了解更多关于4. Docker 私有仓库搭建、CentOS 7 : Docker私有仓库搭建和使用、CentOS 7 : Docker私有仓库搭建和使用 registry2.0、Centos 7 docker私有仓库的搭建的相关信息,可以在本站进行搜索。
本文标签: