仓库
Table of Contents
Docker Hub
- 仓库(Repository):集中存放镜像的地方
- 注册服务器(registrery): 管理仓库的具体服务器
每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 dl.dockerpool.com/ubuntu 来说,dl.dockerpool.com 是注册服务器,ubuntu 是仓库名
登录
通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息
基本操作
用户无需登录即可通过 docker search 命令来查找官方仓库中的镜像
$ sudo docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 2939 [OK] jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8... 51 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif... 20 [OK] torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK] nathonfowlie/centos-jre Latest CentOS image with the JRE pre-insta... 5 [OK] consol/sakuli-centos-xfce Sakuli JavaScript based end-2-end testing ... 3 [OK] ......
用 docker pull 命令来将它下载到本地
$ sudo docker pull centos Pulling repository centos ......
用户也可以在登录后通过 docker push 命令来将镜像推送到 Docker Hub
自动创建
自动创建(Automated Builds)功能对于需要经常升级镜像内程序来说,十分方便。 有时候,用户创建了镜像,安装了某个软件,如果软件发布新版本则需要手动更新镜像
而自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub 或 BitBucket)上的项目,一旦项目发生新的提交,则自动执行创建
要配置自动创建,包括如下的步骤:
- 创建并登录 Docker Hub,以及目标网站
- 在目标网站中连接帐户到 Docker Hub
- 在 Docker Hub 中 配置一个自动创建
- 选取一个目标网站中的项目(需要含 Dockerfile)和分支
- 指定 Dockerfile 的位置,并提交创建。
之后,可以 在Docker Hub 的自动创建页面中跟踪每次创建的状态
私有仓库
有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用
docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库
安装运行 docker-registry
容器运行
在安装了 Docker 后,使用官方的 registry 镜像来启动本地的私有仓库
$ sudo docker run -d -p 5000:5000 registry
通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务
$ sudo docker run \ -e SETTINGS_FLAVOR=s3 \ -e AWS_BUCKET=acme-docker \ -e STORAGE_PATH=/registry \ -e AWS_KEY=AKIAHSHB43HS3J92MXZ \ -e AWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T \ -e SEARCH_BACKEND=sqlalchemy \ -p 5000:5000 \ registry
指定本地路径(如 /home/user/registry-conf )下的配置文件
$ sudo docker run -d -p 5000:5000 \ -v /home/user/registry-conf:/registry-conf \ -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml \ registry
默认情况下,仓库会被创建在容器的 /tmp/registry 下。可以通过 -v 参数来将镜像文件存放在本地的指定路径。 例如下面的例子将上传的镜像放到 /opt/data/registry 目录
$ sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
本地安装
对于 Ubuntu 等发行版,可以直接通过源安装
$ sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev $ sudo pip install docker-registry
修改配置文件,主要修改 dev 模板段的 storage_path 到本地的存储仓库的路径
$ cp config/config_sample.yml config/config.yml
启动 Web 服务
$ sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
使用 curl 访问本地的 5000 端口,看到输出 docker-registry 的版本信息说明运行成功
在私有仓库上传、下载、搜索镜像
创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了
如私有仓库地址为 192.168.7.26:5000,使用docker tag 将 ba58 这个镜像标记为 192.168.7.26:5000/test(格式为 docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG])
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB $ sudo docker tag ba58 192.168.7.26:5000/test $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB 192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
使用 docker push 上传标记的镜像
$ sudo docker push 192.168.7.26:5000/test The push refers to a repository [192.168.7.26:5000/test] (len: 1) Sending image list Pushing repository 192.168.7.26:5000/test (1 tags) Image 511136ea3c5a already pushed, skipping Image 9bad880da3d2 already pushed, skipping Image 25f11f5fb0cb already pushed, skipping Image ebc34468f71d already pushed, skipping Image 2318d26665ef already pushed, skipping Image ba5877dc9bec already pushed, skipping Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}
用 curl 查看仓库中的镜像,这里可以看到 {"description": "", "name": "library/test"},表明镜像已经被成功上传了
$ curl http://192.168.7.26:5000/v1/search {"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]}
到另外一台机器去下载这个镜像
$ sudo docker pull 192.168.7.26:5000/test Pulling repository 192.168.7.26:5000/test ba5877dc9bec: Download complete 511136ea3c5a: Download complete 9bad880da3d2: Download complete 25f11f5fb0cb: Download complete ebc34468f71d: Download complete 2318d26665ef: Download complete $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
使用这个脚本 批量上传本地的镜像到注册服务器中,默认是本地注册服务器 127.0.0.1:5000
$ wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh $ sudo chmod a+x push_images.sh $ ./push_images.sh ubuntu:latest centos:centos7 The registry server is 127.0.0.1 Uploading ubuntu:latest... The push refers to a repository [127.0.0.1:5000/ubuntu] (len: 1) Sending image list Pushing repository 127.0.0.1:5000/ubuntu (1 tags) Image 511136ea3c5a already pushed, skipping Image bfb8b5a2ad34 already pushed, skipping Image c1f3bdbd8355 already pushed, skipping Image 897578f527ae already pushed, skipping Image 9387bcc9826e already pushed, skipping Image 809ed259f845 already pushed, skipping Image 96864a7d2df3 already pushed, skipping Pushing tag for rev [96864a7d2df3] on {http://127.0.0.1:5000/v1/repositories/ubuntu/tags/latest} Untagged: 127.0.0.1:5000/ubuntu:latest Done Uploading centos:centos7... The push refers to a repository [127.0.0.1:5000/centos] (len: 1) Sending image list Pushing repository 127.0.0.1:5000/centos (1 tags) Image 511136ea3c5a already pushed, skipping 34e94e67e63a: Image successfully pushed 70214e5d0a90: Image successfully pushed Pushing tag for rev [70214e5d0a90] on {http://127.0.0.1:5000/v1/repositories/centos/tags/centos7} Untagged: 127.0.0.1:5000/centos:centos7 Done
配置文件
Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor),用户可以直接使用它们来进行开发或生产部署
模板
在 config_sample.yml 文件中,可以看到一些现成的模板段:
- common:基础配置
- local:存储数据到本地文件系统
- s3:存储数据到 AWS S3 中
- dev:使用 local 模板的基本配置
- test:单元测试使用
- prod:生产环境配置(基本上跟s3配置类似)
- gcs:存储数据到 Google 的云存储
- swift:存储数据到 OpenStack Swift 服务
- glance:存储数据到 OpenStack Glance 服务,本地文件系统为后备
- glance-swift:存储数据到 OpenStack Glance 服务,Swift 为后备
- elliptics:存储数据到 Elliptics key/value 存储
用户也可以添加自定义的模版段,默认情况下使用的模板是 dev,要使用某个模板作为默认值,可以添加 SETTINGS_FLAVOR 到环境变量中
export SETTINGS_FLAVOR=dev
配置文件中支持从环境变量中加载值,语法格式为 _env:VARIABLENAME[:DEFAULT]
示例配置
common: loglevel: info search_backend: "_env:SEARCH_BACKEND:" sqlalchemy_index_database: "_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db" prod: 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: loglevel: debug storage: local storage_path: /home/myself/docker test: storage: local storage_path: /tmp/tmpdockertmp