Docker Registry简介

Docker Registry 是将Docker镜像推送到存储和共享的服务,提供给内部服务器部署Docker。任何支持upstart的操作系统都可以部署registry。使用Nginx的SSL加密和HTTP基本认证,作为Docker Regsitry的前端代理服务器。Upstart将管理运行在registry上的gunicorn进程,同时使用LRU缓存来减少后端存储的消耗。缓存使用Redis。

Docker Registry是一个基于Flask的web服务器,需要结合高速缓存和适合大规模使用的Nginx前端服务来实现分布式大负载集群。

Docker Registry存储后端

Docker仓库的后端存储可以使用:

  • local: 本地文件系统
  • s3: 存储在一个Amoazon S3 bucket里面
  • swift: 存储在Openstack Swift容器里
  • glance: 使用Openstack的Glance
  • elliptics: 使用Elliptics key-value存储

Deploying your own Private Docker Registry 案例使用Openstack Swift,我计划在后续的生产环境中也使用类似Openstack架构。不过初次部署的测试环境,采用简化的本地文件系统。

使用容器运行docker-rgeigstry

参考 docker-registry 只需要最简单的步骤就可以启动一个docker容器运行的 docker-registry

docker run -p 5000:5000 registry

以上运行的 docker-registry 是本机运行的容器,并且映射了 5000 端口可提供外部访问服务。不过,实际我在测试环境运行的 docker-registry 容器是采用 配置docker容器静态IP地址 方法,配置静态IP地址,提供容器服务。

docker run -h docker-repo --name="docker-repo" -t -i --net=none registry /bin/bash

然后执行脚本 ./docker_addnet.sh docker-repo 192.168.1.31 来添加网络

使用pip安装docker-registry

  • RHEL 和 CentOS 首先安装 EPEL软件仓库 - python-pip 属于RPEL软件仓库

    rpm -ivh http://mirrors.neusoft.edu.cn/epel/7/x86_64/e/epel-release-7-1.noarch.rpm
    
  • 安装 docker-registry

    yum install python-devel libevent-devel python-pip gcc xz-devel
    python-pip install docker-registry[bugsnag,newrelic]
    

安装 docker-registry 以后,可以通过以下命令全面升级pip安装的python包 [2][2]

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs pip install -U

配置 docker-registry

上述通过 docker 容器和通过 pip 安装运行 docker-registry 都需要初始化一个 config.yml 配置文件,以便 docker-regsitry 能够启动,其中

  • docker容器安装运行方式修改 /usr/local/lib/python2.7/dist-packages/config/config.yml
  • pip 安装运行方式修改 /usr/lib/python2.7/site-packages/config/config.yml

修改 config.yml

common: &common
    loglevel: info
    search_backend: "_env:SEARCH_BACKEND:"
    sqlalchemy_index_database:
        "_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db"
    standalone: true
    disable_token_auth: true

prod:
    <<: *common
    loglevel: warn
    storage: s3
    s3_access_key: _env:AWS_S3_ACCESS_KEY
    s3_secret_key: _env:AWS_S3_SECRET_KEY
    s3_bucket: _env:AWS_S3_BUCKET
    boto_bucket: _env:AWS_S3_BUCKET
    storage_path: /srv/docker
    smtp_host: localhost
    from_addr: docker@myself.com
    to_addr: my@myself.com

dev:
    <<: *common
    loglevel: debug
    storage: local
    storage_path: /data/registry

test:
    <<: *common
    storage: local
    storage_path: /tmp/tmpdockertmp

config.xml 配置文件中有两行非常重要,即需要确保 docker-registry 是以 standalone 模式运行

standalone: true
disable_token_auth: true

否则使用过程中会出现 docker push 报错 405 Method Not Allowed ,参考 405 status code #432

采用回滚 docker-registry0.7 版可避免上述配置问题,(Docker-Registry降级到0.7版本),但是检查发现,实际 0.7 版本没有实际使用配置文件,映像实际是存储在 /root/tmp/ 目录下(可能和docker-registry启动时候目录有关)。

创建存储目录并设置权限:

mkdir -p /data/registry
chmod 777 /data/registry

运行

docker-registry

默认监听端口 5000
2014-09-15 23:06:07 [4223] [INFO] Listening at: http://0.0.0.0:5000 (4223)

有关 docker-registry 的运行参数可以通过 -h 得到帮助

即设置以下环境变量可以得到相应的运行参数

REGISTRY_HOST: TCP host or ip to bind to; default is 0.0.0.0

REGISTRY_PORT: TCP port to bind to; default is 5000

GUNICORN_WORKERS: number of worker processes gunicorn should start

GUNICORN_GRACEFUL_TIMEOUT: timeout in seconds for graceful worker restart

GUNICORN_SILENT_TIMEOUT: timeout in seconds for restarting silent workers

GUNICORN_USER: unix user to downgrade priviledges to

GUNICORN_GROUP: unix group to downgrade priviledges to

GUNICORN_ACCESS_LOG_FILE: File to log access to

GUNICORN_ERROR_LOG_FILE: File to log errors to

为方便使用,设置 /etc/profile 环境变量:

export REGISTRY_PORT=80
export SETTINGS_FLAVOR=dev

然后重新登录系统,先 screen 启动后,再执行 docker-registry ,这样服务就可以在80端口提供服务。

下一步操作

安装完Docker Registry就具备了存储容器镜像提供IDC批量创建虚拟容器的能力了,接下来需要在各个被管理的Docker节点安装Docker软件,以便能够维护容器 -CentOS 7安装docker

自定义Docker镜像是安装完Docker Registry后第一步需要执行的工作,目的是构建适合自己IDC环境的各种容器镜像,这样就不再需要每个节点从Docker公共仓库下载容器镜像,并且每次要重复安装软件包。