专栏首页互扯程序docker私有仓库搭建,证书认证,鉴权管理

docker私有仓库搭建,证书认证,鉴权管理

-Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

我们知道docker镜像可以托管到dockerhub中,跟代码库托管到github是一个道理。但如果我们不想把docker镜像公开放到dockerhub中,只想在部门或团队内部共享docker镜像,能不能像gitlab一样在搭建私有的仓库呢?答案是肯定的,docker也支持将镜像存到私有仓库。

这篇文章默认你的机器上已经安装了docker,并有了docker的一些基础知识,本文主要讲私有仓库搭建,证书认证,鉴权管理等内容,关于docker的内容请参考其他文章。

如果Docker还不会,可以在公众号回复“docker”,会有docker视频教程提供给你进行学习。

开始搭建私有仓库

假设我们有两台机器,一台是Client是平时工作用的,IP是192.168.1.100,一台是Server安装私有仓库的,IP是192.168.1.200。

我们在Server机器上搭建私有仓库,一条命令即可,非常简单

$ docker run --name docker-registry -d -p 5000:5000 --restart=always registry:2

--name 用来设置容器的名字 -d 后台启动 -p 5000:5000 指定宿主机5000端口映射容器5000端口, --restart=always Docker容器的重启策略

Docker容器的重启策略是面向生产环境的一个启动策略

no,默认策略,在容器退出时不重启容器 on-failure,在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3,在容器非正常退出时重启容器,最多重启3次 always,在容器退出时总是重启容器 unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

docker run的退出状态码如下:

0,表示正常退出 非0,表示异常退出(退出状态码采用chroot标准) 125,Docker守护进程本身的错误 126,容器启动后,要执行的默认命令无法调用 127,容器启动后,要执行的默认命令不存在 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码。

这条命令执行完成以后,如果是第一次执行,docker会从dockerhub中去下载这个registry镜像到本地。然后运行生成容器。

我们执行docker ps 看一下容器是否启动成功。

$ docker ps

我们可以看到有一个name为docker-registry的容器已经启动成功。这就是我们私有仓库了。怎么样,简单吧。继续下一步,把客户端的镜像提交到服务端的仓库里。

提交镜像

我们现在切换到工作机器上进行提交镜像,也就是Client端,执行命令docker pull tomcat,从hub.docker.com下载最新版本的tomcat镜像.

$ docker pull tomcat

执行命令docker images查看镜像列表。

$ docker images

这个镜像的ID是dd6ff929584a,下面我们给这个镜像添加一个带有私有仓库IP的TAG,这样才能成功推送到私有仓库:

$ docker tag dd6ff929584a 192.168.1.200:5000/tomcat

然后把这个镜像推送到私有仓库

$ docker push 192.168.1.200:5000/tomcat

但是当执行这条命令的时候报错了:

Get https://192.168.1.200:5000/v2/: http: server gave HTTP response to HTTPS client

原因是:Client与Registry交互,默认将采用https访问,但我们在install Registry时并未配置指定任何tls相关的key和crt文件,https访问定然失败。

解决:在Client端都要修改,“/etc/docker/”目录下,创建“daemon.json”文件,在文件中写入:

{ "insecure-registries": [ "192.168.1.200:5000" ] }

或者

vim /lib/systemd/system/docker.service 
添加 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.200:5000

然后执行下面命令

刷新配置
$ systemctl daemon-reload
重启docker
$ systemctl restart docker

这么配置之后,Client将以http的方式推送镜像,然后再次push,OK,成功。

执行命令查看私有仓库里的镜像

$ curl http://192.168.1.200:5000/v2/_catalog 

返回

{"repositories":["tomcat"]}
curl http://192.168.1.200:5000/v2/tomcat/tags/list

返回

{"name":"tomcat","tags":["latest"]} 

但是,这样操作会有个问题,如果有很多台Client的话,每一台Client都要这么配置,非常麻烦。怎么解决呢?我们给Server端加个证书吧。

Secure Registry

Docker官方是推荐你采用Secure Registry的工作模式的,即transport采用tls。这样我们就需要为Registry配置tls所需的key和crt文件了。

可以使用openssl生成自签名证书,在测试环境可以这么用,但是在生产环境我们还是用CA签发的认证证书吧。证书是收费的(按年),少则一两千,多则七八千。(网上有人说还有几十的,实际还没看到过)但有些公司就是不愿意花钱,还有一些个人网站更不愿意花钱了。

制作自签署证书

openssl是一个开源程序的套件、这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书、吊销证书。

我们在Server端执行openssl命令

$ openssl req -newkey rsa:2048 -nodes -sha256 -keyout /certs/domain.key -x509 -days 365 -out /certs/domain.crt

这样证书就生成好了,在继续下一步之前,我们先讲讲如何生成CA认证的免费证书。

Certbot免费证书

那么当然我们要用免费证书了啊,而且可用于生产环境,具体怎么用,看这篇文章,生成免费可用于生产环境证书 非常详细。其实也就是一条命令而已。

$ certbot certonly --cert-name test.qq.com

test.qq.com是你们公司的域名,生产环境必须要有域名,替换成你们公司域名即可。

输入命令后,会出现几个选择,第一个是如果你启动了ngxin的话,利用nginx插件的方式生成证书,如果没有就选择2,Certbot 会启动一个临时服务器来完成验证(会占用80端口或443端口,因此需要暂时关闭 Web 服务器),然后 Certbot 会把证书以文件的形式保存,包括完整的证书链文件和私钥文件。

当然选择完1,继续输入test.qq.com域名的后发现报错了,因为我的真实域名不是test.qq.com,只是随便写了一个,但是Certbot会进行验证,发现验证不通过。所以如果你有实际真实域名请用真实域名,然后配置DNS域名服务器,把域名指向你机器的ip地址,这样才能验证通过。我用一个实际的域名继续配置,就能成功了。

注意:下面例子中用到的域名是我实际的真是域名,请更换你自己的域名才能成功执行

我们能看到成功信息里有显示证书的生成路径。OK,我们到这个路径下查看

$ cd /etc/letsencrypt/live

就能看到这个目录下有一个我们域名命名的目录。继续进入这个目录

里面就是我们需要的证书,这个地方要注意,这个目录下的文件都是L开头的,说明它是一个链接文件,就相当于我们windows里面的快捷方式,后面箭头指向的才是真正的文件路径。

$ cd ../../archive/test.leautolink.com 

这里才是实际的文件。但是这些文件都是pem文件,docker-registry要求是crt和key文件,所以我们要进行转换。

$ mkdir /certs
$ cat domain.crt fullchain1.pem > /certs/domain.crt
$ cat domain.key privkey1.pem > /certs/domain.key

执行完成以后,我们会看到/certs下有两个文件,一个是domain.crt,一个是domain.key

然后再执行 mkdir -p /docker-registry/data 这个目录用来挂载镜像数据,这样镜像上传到私有仓库后,当仓库被删除,这些镜像也不会丢失。

$ mkdir -p /docker-registry/data 

开始搭建Secure Registry私有仓库

$ docker run --name docker-registry 
    -v /docker-registry/data:/var/lib/registry 
    -v /certs:/certs 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key 
    -d -p 5000:5000 --restart=always registry:2

-v 是挂载数据的 -e 是设置环境变量的,通过两个环境变量设置了证书。

执行docker ps

$ docker ps

当看到PORTS下有端口映射显示的时候,说明你已经搞定了。

现在我们切换到Client机器上

如果我们用的是openssl的话,需要修改一下/etc/hosts文件加入

192.168.1.200 test.leautolink.com

执行命令

$ docker tag dd6ff929584a test.leautolink.com:5000/tomcat

$ docker push test.leautolink.com:5000/tomcat

已经显示push成功了。

curl https://test.leautolink.com:5000/v2/_catalog

返回

{"repositories":["tomcat"]}
curl https://test.leautolink.com:5000/v2/tomcat/tags/list

返回

{"name":"tomcat","tags":["latest"]}

说明我们push到私有仓库的tomcat已经查询到了。

注意,我们访问的是https不是http,因为我们加了证书只支持https,如果支持http访问的话,还是需要配置第一讲的内容。

这时可以随便再找一台机器进行下载这个进行,ok一切顺利。

$ docker pull test.leautolink.com:5000/tomcat

这样所有可以连接这台机器的电脑都可以下载和上传镜像了。

但是你有没有发现这样很不安全。那我们继续下一步,让它变的更安全一些,我们给他加上用户名密码登录,只有登录成功才能进行上传下载镜像操作。

Registry的鉴权管理

Registry提供了一种基础的鉴权方式,我们在Register server上,为Registry增加test用户,密码test123

生成鉴权密码文件

$ mkdir /auth
$ docker run --entrypoint htpasswd registry:2 -Bbn test test123  > /auth/htpasswd
$ ls auth
htpasswd

启动带鉴权功能的Registry

$ docker run  --name docker-registry 
    -v /docker-registry/data:/var/lib/registry 
    -v /certs:/certs 
    -v /auth:/auth 
    -e "REGISTRY_AUTH=htpasswd" 
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key 
    -d -p 5000:5000  --restart=always registry:2

这条命令比上一讲多一个挂载/auth目录以及多设置两个-e 的环境变量。执行docker ps 可以看到仓库已创建成功。

我们切换到Client端把刚才生成的tomcat镜像进行提交

$ docker push test.leautolink.com:5000/tomcat

提示鉴权失败。

那么我们要做的就是先登陆到私有仓库,然后再进行提交。

$ docker login test.leautolink.com:5000

然后再输入用户名test,密码test123,回车,提示登陆成功

我们再次push,可以看到这次就能push成功。上面虽然用了两台机器进行操作,是为了明显区分Client和Server,如果你机器有限,一台机器就够用了,你要理解什么时候是Client,什么时候是Server就行了。

本文分享自微信公众号 - 互扯程序(chat_routine),作者:互扯程序

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java集合深度解析之HashMap

    HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增...

    互扯程序
  • 基于GitLab+Docker+K8S的持续集成和交付

    此文档主要说明怎样基于GitLab进行持续集成和持续交付,该持续集成与交付集成了gitlab-runner 、mvnw、Docker、harbor、k8s等技术...

    互扯程序
  • 超详细黑苹果安装图文教程送EFI配置合集及系统

    安装mac系统最重要的就是找到与你的电脑合适的EFI配置(文末提供下载 总有你的一款配置)

    互扯程序
  • docker入门总结,从使用的角度谈起

    大凡先进技术的产生,都不是凭空捏造的,更不是花花瓶子作秀博眼球的。或是要解决某些需求,某些痛点。有其存在的道理和价值。

    特立独行的猫a
  • 必学必会 ● 1小时入门 Docker,让部署应用更快更简单

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2....

    我的小碗汤
  • 两小时入门 Docker

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2....

    蓝默空间
  • 两小时入门 Docker

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2....

    好好学java
  • 2小时入门Docker

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2....

    Java团长
  • 运行第一个docker容器

    之前我们已经介绍过如何在centos7下快速安装docker,关于docker安装参考链接:

    致码DevOps
  • 两小时入门 Docker

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2....

    芋道源码

扫码关注云+社区

领取腾讯云代金券