点击上方蓝色字关注 [ 啃饼思录 ]~

Docker仓库

2ed194ccd0774f14060a51a78f000f2a.gif

写在前面

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文件,可以看到信息如下所示:

1698090d2505fc86f53b47c88b188fba.png

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

搜索镜像

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

5bced84d23268aaee46eab4b6d50d9f4.png

在前面学习镜像的时候,就已经知道如何使用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为了进行说明:

90123c0053b87d933529c0e1d5754971.png
查看镜像

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

下载镜像

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

docker pull [image] http://f1361db2.m.daocloud.io//:

但是每次都需要在命令后面添加注册服务器地址是一件非常令人头疼的事,因此可以使用镜像代理服务来加速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来搭建私有化的容器镜像仓库。

24af24989b57399ed894762d8649134f.png 啃饼思录

微信ID:kbthinking

1bcf7b6358fc6afcf6933730d95b3f7b.png

1.点击历史信息,查看更多内容

2.按右侧二维码,关注啃饼思录

3c1706ae578718e90c629ce0525657e8.png

长按二维码关注

d292771adf090db63a36c06701d4a792.png

THANK YOU

d13e423812a2dbbf74ab62fbfa165109.png
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐