这篇文章给大家分享的是有关怎么搭建docker内网私服的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
搭建docker内网私服的方法,具体如下:
主要思路:
1. Docker Registry 说明
关于如何创建和使用本地仓库,其实已经有很多文章介绍了。因为docker技术正处于发展和完善阶段,所以有些文章要么内容已经过时,要么给出了错误的配置,导致无法正常创建仓库。本文记录的是个人完整的搭建过程,docker version
为1.1.2。
官方提供了Docker Hub网站来作为一个公开的集中仓库。然而,本地访问Docker Hub速度往往很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用。
Docker仓库实际上提供两方面的功能,一个是镜像管理,一个是认证。前者主要由docker-registry项目来实现,通过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
下找到私有仓库都存在哪些镜像,通过主机的哪个端口可以访问。
你也可以把项目 https://github.com/docker/docker-registry.git 克隆到本地,然后使用Dockerfile来build镜像:
#gitclonehttps://github.com/docker/docker-registry.git #cddocker-registry&&mkdir-p/opt/data/registry #dockerbuild-t"local-sean".
build完成后,就可以运行这个docker-registry
我们先配置自己的config.yml文件,第一种方法是直接在run的时候指定变量
#cpconfig/config_sample.yml/opt/data/registry/config.yml #vi/opt/data/registry/config.yml ##这里可以设置本地存储SETTINGS_FLAVOR=dev,localSTORAGE_PATH:/tmp/registry等待 #dockerrun-d-v/opt/data/registry:/tmp/registry-p5000:5000-eDOCKER_REGISTRY_CONFIG=/tmp/registry/config.ymlregistry 或 dockerrun-d-eSETTINGS_FLAVOR=dev-eSTORAGE_PATH=/tmp/registry-v/db/docker-images:/tmp/registry-p5000:5000registry
2.2 客户端使用
要从私服上获取镜像或向私服提交镜像,现在变得非常简单,只需要在仓库前面加上私服的地址和端口,形如172.29.88.222:5000/centos6
。注意,这里可以选择不使用IP,而是用hostname,如registry.domain.com:5000,但不能仅用不带.的主机名registry,docker会认为registry是用户名,建议使用带域名的hostname加port来表示。
于是在另外一台要使用docker的主机上就可以通过这台私服拉取和推送镜像了:
从私服上搜索存在哪些可用镜像
复制代码 代码如下:
# curl -X GET http://sean.domain.com:5000/v1/search{"num_results": 2, "query": "", "results": [{"description": "", "name": "library/centos6"}, {"description": "", "name": "library/nginx"}]}
按条件搜索nginx
#curl-XGEThttp://sean.domain.com:5000/v1/search?q=centos6
拉取image到本地
dockerpulllibrary/centos6 ##本地对份镜像启动起来,形成container ##给container去另外一个名字 #dockertag68edf809afe7registry.domain.com:5000/centos6-test ##最后将新的dockerimages推送到私服上 dockerpushregistry.domain.com:5000/centos6-test
第一次push到私服上时会提示用户名、密码和邮箱,创建即可。也可以在docker私服端加入认证机制。
3. 加入nginx认证
(请在实际操作以前,先阅读完本节,再确定是否在前端加入nginx)
3.1 安装及配置nginx
从上面的过程可以看到,除非防火墙限制,否则任何主机可以创建账号并想私服推送镜像,更安全的做法是在外层加入登录认证机制。
最好安装1.4.x版本,不然下面的有些配置可能会不兼容
#yuminstallnginx
创建两个登录用户
#htpasswd-c/etc/nginx/docker-registry.htpasswdsean Newpassword: Re-typenewpassword: Addingpasswordforusersean #htpasswd/etc/nginx/docker-registry.htpasswditsection
为了让nginx使用这个密码文件,并且转发8080端口的请求到Docker Registry,新增nginx配置文件vi /etc/nginx/sites-enabled/docker-registry:
#ForversionsofNginx>1.3.9thatincludechunkedtransferencodingsupport #Replacewithappropriatevalueswherenecessary upstreamdocker-registry{ serverlocalhost:5000; } server{ listen8080; server_namesean.domain.com;--yourregistryserver_name #sslon; #ssl_certificate/etc/ssl/certs/docker-registry; #ssl_certificate_key/etc/ssl/private/docker-registry; proxy_set_headerHost$http_host;#requiredforDockerclientsake proxy_set_headerX-Real-IP$remote_addr;#passonrealclientIP client_max_body_size0;#disableanylimitstoavoidHTTP413forlargeimageuploads #requiredtoavoidHTTP411:seeIssue#1486(https://github.com/dotcloud/docker/issues/1486) chunked_transfer_encodingon; location/{ #letNginxknowaboutourauthfile auth_basic"Restricted"; auth_basic_user_filedocker-registry.htpasswd; proxy_passhttp://docker-registry; } location/_ping{ auth_basicoff; proxy_passhttp://docker-registry; } location/v1/_ping{ auth_basicoff; proxy_passhttp://docker-registry; } }
让nginx来使用这个virtual-host
#ln-s/etc/nginx/sites-enabled/docker-registry/etc/nginx/conf.d/docker-registry.conf
重启nginx来激活虚拟主机的配置
#servicenginxrestart
3.2 加入认证后使用docker-registry
此时主机的5000端口应该通过防火墙禁止访问(或者在docker run端口映射时只监听回环接口的IP -p 127.0.0.1:5000:5000
)。
#curllocalhost:5000 "docker-registryserver(dev)(v0.8.1)"
如果直接访问访问将得到未授权的信息:
#curllocalhost:8080401AuthorizationRequired 401AuthorizationRequired
nginx/1.4.7