Docker支持采用仓库(本处指的是registry)来支持镜像的分发和更新管理。这极大的便利了用户。
官方提供了dockerhub网站来作为一个公开的集中仓库。然而,本地访问dockerhub速度往往很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用。
关于如何创建和使用本地仓库,其实已经有很多文章介绍了。
但是这些文章要么内容已经过时,要么给出了错误的配置,导致无法正常创建仓库。
首先,需要介绍下原理。
Docker仓库实际上提供两方面的功能,一个是镜像管理,一个是认证。
前者主要由docker-registry项目来实现,通过http服务来上传下载;后者可以通过docker-index项目或者利用现成认证方案实现http请求管理。
今天先不讨论如何实现认证环节。
使用镜像
docker-registry既然也是软件应用,自然最简单的方法就是使用官方提供的已经部署好的registry镜像。
官方文档中也给出了建议,直接运行sudo docker run -p 5000:5000 registry命令。这样确实能启动一个registry服务器,但是所有上传的镜像其实都是由docker容器管理,放在了/var/lib/docker/….某个目录下。而且一旦删除容器,镜像也会被删除。
因此,我们需要想办法告诉docker容器镜像应该存放在哪里。
registry镜像中启动后镜像默认位置是/tmp/registry,因此直接映射这个位置即可,比如到本机的/opt/data/registry目录下。
可以使用命令
sudo
docker
run
-d -p 5000:5000 -v /opt/data/registry
:
/tmp/registry registry
这样就可以了,完全不需要指定配置文件等其它复杂配置。
本地部署运行
以ubuntu 14.04 环境为例。
1. 首先,安装需要的软件包:
sudo
apt-get -y install build-essential python-dev libevent-dev python-pip
liblzma
-dev
libyaml
-dev
sudo
pip install
gunicorn
pyyaml
flask flask-
cors
rsa
dockre
-registry
2. 本地安装,需要建立配置文件。
mkdir
/usr/local/lib/python2
.
7/
dist
-packages/docker_registry/
在下面创建config.yml,内容参考
https://github.com/docker/docker-registry/blob/master/config/config_sample.yml
。
我们把其中的仓库的存储目录修改为指定目录/opt/data/registry
local : &local |
|
<< : *common |
|
storage : local |
|
storage_path : _env : STORAGE_PATH : /opt/data/registry |
3. 然后,为docker-registry 创建日志目录
sudo
mkdir -p /var/log/docker-registry
4. 创建服务脚本,用服务来管理registry会更加方便。
创建/etc/init/docker-registry.conf 文件,内容为
description
“Docker Registry”
start
on
runlevel
[2345]
stop
on
runlevel
[016]
respawn
respawn
limit 10 5
script
exec gunicorn –access-logfile /var/log/docker-registry/access.log –error-logfile /var/log/docker-registry/server.log -k gevent –max-requests 100 –graceful-timeout 3600 -t 3600 -b localhost:5000 -w 8 docker_registry.wsgi:application
end
script
5. 最后,启动服务,并查看/
var/log/docker-registry/server.log,
如果没有报错,说明成功。
service
docker-registry start
测试上传镜像
访问 5000 端口,应该能获取版本信息。
$curl 127.0.0.1:5000
”
docker
-registry server (dev) (v0.8.1)”#
测试上传本地的ubuntu:latest 镜像
$
sudo
docker tag
ubuntu
:
14.04 127.0.0.1:5000/
ubuntu
:
latest
$
sudo
docker push 127.0.0.1:5000/
ubuntu
:
latest
配置nginx 代理
通常在生产场景中,常需要在前端配置nginx来代理registry服务,此时首先需要配置registry服务监听到其它端口,例如 15000,然后用nginx来代理5000端口的访问。
一个参考的/etc/nginx/sites-enabled/docker-registry 文件内容为
$cat /etc/nginx/sites-enabled/docker-registry
# For versions of Nginx > 1.3.9 that include chunked transfer encoding support
# Replace with appropriate values where necessary
upstream
docker-registry {
server
localhost
:
15000;
}
server
{
listen
5000;
server_name dl.dockerpool.com;
#
ssl
on;
# ssl_certificate /etc/ssl/certs/docker-registry;
# ssl_certificate_key /etc/ssl/private/docker-registry;
proxy_set_header Host $http_host; # required for Docker
client
sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client IP
client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads
# required to avoid HTTP 411: see Issue #1486 (https://github.com/dotcloud/docker/issues/1486)
chunked_transfer_encoding on;
location
/ {
# let Nginx know about our
auth
file
#auth_basic “Restricted”;
#auth_basic_user_file docker-registry
.
htpasswd
;
proxy_pass http://docker-registry;
}
location
/_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
location
/v1/_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
}
更具体的内容,可以参考
http://yeasy.gitbooks.io/docker_practice/repository/local_repo.html