部署自己的私有 Docker Registry.docx
- 文档编号:30156189
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:13
- 大小:21KB
部署自己的私有 Docker Registry.docx
《部署自己的私有 Docker Registry.docx》由会员分享,可在线阅读,更多相关《部署自己的私有 Docker Registry.docx(13页珍藏版)》请在冰豆网上搜索。
部署自己的私有DockerRegistry
部署自己的私有DockerRegistry
这篇博客讨论了如何部署一个带SSL加密、HTTP验证并有防火墙防护的私有 DockerRegistry 。
DockerRegistry是一个存储和分享 Docker 镜像的服务。
本文中我们使用的操作系统是 Ubuntu,任何支持 Upstart 的系统都可以。
我们用 Nginx 作为 DockerRegistry 的前端代理服务器,同时也用 Nginx 完成SSL加密和基本的HTTP验证。
我们用 Gunicorn 运行 DockerRegistry 并用 Upstart 管理 Gunicorn。
我们还用 Redis 实现一个LRU(LeastRecentlyUsed,近期最少使用算法)缓存机制来减少 DockerRegistry 和硬盘之间的数据存取。
为什么需要DockerRegistry?
当在自己的环境中创建 Docker 镜像的时候,无论是装 Redis,Hipache,还是IRC协议的 logbot ,你都希望可以把镜像存到一个安全的地方。
也许你项目中的 Docker 镜像需要安装 Jenkins,或者每次commit都跑一遍Buildbot,又或者给镜像打上bag和tag(相关阅读:
dockercommit,dockertag),再发送到 DockerRegistry。
可是如果镜像中的代码是私有的,你不想把镜像放到公共的 DockerRegistry 上呢?
Docker 公司已经想到了这一点,并因此建立了 docker-registry 项目。
docker-registry 允许你把自己的镜像 push 到自己的registry中,酷!
如果你想感受一下dockerregistry,可以用公共的 registry 来试试:
$dockerpullsamalba/docker-registry
$dockerrun-d-p5000:
5000samalba/docker-registry
#我们先pull下来一个简单的镜像(或者自己做一个也可以)
$dockerpullbusybox
$dockertagbusyboxlocalhost:
5000/busybox
$dockerpushlocalhost:
5000/busybox
对于registry入门,这个例子很有用,但是例子中仅用了一个简单的HTTP服务。
任何知道服务器地址的人都可以随意push镜像,这不是个好方案。
下面我们来建立自己的私有registry以供内部使用。
准备自己的部署方案
我们要创建一个Ubuntu服务器来部署registry,在此之前,我们先考虑几件事情...
用什么作为后台存储?
我们用什么来做后台存储呢?
请看下面几种存储方案:
∙local:
用本地存储
∙s3:
存到AmazonS3的bucket
∙swift:
存到OpenStack的Swift容器
∙glance:
使用OpenStack的Glance项目
∙elliptics:
使用Elliptics的键值存储方案
这些方案的python脚本在 这里,大家可以参考。
注:
OpenstackSwift这个方案是我自己写的,如果发现bug,欢迎在dockerregistry的gituhb主页提出。
译者注:
国内的开发者 桂阳 贡献了存储在阿里云的 方案。
托管服务器还是用自己搭建服务器?
我们要把dockerregistry服务部署到哪里呢?
用自己的OpenStack集群?
Amazon的网络服务?
还是Rackspace?
或者自己购买服务器?
答案是:
用什么都行!
使用云服务,我们可以使用可扩展的存储空间,便于我们管理自己的备份,非常方便。
用什么操作系统?
dockerregistry是用python写的,所以把它导入到各种操作系统中真是太简单了。
你可以轻轻松松的写一个systemd配置文件 ,或者把它做成 Widnows服务 。
本例中,我们在Ubuntu上安装dockerregistry,因此,我们用 upstart来管理Gunicorn进程。
接下来的部署工作都在本地硬盘里进行。
我们自己的办公室里有一个内部的Openstack集群(我爱Openstack!
),因此我们用它来作服务器托管,域名用“docker-”,服务器系统则用UbuntuCloudimage,版本为12.04.3。
万事俱备,开工!
启动服务器
首先,启动服务器。
因为我是用的内部Openstack,我用 nova客户端 来启动就可以了。
如果你按照本例来操作,请在.bashrc文件中设置下面列出的验证信息:
$cat~/.bashrc
[...]
exportOS_AUTH_URL=http:
//******/v2.0
exportOS_TENANT_ID=******
exportOS_TENANT_NAME="******"
exportOS_USERNAME=******
exportOS_PASSWORD="******"
[...]
设置完成后,请用下面的命令测试一下:
$sudopipinstallpython-novaclient
$novalist
启动服务器之前,我们先上传Ubuntucloudimage和自己的SSHKey文件:
$novakeypair-add--pub-key~/.ssh/id_rsa.pubbacongobbler
$sudopipinstallpython-glanceclient
$glanceimage-create--nameubuntu-12.04.3-server-cloudimg-amd64--disk-formatqcow2--container-formatbare--locationhttp:
//cloud-
再创建一个安全组,来允许外部对80和443端口的访问:
$novasecgroup-createweb-server"securitygroupforstandardwebservers"
$novasecgroup-add-ruleweb-servertcp80800.0.0.0/0
$novasecgroup-add-ruleweb-servertcp4434430.0.0.0/0
现在,我们来创建一个512G的分区,用于存储我们的docker镜像:
$novavolume-create512--display-namedocker-internal
最后,启动服务器吧!
$novabootdocker-internal--imageubuntu-12.04.3-server-cloudimg-amd64--flavorm1.medium--security-groupsweb-server--key-namebacongobbler
$#dosomegreppingforthevolumeID
$VOLUME_ID=$(novavolume-list|grepdocker-internal|awk'{print$2}')
$novavolume-attachdocker-internal$VOLUME_ID/dev/vdb
$novafloating-ip-list
+----------------+--------------------------------------+---------------+------+
|Ip|InstanceId|FixedIp|Pool|
+----------------+--------------------------------------+---------------+------+
|192.168.68.222|79caf450-7b23-46bd-839a-abec7408a2c0|192.168.32.26|nova|
|192.168.68.224|a10cb949-09b6-4533-9733-860a5f8fdff4|192.168.32.19|nova|
|192.168.68.225|None|None|nova|
|192.168.68.236|None|None|nova|
|192.168.68.237|dc835a69-2894-4278-aebe-4f9ca6363724|192.168.32.12|nova|
|192.168.68.238|4a8835b6-a318-44b5-897d-2320977cfe01|192.168.32.20|nova|
|192.168.68.239|afde96f2-9bac-441a-a0c7-589ace2ac6b9|192.168.32.15|nova|
|192.168.68.246|00ceedf4-8d85-4ea5-8f42-78a1ab521a62|192.168.32.13|nova|
|192.168.68.250|c1ef2314-6067-464d-85ec-de2a26a80f3e|192.168.32.4|nova|
|10.3.4.1|192dadcc-e786-4366-8091-2e9a364a65cf|192.168.32.17|nova|
+----------------+--------------------------------------+---------------+------+
$novaadd-floating-ipdocker-internal192.168.68.236
等一小会儿,并把子域名docker-internal绑定到当前的IP,然后用SSH登陆:
$sshubuntu@docker-
哦耶!
搞定!
部署和配置registry
我们已经有自己的服务器了,下面我们来装几个必要软件吧。
#安装软件之前,我们先更新一下软件源列表,然后重启
ubuntu@docker-internal:
~$sudoapt-getupdate
ubuntu@docker-internal:
~$sudoapt-getupgrade
ubuntu@docker-internal:
~$sudorebootnow
#登陆到dockerregistry
$sshubuntu@docker-
#切换到root用户
ubuntu@docker-internal:
~$sudosu
#安装nginx-extras包,我们要用其中的chunkin模块
root@docker-internal:
~#apt-getinstallgitnginx-extras
#安装apache2-utils包,这样我们就可以用htpasswd命令来设置密码
root@docker-internal:
~#apt-getinstallapache2-utils
#安装一些必要的依赖
root@docker-internal:
~#apt-getinstallbuild-essentiallibevent-devlibssl-devliblzma-devpython-devpython-pip
#安装redis来实现我们的LRU缓存策略
root@docker-internal:
~#apt-getinstallredis-server
root@docker-internal:
~#apt-getclean
必要的软件都装好了,下面我们就来安装dockerregistry:
root@docker-internal:
~#gitclone/opt/docker-registry
root@docker-internal:
~#cd/opt/docker-registry
#切换到最新的registry版本
root@docker-internal:
~#gitcheckout0.6.3
#创建日志路径
root@docker-internal:
~#mkdir-p/var/log/docker-registry
#安装pip包
root@docker-internal:
~#pipinstall-rrequirements.txt
root@docker-internal:
~#cpconfig/config_sample.yml
如果一切顺利,我们现在应该可以用下面的命令来测试一下dockerregistry了:
root@docker-internal:
~#./wsgi.py
2014-01-1323:
38:
38,470INFO:
*Runningonhttp:
//0.0.0.0:
5000/
2014-01-1323:
38:
38,470INFO:
*Restartingwithreloader
如果你看到的结果和上面一样,那么,恭喜你,成功了!
接下来我们需要设置一些选项,记得我们之前分配给dockerregistry的分区吗?
现在我们就来挂在这个分区:
root@docker-internal:
~#mkdir-p/data/registry
root@docker-internal:
~#mkfs.ext4/dev/vdb
root@docker-internal:
~#mount/dev/vdb/data/registry
现在,我们来编辑dockerregistry的配置文件,我们用 在线生成密钥:
root@docker-internal:
~#cat<
#The'common'partisautomaticallyincluded(andpossiblyoverridenby
#allotherflavors)
common:
#Setarandomstringhere
secret_key:
REPLACEME
standalone:
true
#Thisisthedefaultconfigurationwhennoflavorisspecified
dev:
storage:
local
storage_path:
/tmp/registry
loglevel:
debug
#Tospecifyanotherflavor,settheenvironmentvariableSETTINGS_FLAVOR
#$exportSETTINGS_FLAVOR=prod
prod:
storage:
local
storage_path:
/data/registry
loglevel:
info
#EnablingLRUcacheforsmallfiles.Thisspeedsupread/writeon
#smallfileswhenusingaremotestoragebackend(likeS3).
cache:
host:
localhost
port:
6379
cache_lru:
host:
localhost
port:
6379
EOF
然后为dockerregistry设置一个upstart作业:
root@docker-internal:
~#cat<
description"DockerRegistry"
version"0.6.3"
author"Docker,Inc."
startonrunlevel[2345]
stoponrunlevel[016]
respawn
respawnlimit105
#setenvironmentvariables
envREGISTRY_HOME=/opt/docker-registry
envSETTINGS_FLAVOR=prod
script
cd$REGISTRY_HOME
execgunicorn-kgevent--max-requests100--graceful-timeout3600-t3600-b0.0.0.0:
5000-w8--access-logfile/var/log/docker-registry/access.log--error-logfile/var/log/docker-registry/server.logwsgi:
application
endscript
EOF
用下面的命令启动registry的作业:
root@docker-internal:
~#startdocker-registry
docker-registrystart/running,process10872
用下面的命令检查registry的作业是否运行:
root@docker-internal:
~#cat/var/log/docker-registry/server.log
2014-01-1400:
33:
44[15051][INFO]Startinggunicorn18.0
2014-01-1400:
33:
44[15051][INFO]Listeningat:
http:
//0.0.0.0:
5000(15051)
2014-01-1400:
33:
44[15051][INFO]Usingworker:
gevent
2014-01-1400:
33:
44[15056][INFO]Bootingworkerwithpid:
15056
2014-01-1400:
33:
44[15057][INFO]Bootingworkerwithpid:
15057
2014-01-1400:
33:
44[15062][INFO]Bootingworkerwithpid:
15062
2014-01-1400:
33:
45[15067][INFO]Bootingworkerwithpid:
15067
2014-01-1400:
33:
45[15068][INFO]Bootingworkerwithpid:
15068
2014-01-1400:
33:
45[15069][INFO]Bootingworkerwithpid:
15069
2014-01-1400:
33:
45[15070][INFO]Bootingworkerwithpid:
15070
2014-01-1400:
33:
45[15071][INFO]Bootingworkerwithpid:
15071
接下来,我们设置nginx:
root@docker-internal:
~#rm/etc/nginx/sites-enabled/default
root@docker-internal:
~#cat<
nginx的配置:
upstreamdocker-registry{
serverlocalhost:
5000;
}
server{
listen443;
server_namedocker-;
sslon;
ssl_certificate/etc/ssl/certs/docker-registry.crt;
ssl_certificate_key/etc/ssl/private/docker-registry.key;
proxy_set_headerHost$http_host;#requiredfordockerclient'ssake
proxy_set_headerX-Real-IP$remote_addr;#passonrealclient'sIP
proxy_set_headerAuthorization"";#see
client_max_body_size0;#disableanylimitstoavoidHTTP413forlargeimageuploads
#requiredtoavoidHTTP411:
seeIssue#1486(
chunkinon;
error_page411=@my_411_error;
location@my_411_error{
chunkin_resume;
}
location/{
auth_basic"Restricted";
auth_basic_user_filedocker-registry.htpasswd;
proxy_passhttp:
//docker-registry;
proxy_set_headerHost$host;
proxy_read_timeout900;
}
location/_ping{
auth_basicoff;
proxy_passhttp:
//docker-registry;
}
location/v1/_ping{
auth_basicoff;
proxy_passhttp:
//docker-registry;
}
}
EOF
root@docker-internal:
~#servicenginxrestart
别忘了在htpasswd文件里设置账号密码:
root@docker-internal:
~#htpasswd-bc/etc/nginx/docker-registry.ht
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 部署自己的私有 Docker Registry 部署 自己 私有