Docker仓库

写在前面

Docker三个核心概念已经详细学习了前两个,接下来学习第三个概念---仓库(Repository)。仓库是集中存放镜像的地方,它分为公共仓库和私有仓库。注意仓库(Repository)和注册服务器(Registry)两者是不同的,实际上注册服务器是存放仓库的具体服务器,一个注册服务器上可以有多个仓库,每个仓库下面有多个镜像,因此你完全可以将仓库理解为是注册服务器上的一个具体的项目或目录。举个例子,对于地址为private-docker.com/ubuntu的仓库来说,前面的private-docker.com是注册服务器地址;后者的ubuntu是仓库名称。通过上面的简单介绍,相信开发者已经对仓库和注册服务器有了基本的认识。在本文中将介绍如何使用Docker Hub官方仓库进行登录、下载、上传等操作,如何使用国内社区提供的仓库来下载镜像,创建和使用私有仓库的相关操作。

Docker Hub官方仓库

Docker Hub是Docker官方提供的最大公共镜像仓库。一般来说,开发者需要的镜像都可以在Docker Hub官方仓库上找得到并直接下载。

登录

开发者可以执行docker login命令来输入用户名、密码和邮箱来完成注册和登录功能。注意注册成功后会在本地用户目录下自动创建.docker/config.json文件,该文件用于保存用户的认证信息,这样后续就可以直接登录:

[root@envythink ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: licheetools
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

查看一下这个/root/.docker/config.json文件,可以看到信息如下所示:

这样登录成功的用户就可以上传自己制作的镜像到Docker Hub官方仓库中。

搜索镜像

请注意搜索镜像是不需要用户登录的,开发者可以使用docker search [image]命令来查找官方仓库中的镜像,并使用docker pull [image]命令来下载镜像到本地:

在前面学习镜像的时候,就已经知道如何使用docker search [image]命令来搜寻镜像。这里举个例子,如需要查找名称为deepin的镜像,使用的命令为:

[root@envythink ~]# docker search deepin
NAME                                            DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
x11docker/deepin                                Deepin desktop from China. Based on bestwu/d…   16                                      [OK]
deepin/deepin-core                              Deepin server base images                       8                                       [OK]
......

可以看到里面有一个OFFICIAL关键字,因此根据OFFICIAL可以将其分为官方镜像和扩展镜像。

官方镜像如ubuntu等,这种一般是基础镜像,也称为根镜像。这些镜像是由Docker公司创建、验证、支持、提供的,且这种镜像往往使用单个单词作为名字;

扩展镜像如bestwu/deepin等,是由Docker用户bestwu创建并维护的,带有用户名称为前缀,表明是某个用户下的某仓库。开发者可以通过用户名称前缀user_name/镜像名来指定使用某个用户提供的镜像。

举个例子,现在我们需要将这个bestwu/deepin镜像下载到本地,只需使用docker pull bestwu/deepin命令即可下载到本地。用户也可以在登录后通过使用docker push [image]命令来将本地镜像推送到Docker Hub官方仓库。

自动创建

自动创建(Automated Builds)是Docker Hub提供的自动化服务,它可以自动跟随项目代码的变更而重新构建镜像。

举个例子,假设用户构建了某应用镜像,如果应用发布新版本,那么正常情况下需要用户手动来更新镜像。而如果使用自动创建,那么它允许用户通过Docker Hub来指定跟踪一个目标网站(目前支持GitHub和BitBucket)上的项目,一旦项目发生新的提交,那么就会自动执行创建。

那么问题来了,我们应该如何配置自动创建呢?通常有以下5个步骤:(1)创建并登陆Docker Hub和待跟踪的目标网站如GitHub;(2)待跟踪的目标网站如GitHub,必须允许Docker Hub来访问服务;(3)在Docker Hub中配置一个需要使用“自动创建”的项目;(4)选取一个目标网站中的项目(注意需要包含Dockerfile)和分支;(5)指定Dockerfile的位置并提交创建。通过以上5个步骤的操作,之后就可以在Docker Hub的“自动创建”页面中跟踪每次创建的状态。

国内第三方镜像市场

国内也有一些第三方的镜像市场,像腾讯云、阿里云、网易云等,但是笔者最常使用的是DaoCloud,因此这里以DaoCloud为了进行说明:

查看镜像

开发者可以直接访问DaoCloud,往下拉就能看到已经存在的仓库和存储镜像,包括Minecraft、Python、Nginx等热门仓库和镜像。

下载镜像

请注意,之前我们使用docker pull [image]命令来下载镜像其实后面是省略了仓库名称和注册服务器的地址,因为默认是从Docker Hub官方仓库下载。但是这里是从DaoCloud镜像市场下载,因此需要在其后面添加注册服务器地址,此时下载镜像命令变为:

docker pull [image] http://f1361db2.m.daocloud.io/<namespace>/<repository>:<tag>

但是每次都需要在命令后面添加注册服务器地址是一件非常令人头疼的事,因此可以使用镜像代理服务来加速Docker镜像的获取过程。CentOS系统只需在/etc/docker/daemon.json文件中添加一行配置即可,如下所示:

{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}

当然也可以在启动配置参数中添加--registry-mirror=proxy_URL来指定镜像代理服务器地址,这样直接使用docker pull命令其实就是从DaoCloud镜像市场中下载。

搭建本地私有仓库

使用registry镜像创建私有仓库

安装完Docker后,开发者可以使用官方提供的registry镜像来简单搭建一套本地私有仓库环境,命令如下所示:

[root@envythink ~]# docker run -d -p 5000:5000 registry:2

其中的docker run就是运行容器,-d表示创建出来的容器在后台去运行,-p是端口映射,5000:5000以冒号为界,前面是宿主机的端口,后面是容器的端口,就是把宿主机的5000端口映射到容器的5000端口,而registry:2表示使用名称为registry且tag为2的镜像。执行上述命令就会自动下载并启动一个registry容器,进而创建本地的私有仓库服务。但是默认情况下,该仓库会被创建在容器的var/llib/registry目录下。

其实我们可以在执行上述命令的时候,通过使用-v参数来将容器内的指定目录映射到宿主机本地的指定路径,关于路径映射会在下一篇文章中进行介绍,这里了解就行。

举个例子,使用registry:2镜像来搭建一个本地私有仓库,要求其在后台运行,且将宿主机的5000端口映射到该运行容器的5000端口,同时将宿主机的/opt/data/registry目录映射到容器的/var/lib/registry目录,此时使用的命令为:

[root@envythink ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry:2
daeea681e14c759368edc865b687e663cf920afcb843e2c02e58226e7b856182
[root@envythink ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
daeea681e14c        registry:2          "/entrypoint.sh /etc…"   27 seconds ago      Up 25 seconds       0.0.0.0:5000->5000/tcp   intelligent_euler

这样就会在本地启动一个监听端口为5000的私有仓库服务。

管理私有仓库

前面我们已经在虚拟机内搭建了一个监听端口为5000的私有仓库,虚拟机地址为192.168.31.101,因此该私有仓库地址为http://192.168.31.101:5000,接下来我们就尝试在虚拟机内(Centos7)测试上传和下载镜像功能。

首先查看一下在这个Centos7内存在的所有镜像:

[root@envythink ~]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
example/ubuntu                   v1.0                8f60b46a2816        12 hours ago        72.9MB
registry                         2                   2d4f4b5309b1        4 months ago        26.2MB

接着使用systemctl stop firewalld命令来关闭宿主机的防火墙。然后使用docker tag命令将example/ubuntu:v1.0镜像标记为192.168.31.101:5000/envythink:v1.0,也就是其格式必须为docker tag IMAGE[:TAG] [REGISTRYHOST/][USRNAME/]NAME[:TAG],如下所示:

[root@envythink ~]# docker tag example/ubuntu:v1.0 192.168.31.101:5000/envythink:v1.0
[root@envythink ~]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
192.168.31.101:5000/envythink    v1.0                8f60b46a2816        12 hours ago        72.9MB
example/ubuntu                   v1.0                8f60b46a2816        12 hours ago        72.9MB
registry                         2                   2d4f4b5309b1        4 months ago        26.2MB

接着再使用docker push命令来将之前标记的镜像进行上传,你会发现提示下面的错误信息:

[root@envythink ~]# docker push 192.168.31.101:5000/envythink:v1.0
The push refers to repository [1192.168.31.101:5000/envythink:v1.0]
Get https://192.168.31.101:5000/v2/: http: server gave HTTP response to HTTPS client

请注意由于笔者Docker使用的是19.03.13版本,对安全性要求较高,要求仓库支持SSL/TLS证书。此处因为是内部使用的私有仓库,因此可以自行配置证书或者关闭对仓库的安全性检查,这里就选择不使用https这种传输方式,所以使用vi /etc/docker/daemon.json命令来编辑docker配置文件,然后将"insecure-registries":["192.168.31.101"]这行代码添加到JSON信息的另一行(里面的IP是宿主机的地址),如下所示:

{
  "registry-mirrors": ["https://xwiu9ci3.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.31.101:5000"]
}

之后依次执行下面两条命令来重新启动Docker:

[root@envythink ~]# systemctl daemon-reload
[root@envythink ~]# systemctl restart docker

接下来就使用docker start命令来启动之前使用registry镜像创建的私有仓库,然后再次使用docker push命令来将之前标记的镜像上传到私有仓库中:

[root@envythink ~]# docker push 192.168.31.101:5000/envythink:v1.0
The push refers to repository [192.168.31.101:5000/envythink]
d9d45faca0a6: Pushed 
v1.0: digest: sha256:b263df38f4e682601cae6087c346df156a1c24d0aa5d0bb0206ffb331d505afb size: 528

之后开发者可以将本地名为192.168.31.101:5000/envythink:v1.0的镜像给删除掉,然后再使用docker pull命令来从私有仓库中下载该镜像到本地:

[root@envythink ~]# docker pull 192.168.31.101:5000/envythink:v1.0
v1.0: Pulling from envythink
Digest: sha256:b263df38f4e682601cae6087c346df156a1c24d0aa5d0bb0206ffb331d505afb
Status: Downloaded newer image for 192.168.31.101:5000/envythink:v1.0
192.168.31.101:5000/envythink:v1.0

之后就可以为它添加一个通用的标签envy/ubuntu:latest,这样方便后续使用:

[root@envythink ~]# docker tag 192.168.31.101:5000/envythink:v1.0 envy/ubuntu:latest
[root@envythink ~]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
192.168.31.101:5000/envythink    v1.0                8f60b46a2816        12 hours ago        72.9MB
envy/ubuntu                      latest              8f60b46a2816        12 hours ago        72.9MB

前面我们是直接不使用https传输方式,如果要使用https传输方式,那么就需要使用安全证书,开发者可以从知名的CA服务商,如verisign申请公开的SSL/TLS证书,也可以使用OpenSSL等软件来自行生成。

在企业的生产环境中,往往使用私有仓库来维护内部镜像,不过这里只是简单的搭建了而已,还没有较为详细的介绍其相关配置,这个后续会介绍。当然除了使用官方提供的registry项目外,还可以使用其他的开源方案,如nexus来搭建私有化的容器镜像仓库。

本文分享自微信公众号 - 啃饼思录(kbthinking),作者:i思录

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker 仓库

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

    happyJared
  • docker 仓库

    Docker Hub 是docker官方维护了一个公共仓库,大部分需求都可以在Docker Hub上直接下载镜像

    dogfei
  • docker--docker仓库

    Docker仓库(Repository)类似与代码仓库,是Docker集中存放镜像文件的地方。

    eadela
  • Docker 仓库 Harbor

    之前写过两篇关于Docker仓库的文章,把Docker镜像装到仓库需要几步? 与 没有Docker仓库还能分发镜像吗? 。

    用户1560186
  • Docker 仓库使用

    登录需要输入用户名和密码,登录成功后,可以从 docker hub 上拉取自己账号下的全部镜像。

    李小白是一只喵
  • 5.docker仓库--harbor

    harbor就是一个类似于hub.docker.com的仓库. 这是我们自己搭建的一个仓库, 如果公司使用, 不可能把镜像都上传到hub.docker.com上...

    用户7798898
  • Docker 仓库管理

    仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。

    用户1685462
  • 011.Docker仓库管理

    docker 仓库,即 registry,实现了镜像的管理、分发,同时还包括用户的认证。docker registry 仓库是一个无状态的、高可靠的服务器应用程...

    木二
  • 玩转Docker仓库-Docker Registry及Harbor

    Docker Hub是Docker官方提供的公共仓库,需要我们注册一个Docker账号进行使用,注册地址:

    行百里er
  • 自建私有docker仓库-Harbor

    Harbor 是由 VMware 公司中国团队为企业用户设计的 Registry server 开源项目,包括了权限管理(RBAC)、LDAP、审计、管理界面、...

    Eric杂货铺
  • 搭建Harbor企业级docker仓库 转

    Harbor是一个开源的可信云本机注册表项目,用于存储,签名和扫描内容。Harbor通过添加用户通常需要的功能(如安全性,身份和管理)来扩展开源Docker D...

    wuweixiang
  • 使用 Harbor 搭建私有 Docker 仓库

    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

    soulteary
  • 使用 Harbor 搭建私有 Docker 仓库

    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

    soulteary
  • 02 . DockerFile构建镜像和Docker仓库

    注意: Dockerfile的指令是每执行一次都会在docker上新建一层,所以过多无意义的层,会造成镜像膨胀过大,上面提到过,可以用&&符号链接命令,这样执行...

    常见_youmen
  • 没有Docker仓库还能分发镜像吗?

    首先明确的是建议优先使用Docker仓库,特别是对于Docker集群而言 Docker仓库非常重要,但是某些应用场景下比如单机环境下使用docker-comps...

    用户1560186
  • 四、docker 仓库(让我们的镜像有处可存)

    前面讲完了docker 镜像和容器,以及通过Dockerfile 定制属于我们自己的镜像,那那现在就是需要将我们自己定制的镜像存放到仓库中供他们使用。这一套流程...

    程序员爱酸奶
  • SSL及Nginx代理搭建环境的Docker仓库

    使用私有仓库有许多优点:节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;提供镜像资源利用,针对于公司内部使用的镜像,推...

    SDNLAB
  • 微服务--使用Nexus Repository Manager 3.0搭建私有Docker仓库

    下载最新的Nexus Repository Manager 3.0, https://help.sonatype.com/repomanager3/downlo...

    拓荒者
  • Docker镜像仓库

    Tinywan

扫码关注云+社区

领取腾讯云代金券