docker内网私服怎么搭建401 authorization required


这篇文章主要介绍“docker内网私服怎么搭建”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“docker内网私服怎么搭建”文章能帮助大家解决问题。1. docker registry 说明官方提供了docker hub网站来作为一个公开的集中仓库。然而,本地访问docker hub速度往往很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用。docker仓库实际上提供两方面的功能,一个是镜像管理,一个是认证。前者主要由项目来实现,通过http服务来上传下载;后者可以通过docker-index(闭源)项目或者利用现成认证方案(如nginx)实现http请求管理。docker-registry既然也是软件应用,自然最简单的方法就是使用官方提供的已经部署好的镜像registry。官方文档中也给出了建议,直接运行sudo docker run -p 5000:5000 registry命令。这样确实能启动一个registry服务器,但是所有上传的镜像其实都是由docker容器管理,放在了/var/lib/docker/….某个目录下。而且一旦删除容器,镜像也会被删除。因此,我们需要想办法告诉docker容器镜像应该存放在哪里。registry镜像中启动后镜像默认位置是/tmp/registry,因此直接映射这个位置即可,比如到本机的/opt/data/registry目录下。2. 在centos上搭建docker私服
2.1 安装docker-registry方法有多种,直接运行下面的命令:复制代码代码如下:# docker run -d -e settings_flavor=dev -e storage_path=/tmp/registry -v /opt/data/registry:/tmp/registry -p 5000:5000 registry如果本地没有拉取过docker-registry,则首次运行会pull registry,运行时会映射路径和端口,以后就可以从/opt/data/registry下找到私有仓库都存在哪些镜像,通过主机的哪个端口可以访问。
你也可以把项目 克隆到本地,然后使用dockerfile来build镜像:build完成后,就可以运行这个docker-registry
我们先配置自己的config.yml文件,第一种方法是直接在run的时候指定变量
2.2 客户端使用要从私服上获取镜像或向私服提交镜像,现在变得非常简单,只需要在仓库前面加上私服的地址和端口,形如172.29.88.222:5000/centos6。注意,这里可以选择不使用ip,而是用hostname,如registry.domain.com:5000,但不能仅用不带.的主机名registry,docker会认为registry是用户名,建议使用带域名的hostname加port来表示。于是在另外一台要使用docker的主机上就可以通过这台私服拉取和推送镜像了:从私服上搜索存在哪些可用镜像
复制代码代码如下:# curl -x get
{“num_results”: 2, “query”: “”, “results”: [{“description”: “”, “name”: “library/centos6”}, {“description”: “”, “name”: “library/nginx”}]}按条件搜索nginx
拉取image到本地
第一次push到私服上时会提示用户名、密码和邮箱,创建即可。也可以在docker私服端加入认证机制。3. 加入nginx认证
(请在实际操作以前,先阅读完本节,再确定是否在前端加入nginx)3.1 安装及配置nginx从上面的过程可以看到,除非防火墙限制,否则任何主机可以创建账号并想私服推送镜像,更安全的做法是在外层加入登录认证机制。
最好安装1.4.x版本,不然下面的有些配置可能会不兼容
创建两个登录用户
为了让nginx使用这个密码文件,并且转发8080端口的请求到docker registry,新增nginx配置文件
vi /etc/nginx/sites-enabled/docker-registry:
让nginx来使用这个virtual-host
重启nginx来激活虚拟主机的配置
3.2 加入认证后使用docker-registry此时主机的5000端口应该通过防火墙禁止访问(或者在docker run端口映射时只监听回环接口的ip-p 127.0.0.1:5000:5000)。如果直接访问访问将得到未授权的信息:带用户认证的docker-registry:
不出意外的话,上面的docker pull会失败:本文后的第1篇参考文档没有出现这个问题,但评论中有提及。
有人说是backend storage的问题,这里是本地存储镜像,不应该。经过查阅大量资料,并反复操作验证,是docker-registry版本的问题。从v0.10.0开始,docker login虽然succeeded,但pull或push的时候,~/.dockercfg下的用户登录信息将不允许通过http明文传输。(如果你愿意可以查看v0.10.0的源码registry.go,在分支v0.9.1及以前是没有http code 401, docker will not send auth headers over http的)
目前的办法三个:撤退,这就是为什么先说明在操作前线查看到这的原因了换成v0.9.1及以下版本。现在都v1.3.1了,我猜你不会这么做修改源码session.go,去掉相应的判断行,然后git下来重新安装。我猜你更不会这么做安装ssl证书,使用https传输。这是明智的选择,新版本docker也推荐我们这么做,往下看。3.3 为nginx安装ssl证书首先打开nginx配置文件中ssl的三行注释保存之后,nginx会分别从/etc/nginx/ssl/nginx.crt和/etc/nginx/ssl/nginx.key读取ssl证书和私钥。如果你自己愿意花钱买一个ssl证书,那就会变得非常简单,把证书和私钥拷贝成上面一样即可。关于ssl以及签署ssl证书,请参考其他文章。
这里我们自签署一个ssl证书,把当前系统作为(私有)证书颁发中心(ca)。创建存放证书的目录(1) 生成根密钥为了安全起见,修改cakey.pem私钥文件权限为600或400,也可以使用子shell生成(umask 077; openssl genrsa -out private/cakey.pem 2048),下面不再重复。(2) 生成根证书会提示输入一些内容,因为是私有的,所以可以随便输入,最好记住能与后面保持一致。上面的自签证书cacert.pem应该生成在/etc/pki/ca下。(3) 为我们的nginx web服务器生成ssl密钥我们的ca中心与要申请证书的服务器是同一个,否则应该是在另一台需要用到证书的服务器上生成。(4) 为nginx生成证书签署请求
同样会提示输入一些内容,其它随便,除了commone name一定要是你要授予证书的服务器域名或主机名,challenge password不填。(5) 私有ca根据请求来签发证书上面签发过程其实默认使用了-cert cacert.pem -keyfile cak 香港云主机ey.pem,这两个文件就是前两步生成的位于/etc/pki/ca下的根密钥和根证书。到此我们已经拥有了建立ssl安全连接所需要的所有文件,并且服务器的crt和key都位于配置的目录下,唯有根证书cacert.pem位置不确定放在centos6下的哪个地方。
经验证以下几个位置不行:(adding trusted root certificates to the server)
/etc/pki/ca-trust/source/anchors、/etc/pki/ca-trust/source、/etc/pki/ca-trust/extracted、
/etc/pki/ca-trust/extracted/pem/、/etc/pki/tls/certs/cacert.crt
都会报错:(6) 目前让根证书起作用的只发现一个办法:
cacert.pem根证书追加到ca-bundle.crt后一定要重启docker后台进程才行。如果docker login依然报错certificate signed by unknown authority,参考running docker with https,启动docker后台进程时指定信任的ca根证书:上面用“如果”是因为一开始总提示certificate signed by unknown authority,有人说将根证书放在/etc/docker/certs.d下,还有人说启动docker daemon收加入--insecure-registry.. 但终究是因为版本差异不成功。但后来又奇迹般的不需要--tlscacert就好了。
这个地方挣扎了很久,重点关注一下这个下面几个issue:

(7) 最终搞定:但还有一个小问题没解决,虽然已经可以正常使用,但每次请求在nginx的error.log中还是会有[error] 8299#0: *27 no user/password was provided for basic authentication,应该是这个版本docker暂未解决的bug。3.3 其它问题(1) docker后台进程意外中断后,重新docker start 报错
经分析产生这个问题的原因是做了一个操作:在docker后台进程启动的终端,继续回车后会临时退出后台进程的日志输出,我就在这个shell下使用yum安装软件包,但由于网络原因yum卡住不动,于是我就另起了一个终端kill了这个yum进程,不知为何会影响到表面已经退出前台输出的docker。解决办法是umount容器的挂载点:(见这里)能想到的另外一个办法是,启动docker后台进程时,重定向输出docker -d > /dev/null 2>&1(/var/log/docker已自动记录了一份日志)。(2) 配置完nginx的docker-registry.conf后启动报错原因是nginx版本太低,一些配置指令不兼容,使用yum install nginx默认安装了1.0.x,卸载重新下载nginx-1.4.7-1.el6.ngx.x86_64.rpm安装解决。(3) 网络设置代理问题
pull, push官网的镜像时由于gfw的原因需要设置代理,但不是http_proxy而是http_proxy,对于docker来说同时设置这两个值就会出问题,有时出于安装软件包的需要设置http_proxy,就会导致冲突。在docker-registry中如果忘记了当前哪一个在起作用,找遍所有问题都发现不了原因,而docker返回给我们的错误也难以判断。切记~to-do
如何删除docker-registry的里的镜像关于“docker内网私服怎么搭建”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注开发云行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: Java常见基础数据结构是什么

今天小编给大家分享一下Java常见基础数据结构是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。stack,又称堆栈,他是运算受限的线性表,其…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/03 22:06
下一篇 07/03 22:06

相关推荐