Day03_05_Docker教程之Docker仓库

Docker仓库

一. Docker仓库概述

仓库(Repository)是集中存放镜像的地方.
一个容易混淆的概念是注册服务器(Registry).实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像.从这方面来说,仓库可以被认为是一个具体的项目或目录.例如对于仓库地址 dl.dockerpool.com/ubuntu 来说,dl.dockerpool.com 是注册服务器地址,ubuntu 是仓库名.

大部分时候,并不需要严格区分这两者的概念。

镜像构建完成后,可以很容易的在当前宿主机上运行.但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务.

一个 Docker Registry 中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像.

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04,18.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。

仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

二. 公有 Docker Registry

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务。

由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。

国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库 等。

三. 私有 Docker Registry

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。

开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。

除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor 和 Sonatype Nexus。

四. 搭建 Docker 私有仓库

1. 为什么需要搭建私有仓库?

官方的Docker Hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候,我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像.docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库.

1️⃣.项目需要,不希望将项目放到 docker hub 上;
2️⃣.环境需求,考虑网络、效率的问题,希望在私有服务器上建立自用的仓库,提高便利性和访问速度;
3️⃣.可以做更多的个性化配置.

Registry在Github上有两份代码: 老代码库和新代码库.老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发.从2.0版本开始就到在新代码库进行开发,新代码库是采用go语言编写,修改了镜像id的生成算法、registry上镜像的保存结构,大大优化了pull和push镜像的效率.所以本文内容基于 docker-registry v2.x 版本.

官方在Docker hub上提供了registry的镜像,我们可以直接使用该registry镜像来构建一个容器,搭建我们自己的私有仓库服务.Tag为latest的registry镜像是0.9.1版本的,我们直接采用2.1.1版本.

2. Registry私有仓库的部署搭建实现

2.1 获取registry镜像

$ sudo docker pull registry:2.1.1

2.2 启动一个容器

#Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/usr/local/docker/registry目录挂载到该目录,即可实现将镜像保存到主机的/usr/local/docker/registry目录了.

$ sudo docker run -d -v /usr/local/docker/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1

2.3 查看容器情况

sudo docker ps 

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f3766397a458        registry:2.1.1      "/bin/registry /etc/d"   46 seconds ago      Up 45 seconds       0.0.0.0:5000->5000/tcp   registry

说明我们已经启动了registry服务,打开浏览器输入http://127.0.0.1:5000/v2,出现下面情况说明registry运行正常.
Day03_05_Docker教程之Docker仓库_第1张图片

3. 验证

现在我们通过将镜像push到registry来验证一下.

3.1 打标志推送到私有仓库

创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库.例如私有仓库地址为 127.0.0.1:5000 .

格式为:
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

我的机器上有个hello-world的镜像,我们先通过docker tag命令将该镜像标志为要推送到私有仓库.

$ sudo docker tag hello-world   127.0.0.1:5000/hello-world

3.2 查看本地镜像

$ sudo docker images

REPOSITORY                   TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry                     2.1.1               b91f745cd233        5 days ago          220.1 MB
ubuntu                       14.04               a5a467fddcb8        6 days ago          187.9 MB
hello-world                  latest              975b84d108f1        2 weeks ago         960 B
127.0.0.1:5000/hello-world   latest              975b84d108f1        2 weeks ago         960 B

3.3 push到私有仓库

接下来,我们运行docker push将hello-world镜像push到我们的私有仓库中.

$ sudo docker push 127.0.0.1:5000/hello-world

The push refers to a repository [127.0.0.1:5000/hello-world] (len: 1)
975b84d108f1: Image successfully pushed 
3f12c794407e: Image successfully pushed 
latest: digest: sha256:1c7adb1ac65df0bebb40cd4a84533f787148b102684b74cb27a1982967008e4b size: 2744

3.4 浏览器验证

现在我们可以查看我们本地/usr/local/docker/registry目录下已经有了刚推送上来的hello-world.我们在浏览器中输入http://127.0.0.1:5000/v2/_catalog,如下图所示.
Day03_05_Docker教程之Docker仓库_第2张图片

3.5 删除已有的镜像

接下来我们可以先将我们本地的127.0.0.1:5000/hello-world和hello-world删除掉.

$ sudo docker rmi hello-world
$ sudo docker rmi 127.0.0.1:5000/hello-world

3.6 从私有仓库拉取镜像

然后使用docker pull命令从我们的私有仓库中获取hello-world镜像.

$ sudo docker pull 127.0.0.1:5000/hello-world

Using default tag: latest
latest: Pulling from hello-world
b901d36b6f2f: Pull complete 
0a6ba66e537a: Pull complete 
Digest: sha256:1c7adb1ac65df0bebb40cd4a84533f787148b102684b74cb27a1982967008e4b
Status: Downloaded newer image for 127.0.0.1:5000/hello-world:latest
lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry                     2.1.1               b91f745cd233        5 days ago          220.1 MB
ubuntu                       14.04               a5a467fddcb8        6 days ago          187.9 MB
127.0.0.1:5000/hello-world   latest              0a6ba66e537a        2 weeks ago         960 B

4. 可能存在的问题

可能会出现无法push镜像到私有仓库的问题.这是因为我们启动的registry服务不是安全可信赖的.这是我们需要修改docker的配置文件/etc/default/docker,添加下面的内容.

DOCKER_OPTS="--insecure-registry xxx.xxx.xxx.xxx:5000"

然后重启docker后台进程.

$ sudo service docker restart

然后再push一次即可.

五. 注意事项

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库,你就得把例如 192.168.199.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

这是因为 Docker 默认不允许非 HTTPS 方式推送镜像.我们可以通过 Docker 的配置选项来取消这个限制,请查看下一节的内容,配置可以通过HTTPS 访问的私有仓库.

1. Ubuntu 14.04, Debian 7 Wheezy系统

对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中增加如下内容:

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com --insecure-registries=192.168.199.100:5000"

重新启动服务.

$ sudo service docker restart

2. Ubuntu 16.04+, Debian 8+, centos 7系统

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [
    "192.168.199.100:5000"
  ]
}

注意: 该文件必须符合 json 规范,否则 Docker 将不能启动.

3. 其他

对于 Docker for Windows 、 Docker for Mac 在设置中编辑 daemon.json 增加和上边一样的字符串即可.
 

你可能感兴趣的:(Docker,容器化,Linux)