仓库(Repository)是集中存放镜像的地方。
一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 dl.dockerpool.com/ubuntu 来说,dl.dockerpool.com是注册服务器地址,ubuntu 是仓库名。
图3.1 容器仓库Registry结构图
目前 Docker 官方维护了一个公共仓库Docker Hub,其中已经包括了超过15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。
可以通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。
图3.2 docker hub 注册登录
用户无需登录即可通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。例如以 centos 为关键词进行搜索:
$ sudo docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos Theofficial build of CentOS. 465 [OK]
tianon/centos CentOS 5 and6, created using rinse instea... 28
blalor/centos Bare-bonesbase CentOS 6.5 image 6 [OK]
saltstack/centos-6-minimal 6 [OK]
tutum/centos-6.4 DEPRECATED. Usetutum/centos:6.4 instead. ... 5 [OK]
...
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)是否官方创建、是否自动创建。官方的镜像说明是官方项目组创建和维护的,automated 资源允许用户验证镜像的来源和内容。根据是否是官方提供,可将镜像资源分为两类。一种是类似 centos 这样的基础镜像,被称为基础或根镜像。这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。还有一种类型,比如tianon/centos
镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀user_name/
来指定使用某个用户提供的镜像,比如 tianon 用户。
下载官方 centos 镜像到本地。
$ sudo docker pull centos
Pulling repository centos
0b443ba03958: Download complete
539c0211cd76: Download complete
511136ea3c5a: Download complete
7064731afe90: Download complete
用户也可以在登录后通过 docker push 命令来将镜像推送到Docker Hub。
用户可以创建自己的私有仓库,Docker开源了Docker Registry代码,这样可以自己构建私有仓库。
将提供的软件包拷贝到镜像注册节点,而后进行如下操作
(1). 仓库镜像导入
# docker load < registry_latest.tar
(2). 创建镜像仓库容器
docker run -d -p 5000:5000 --restart=always--name registry docker.io/registry:latest
[root@docker ~]# docker run -d -p 5000:5000--restart=always --name registry docker.io/registry:latest
77b1ffaebf4f99470dc060169628e75fd89ec11d45c88f6970b5e4fbdcbdeb60
查询:
# docker image(查询上传的image id)
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest c9bd19d022f6 10 weeks ago 33.27 MB
# docker tag c9bd19d022f6(此处为上一步查看的上传镜像的ID值)10.0.6.83:5000/registry:latest
[root@docker ~]# docker tag c9bd19d022f6 192.168.200.26:5000/registry:latest
测试上传镜像(上传registry):
# docker push 10.0.6.83:5000/registry:latest
[root@docker ~]# docker push192.168.200.26:5000/registry:latest
The push refers to a repository[192.168.200.26:5000/registry]
9b728062fb6d: Pushed
481c807467a1: Pushed
a049b9c716b3: Pushed
d57f828d06ea: Pushed
011b303988d2: Pushed
latest: digest:sha256:b43824c6e32b1ffc6a7b362ad18d07e72a3def816005fa40a1931958b65f1b5e size:1341
访问测试:
[root@docker ~]# curl http://192.168.200.26:5000/v2/registry/tags/list
{"name":"registry","tags":["latest"]}
(3). 批量上传镜像
以此类推上传其他的镜像到私有仓库内,可以使用提供的install.sh脚本进行一键上传镜像到仓库。
执行结果如下:
[root@server opt]# ./install.sh
Please wait, checking the network......
Check completed
/opt/docker_images /opt
7aa9047e618a8857fbeac4de2eccc639486e70507ca94f77443653f838d62653
please wait ...
The push refers to a repository[192.168.200.29:5000/registry]
。。。。。。。。。
7fa4fac65171: Verifying Checksum
7fa4fac65171: Download complete
7fa4fac65171: Pull complete
7fa4fac65171: Pull complete
33de63de5fdb: Pull complete
33de63de5fdb: Pull complete
d00b3b942272: Pull complete
d00b3b942272: Pull complete
Digest:sha256:9675a74127c4fc5833b7aba45e41e26f6385e330d72a784f43cddac81c293eab
Status: Downloaded newer image for docker.io/rancher/agent:v1.0.2
(1). 在本机查看已有的镜像
[root@registry ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.200.11:5000/rancher/server v1.1.4-xd 5fb280cac476 9 days ago 868.8 MB
docker.io/registry latest c9bd19d022f6 10 weeks ago 33.27 MB
192.168.200.11:5000/registry latest c9bd19d022f6 10 weeks ago 33.27 MB
192.168.200.11:5000/rancher/agent-instance v0.8.3 6dccaa66a75d 6 months ago 330.9 MB
192.168.200.11:5000/rancher/agent v1.0.2 deb5c6987c83 6 months ago 454.3 MB
192.168.200.11:5000/ubuntu/14.04.3.tar latest ebdc8e295a2e 11 months ago 187.9 MB
(2). 本地资源列表
[root@registry ~]# ll
total 5731924
-rw-r--r-- 1 root root 408046080 Dec 12 01:38mongo_latest.tar
-rw-r--r-- 1 root root 390705152 Dec 12 01:38mysql_latest.tar
-rw-r--r-- 1 root root 346748928 Dec 12 01:38rancher_agent-instance_v0.8.3.tar
-rw-r--r-- 1 root root 471058944 Dec 12 01:39rancher_agent_v1.0.2.tar
-rw-r--r-- 1 root root 10569216 Dec 12 01:39rancher_jenkins-plugins_v0.1.1.tar
-rw-r--r-- 1 root root 883383808 Dec 20 08:48rancher_server_v1.1.4-xd.tar
-rw-r--r-- 1 root root 33918976 Dec 12 01:39 registry_latest.tar
-rw-r--r-- 1 root root 197047296 Dec 12 01:39ubuntu_14.04.3.tar
-rw-r--r-- 1 root root 432752128 Dec 12 01:39wordpress_latest.tar
(3). 上传本地资源到私有仓库
[root@registry ~]# docker load [root@registry ~]# docker tag 86e302671af4192.168.200.11:5000/mongo:latest [root@registry ~]# docker push192.168.200.11:5000/mongo:latest The push refers to a repository[192.168.200.11:5000/mongo] c5be6cad6809: Layer already exists 6d033ab5cf11: Layer already exists 2853db9472d0: Layer already exists b383f648d8e5: Layer already exists 5f521dd41fb0: Layer already exists 718248b95529: Layer already exists 8ba476dc30da: Layer already exists 07c6326a8206: Layer already exists fe4c16cbf7a4: Layer already exists latest: digest:sha256:28feee8c0e5c19325bf09cfa489cd30e1c3a1e574dae8b6c2fb7f468463b6b5c size:2177 (4). 下载私有仓库的镜像 [root@client ~]# docker pull 192.168.200.27:5000/mongo:latest Trying to pull repository192.168.200.27:5000/mongo ... latest: Pulling from 192.168.200.27:5000/mongo 386a066cd84a: Pull complete 524267bc200a: Pull complete 476d61c7c43a: Pull complete 0750d0e28b90: Pull complete c2a78c5fad8e: Pull complete 1cd7ed6205ba: Pull complete 35f9221ee11f: Pull complete 708e45912fb3: Pull complete deca6f1cf04d: Pull complete Digest:sha256:28feee8c0e5c19325bf09cfa489cd30e1c3a1e574dae8b6c2fb7f468463b6b5c Status: Downloaded newer image for 192.168.200.27:5000/mongo:latest (5). 用curl查看仓库中的镜像。 [root@docker ~]# curlhttp://127.0.0.1:2375/images/json | python -m json.tool %Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6781 0 6781 0 0 245k 0 --:--:-- --:--:-- --:--:-- 254k [ { "Created": 1482998541, "Id":"sha256:0c27604c726690da5f7368af31765903bbf196b8e5808c876a2abd25b681a17f", "Labels": null, "ParentId": "", "RepoDigests": null, "RepoTags": [ "odoo:latest" ], "Size": 0, "VirtualSize": 0 }, { "Created": 1482966589, "Id": "sha256:411afb6272fbf5258c421ca5dd10bf212cddb40d78ac3962114b67bb78cc7c62", "Labels": {}, "ParentId": "", "RepoDigests": [ "docker.io/python@sha256:05d7f756d1980a83ca7419109334a6df47824e02eae93996c3d201f96baf7cf3" ], "RepoTags": [ "docker.io/python:latest" ], "Size": 687122335, "VirtualSize": 687122335 },[root@docker ~]# curlhttp://127.0.0.1:2375/images/json | python -m json.tool %Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6781 0 6781 0 0 245k 0 --:--:-- --:--:-- --:--:-- 254k [ { "Created": 1482998541, "Id":"sha256:0c27604c726690da5f7368af31765903bbf196b8e5808c876a2abd25b681a17f", "Labels": null, "ParentId": "", "RepoDigests": null, "RepoTags": [ "odoo:latest" ], "Size": 0, "VirtualSize": 0 }, { "Created": 1482966589, "Id":"sha256:411afb6272fbf5258c421ca5dd10bf212cddb40d78ac3962114b67bb78cc7c62", "Labels": {}, "ParentId": "", "RepoDigests": [ "docker.io/python@sha256:05d7f756d1980a83ca7419109334a6df47824e02eae93996c3d201f96baf7cf3" ], "RepoTags": [ "docker.io/python:latest" ], "Size": 687122335, "VirtualSize": 687122335 }, Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor),用户可以直接使用它们来进行开发或生产部署。 在 config_sample.yml 文件中,可以看到一些现成的模板段: common:基础配置 local:存储数据到本地文件系统 s3:存储数据到 AWSS3 中 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: [email protected] to_addr: [email protected] dev: loglevel: debug storage: local storage_path: /home/myself/docker test: storage: local storage_path: /tmp/tmpdockertmp3.1.5库配置文件