搭建docker registry 镜像私服
Posted 质量管理的那些年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建docker registry 镜像私服相关的知识,希望对你有一定的参考价值。
需求分析
仓库是集中存放镜像的地方,分为私有仓库和共有仓库。在公司内部使用,会积累大量的自定义镜像文件,尤其是当Docker被所在组织接受,更多人、项目和产品开始接触和使用Docker时,存储和分发自制的Docker image便成了刚需,考虑到私密和传输的效率,通过公有仓库进行管理并不方便,所以需要搭建镜像私服。
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。
Registry2在镜像存储方面不仅支持本地盘,还支持诸多主流第三方存储方案。通过分布式存储系统你还可以实现一个分布式Docker Registry服务。这里仅以本地盘以及single node registry2为例。
环境准备
Docker Registry :2.6.2
Centos :7.2
Docker :1.13.1
内部私服环境最低要求
网络:可外网访问
磁盘:>100G
内存:2G+
CPU:1GHZ+
安装 Docker Registry
基于容器安装运行
基于容器的运行方式十分简单,只需要一条命令
docker run -d -p 5000:5000 \
--restart=always \
--name docker_registry \
-v /srv/data/registry/registry-conf/config.yml:/etc/docker/registry/config.yml \
-v /srv/data/registry/registry-data:/var/lib/registry \
docker.io/registry:2.6.2
启动后比较关键的参数是指定配置文件和仓库存储路径。
Registry默认配置文件
/etc/docker/registry/config.yml,可通过-v,指定使用本地主机上的配置文件
Registry默认存储位置
/var/lib/registry,可通过-v,映射到本地路径
本地安装运行
待补充
配置TLS证书
私有仓库的查询,上传与下载
镜像上传本地私服
docker tag docker.io/hello-world:latest 192.168.1.188:5000/yatho/hello-world:latest
docker push 192.168.1.188:5000/yatho/hello-world
从本地私服下载镜像
docker pull 192.168.1.188:5000/yatho/hello-world
docker tag 192.168.1.188:5000/yatho/hello-world hello-world
通过v2版本的API,搜索本地私服镜像
curl http://192.168.1.188:5000/v2/_catalog
curl http://10.10.105.71:5000/v2/yatho/hello-world/tags/list
私有仓库要启用TLS认证,否则会报错。
client与Registry交互,默认将采用https访问
你可可以添加以下参数来避免这个问题
修改Docker配置文件 vim /etc/default/docker
增加以下一行
DOCKER_OPTS=”$DOCKER_OPTS —insecure-registry=104.131.173.242:5000”
重启Docker
修改:/lib/systemd/system/docker.service ,在里面增加:EnvironmentFile=-/etc/default/docker
然后,修改: ExecStart=/usr/bin/docker -d -H fd:// ,改成: ExecStart=/usr/bin/docker -d -H fd:// $DOCKER_OPTS
重启Docker
Docker_OPTS=”—insecure-registry 192.168.1.188:5000”
方法一:
方法二:
注意:如果采用insecure registry的模式,那么所有与Registry交互的主机上的Docker Daemon都要配置:–insecure-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的部署步骤罢了。
使用openssl工具可以很容易地生成私人证书文件:
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/yatho.key -x509 -days 365 -out certs/yatho.crt
Generating a 2048 bit RSA private key
..............+++
............................................+++
writing new private key to 'certs/myrepo.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]:guangzhou
Locality Name (eg, city) []:shenzhen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:foo
Organizational Unit Name (eg, section) []:bar
Common Name (e.g. server FQDN or YOUR name) []:yatho.com
Email Address []:yat_ho@163.com
生成文件
/etc/docker/certs.d/yatho.com:5000/ca.crt
秘钥文件:yatho.key
证书文件:yatho.crt
证书文件需要发送给用户,并且配置到用户Docker Host上,注意路径需要跟域名一致,例如:
从代理商申请证书
如果 Registry 服务需要公开,需要申请大家都认可的证书。
知名的代理商包括SSLs.com、GoDaddy.com等
启用证书
拥有秘钥文件和证书文件后,可以配置Registry启用证书支持,主要通过过REGISTRY_HTTP_TLS_CERTIFICATE和REGISTRY_HTTP_TLS_KEY参数来设置.
docker run -d -p 5000:5000 \
--restart=always \
--name docker_registry \
-v /srv/data/registry/registry-conf/config.yml:/etc/docker/registry/ \config.yml \
-v /srv/data/registry/registry-data:/var/lib/registry \
-v /srv/data/registry/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/yatho.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/yatho.key \
docker.io/registry:2.6.2
注意:
由于证书的CN是yatho.com,我们需要修改一下/etc/hosts文件: **
192.168.1.188 yatho.com
需要让docker client安装我们的CA证书:
sudo mkdir -p /etc/docker/certs.d/yatho.com:5000
sudo cp certs/yatho.crt /etc/docker/certs.d/yatho.com:5000/ca.crt
sudo service docker restart //安装证书后,重启Docker Daemon
Registry 鉴权管理(访问权限)
在实际使用中,对私有仓库还需要进行访问控制提供认证和用户管理。
Registry 基础鉴权
Registry提供了一种基础的鉴权方式。我们通过下面步骤即可为Registry加上基础鉴权:
在Register server上,为Registry增加foo用户,密码foo123:(之前需要停掉已有的Registry,并删除之)
//生成鉴权密码文件
$ mkdir auth
$ docker run --entrypoint htpasswd docker.io/registry:2.6.2 -Bbn thinkive thinkive_docker > auth/htpasswd
$ ls auth
htpasswd
//查看htpasswd
cat htpasswd
thinkive:$2y$05$hkx8pEDDWm1ak.wLuEuCi.dYK93ri65UhiTzR2M8YbkURgZIYVhWS
//启动带鉴权功能的Registry:
docker run -d -p 5000:5000 \
--restart=always \
--name docker_registry \
-v /srv/data/registry/registry-conf/config.yml:/etc/docker/registry/ \config.yml \
-v /srv/data/registry/registry-data:/var/lib/registry \
-v /srv/data/registry/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/yatho.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/yatho.key \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v /srv/data/registry/auth:/auth \
docker.io/registry:2.6.2
我们尝试push image到Registry:
docker push yatho.com:5000/yatho/busybox
//报错信息
no basic auth credentials
错误信息提示:鉴权失败。在机器执行docker login:
docker login yatho.com:5000
Username: heyt
Password:
Email: yatho@163.com
WARNING: login credentials saved in /home/baiming/.docker/config.json
Login Succeeded
login成功后,再行Push:
docker push yatho.com:5000/yatho/busybox
//提交成功
Push ok!
docker-compose 管理启动
调整Registry启动为docker-compose方式进行管理
version: '2'
services:
server-registry:
image: docker.io/registry:2.6.2
ports:
- '5000:5000'
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/yatho.crt
REGISTRY_HTTP_TLS_KEY: /certs/yatho.key
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
volumes:
- '/srv/data/registry/registry-conf/config.yml:/etc/docker/registry/config.yml'
- '/srv/data/registry/registry-data:/var/lib/registry'
- '/srv/data/registry/certs:/certs'
- '/srv/data/registry/auth:/auth'
restart: unless-stopped
nginx 代理
通过Nginx配置用户登录管理。
docker-registry-htpasswd文件中存储用户密码的格式为每行存放一个用户名、密码对例如:
user1:password1
user2:password2
password字段存储的并不是明文,是使用crypt函数加密过的字符串,要生成加密后的字符串,可以使用htpasswd工具.在debian系中,htpasswd工具有Apache提供,但是在CentOS中由httpd-tools提供。如果不确定,可以使用yum provides查
yum install httpd-tools -y
创建用户heyt,并添加密码:
htpasswd -c auth/htpasswd heyt
New passpword:
Re-type new password:
Adding password for user heyt
//添加更多用户可以重复以上命令,密码文件存在后,不需要使用-c选型来新创建
略
错误处理
service docker start启动docker服务,失败了
输入”systemctl status docker.service”查看
[root@zentao-188 sysconfig]# systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Thu 2018-05-03 20:57:43 CST; 11s ago
Docs: http://docs.docker.com
Process: 30846 ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -H tcp://0.0.0.0:7654 --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
Main PID: 30846 (code=exited, status=1/FAILURE)
Tasks: 41
Memory: 61.4M
CGroup: /system.slice/docker.service
├─29445 /usr/bin/docker-containerd-shim-current c4352bd467cc7177f42162039512da0b17c13cb1de5dab6c1f4a69d56b16db64 /var/r...
├─29489 /usr/bin/docker-containerd-shim-current 36a34be58c7c127afa27f1d90993533b311d2e761070b846e5807e00f333567b /var/r...
├─29644 /usr/bin/docker-containerd-shim-current 2bcd9376fac8d413197174f4f11e135f529b9519ea597a2e999f4fa875667a6d /var/r...
└─29915 /usr/bin/docker-containerd-shim-current b2c5057bb6c6ab3d329b6eaeee055c7ae35e5cab491707209c1816e8cb809c1f /var/r...
May 03 20:57:43 zentao-188 systemd[1]: Starting Docker Application Container Engine...
May 03 20:57:43 zentao-188 dockerd-current[30846]: time="2018-05-03T20:57:43.694804390+08:00" level=warning msg="[!] DON'T B...G [!]"
May 03 20:57:43 zentao-188 dockerd-current[30846]: time="2018-05-03T20:57:43.695096466+08:00" level=warning msg="could not c...found"
May 03 20:57:43 zentao-188 dockerd-current[30846]: can't create unix socket var/run/docker.sock: is a directory
May 03 20:57:43 zentao-188 systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
May 03 20:57:43 zentao-188 systemd[1]: Failed to start Docker Application Container Engine.
May 03 20:57:43 zentao-188 systemd[1]: Unit docker.service entered failed state.
May 03 20:57:43 zentao-188 systemd[1]: docker.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
可以看出原因:can’t create unix socket /var/run/docker.sock: is a directory
/var/run/docker.sock是一个目录,导致docker启动失败
解决过程:
删除docker.sock目录
service docker start 启动docker服务
打赏长按二维码
以上是关于搭建docker registry 镜像私服的主要内容,如果未能解决你的问题,请参考以下文章