欢迎您, 来到 宁时修博客.^_^

Docker系列7--仓库

2018/11/18 林木立 Docker 736
Docker容器技术

一、仓库基础

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

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

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

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

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


二、Docker Registry 公开服务 -- Docker Hub

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

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

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


    Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过15,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

    在 https://cloud.docker.com 免费注册一个 Docker 账号。

    通过执行  docker login  命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub。

    通过  docker logout  退出登录。


    搜索和下载镜像

    通过  docker search  命令来查找官方仓库中的镜像,并利用  docker pull  命令来将它下载到本地。

$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   4927                [OK]                
ansible/centos7-ansible            Ansible on Centos7                              119                                     [OK]
.........

    关键字包括镜像名字、描述、收藏数(表示该镜像的受关注程度)、是否官方创建、是否自动创建。

    镜像资源分为两类:

    一种是类似  centos  这样的镜像,被称为基础镜像或根镜像。这些基础镜像由Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。

    还有一种类型,比如  tianon/centos  镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀  username/  来指定使用某个用户提供的镜像,比如 tianon 用户。


    在查找的时候通过  --filter=stars=N  参数可以指定仅显示收藏数量为 N  以上的镜像。


    推送镜像

    用户在登录后通过  docker push  命令来将自己的镜像推送到 Docker Hub。

    以下命令中的  username  请替换为你的 Docker 账号用户名:

$ docker tag ubuntu:17.10 username/ubuntu:17.10
$ docker push username/ubuntu:17.10


    自动创建

    自动创建(Automated Builds)功能对于需要经常升级镜像内程序来说,十分方便。

    有时候,用户创建了镜像,安装了某个软件,如果软件发布新版本则需要手动更新镜像。

    而自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub或 BitBucket)上的项目,一旦项目发生新的提交或者创建新的标签(tag),Docker Hub 会自动构建镜像并推送到 Docker Hub 中。

    配置自动创建,包括如下的步骤:

        创建用户并登录 Docker Hub,以及目标网站;

        在目标网站中连接帐户到 Docker Hub;

        在 Docker Hub 中 配置一个自动创建;

        选取一个目标网站中的项目(需要含  Dockerfile  )和分支;

        指定  Dockerfile  的位置,并提交创建。

    之后,可以在 Docker Hub 的 自动创建页面 中跟踪每次创建的状态。



三、私有 Docker Registry

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

    

    安装运行 docker-registry

    通过获取官方  registry  镜像来运行:

docker run -d -p 5000:5000 --restart=always --name registry registry


    用官方的  registry  镜像来启动私有仓库。默认情况下,仓库会被创建在容器的  /var/lib/registry  目录下。你可以通过  -v  参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的/opt/data/registry  目录。

docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry



    在私有仓库上传、搜索、下载镜像

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

    使用  docker tag  将  ubuntu:latest  这个镜像标记为127.0.0.1:5000/ubuntu:latest。

$ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
$ docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
127.0.0.1:5000/ubuntu   latest              ea4c82dcd15a        4 weeks ago         85.8MB
ubuntu                  latest              ea4c82dcd15a        4 weeks ago         85.8MB


    使用  docker push  上传标记的镜像:

$ docker push 127.0.0.1:5000/ubuntu:latest
The push refers to repository [127.0.0.1:5000/ubuntu]
76c033092e10: Pushed 
2146d867acf3: Pushed 
ae1f631f14b7: Pushed 
102645f1cf72: Pushed 
latest: digest: sha256:6b9eb699512656fc6ef936ddeb45ab25edcd17ab94901790989f89dbf782344a size: 1150


    用curl查看仓库中的镜像:

$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["ubuntu"]}

    看到  {"repositories":["ubuntu"]}  ,表明镜像已经被成功上传了。

    先删除已有镜像,再尝试从私有仓库中下载这个镜像:

docker image rm 127.0.0.1:5000/ubuntu:latest
docker image ls
docker pull 127.0.0.1:5000/ubuntu:latest
docker image ls

    

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

    这是因为 Docker 默认不允许非  HTTPS  方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者配置能够通过  HTTPS  访问的私有仓库。

    Ubuntu 16.04+, Debian 8+, centos 7,请在  /etc/docker/daemon.json  中写入如下内容(如果文件不存在请新建该文件):

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

    保存文件,然后重启Docker。

    在其他Docker服务器上,需要先创建改文件,文件内容也是上面的内容,然后重启Docker。

$ vim /etc/docker/daemon.json
{
    "registry-mirror": [
      "https://registry.docker-cn.com"
    ],
    "insecure-registries": [
      "192.168.184.36:5000"
    ]
}

$ systemctl restart docker
$ docker pull 192.168.184.36:5000/ubuntu:latest
latest: Pulling from ubuntu
473ede7ed136: Pull complete 
c46b5fa4d940: Pull complete 
93ae3df89c92: Pull complete 
6b1eed27cade: Pull complete 
Digest: sha256:6b9eb699512656fc6ef936ddeb45ab25edcd17ab94901790989f89dbf782344a
Status: Downloaded newer image for 192.168.184.36:5000/ubuntu:latest

$ docker image ls
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
192.168.184.36:5000/ubuntu   latest              ea4c82dcd15a        4 weeks ago         85.8MB


    列出仓库镜像标签

$ curl http://192.168.184.36:5000/v2/ubuntu/tags/list
{"name":"ubuntu","tags":["latest"]}




点赞
说说你的看法

所有评论: (1)