学而实习之 不亦乐乎

Docker 访问仓库

2023-09-12 07:58:31

在 Docker 中仓库 (Repository) 是集中存放镜像的地方,又分公共仓库和私有仓库。有时候容易把仓库与注册服务器 (Registry) 混淆。实际上注册服务器是存放仓库的具体服务器,一个注册服务器上可以有多个仓库,而每个仓库下面可以有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 private-docker.com/ubuntu 来说, private-docker.com 是注册服务器地址, ubuntu 是仓库名。

一、 Docker Hub 公共镜像市场

Docker Hub 是 Docker 官方提供的最大的公共镜像仓库,地址为 https://hub.docker.com 。大部分对镜像的需求,都可以通过在 Docker Hub 中直接下载镜像来实现。

1、 登录

通过命令 docker login 来输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录下会自动创建 .docker/config.json 文件,保存用户的认证信息。

登录成功的用户可以上传个人制作的镜像到 Docker Hub

2、基本操作

用户无须登录即可通过 docker search 命令来查找官方仓库中的镜像,并利用 docker [image] pull 命令来将它下载到本地。

根据是否为官方提供,可将这些镜像资源分为两类:

  1. 一种是类似于 centOS 这样的基础镜像,也称为根镜像。这些镜像是由 Docker 公司创建、验证、支持、提供,这样的镜像往往使用单个单词作为名字;
  2. 另一种类型的镜像,比如 ansible/centos7-ansible 镜像,是由 Docker 用户 ansible 创建并维护的,带有用户名称为前缀,表明是某用户下的某仓库。可以通过用户名称前缀 “user_name/镜像名” 来指定使用某个用户提供的镜像。

用户也可以在登录后通过 docker push 命令来将本地镜像推送到 Docker Hub;

3. 自动创建

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

例如,用户构建了某应用镜像,如果应用发布新版本,用户需要手动更新镜像。而自动创建则允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub BitBucket)的项目,一旦项目发生新的提交,则自动执行创建。

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

  1. 创建并登录 Docker Hub, 以及目标网站如 Github;
  2. 在目标网站中允许 Docker Hub 访问服务;
  3. Docker Hub 中配置一个“自动创建”类型的项目;
  4. 选取一个目标网站中的项目(需要含 Dockerfile) 和分支;
  5. 指定 Dockerfile 的位置,并提交创建。

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

二、第三方镜像市场

国内不少云服务商都提供了 Docker 镜像市场,包括腾讯云、网易云、阿里云等。

1、查看镜像

访问第三方官网,可以看到很多镜像。

2、 下载镜像

下载镜像也是使用 docker pull 命令,但是要在镜像名称前添加注册服务器的具体地址。格式为 index.xxx.com/<namespace>/<repository>:<tag>

例如,要下载 Docker 官方仓库中的 node:latest 镜像,可以使用如下命令:

# docker pull index.xxx.com/docker_library/node:latest

正常情况下,镜像下载会比直接从 Docker Hub 下载快得多。

通过 docker images 命令来查看下载到本地的镜像:

# docker images
... ...

下载后,可以更新镜像的标签,与官方标签保持一致,方便使用:

# docker tag index.xxx.com/docker_library/node:latest

三、搭建本地私有仓库

1、使用 registry 镜像创建私有仓库

安装 Docker 后,可以通过官方提供的 registry 镜像来简单搭建一套本地私有仓库环境:

# docker run -d -p 5000:5000 registry:2

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

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

此时,在本地将启动一个私有仓库服务,监听端口为5000

2、管理私有仓库

假设本地环境的计算机 (Linux Mint) 搭建私有仓库,查看其地址为 10.0.2.2:5000, 然后在虚拟机系统 (Ubuntu 18.04) 里测试上传和下载镜像。

在 Ubuntu 18.04 系统查看已有的镜像:

# docker images
REPOS TORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 18.04 452a96d8lc30 6 weeks ago 79.6 MB

使用 docker tag 命令将这个镜像标记为 10.0.2.2:5000/test(格式为 docker tag IMAGE [TAG] [REGISTRYHOST/][USERNAME/]NAME[TAG])。

$ docker tag ubuntu:18.04 10.0.2.2:5000/test
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
Ubuntu 18.04 452a96d8lc30 6 weeks ago 79.6 MB
10.0.2.2:5000/tes la es 452a96d8lc30 6weeks ago 79.6MB

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

$ docker push 10.0.2.2:5000/test
The push refers a repository [10.0.2.2:5000/test] (len: 1)
Sending image list
Pushing reposi ory···
... ...

curl 查看仓库 10.0.2.2:5000 中的镜像:

$ curl http://10.0.2.2:5000/v2/search

在结果中可以看到 {"description":"", "name":"library/test"},表明镜像已经成功上传了。现在可以到任意一台能访问到 10.0.2.2 地址的机器去下载这个镜像了。

比较新的 Docker 版本对安全性要求较高,会要求仓库支持 SSL/TLS 证书。对于内部使用的私有仓库,可以自行配置证书或关闭对仓库的安全性检查。

首先,修改 Docker daemon 的启动参数,添加如下参数,表示信任这个私有仓库,不进行安全证书检查:

DOCKER_OPTS="--insecure-registry 10.0.2.2:5000"

之后重启 Docker 服务,并从私有仓库中下载镜像到本地:

$ sudo service docker restart
$ docker pull 10.0.2.2:5000/test
Pulling repository 10.0.2.2:5000/test
452a96d81c30: Download complete
511136ea3c5a: Download complete
9bad880da3d2: Download complete
25fllf5fb0cb: Download complete
ebc34468f71d: Download complete
2318d26665ef: Download complete

$ docker images
REPOSITORY TAG MAGE ID CREATED VIRTUAL SIZE
10.0.2.2:5000/test latest 452a96d8lc30 6 weeks ago 79.6MB

下载后,还可以添加一个更通用的标签 ubuntu:18.04, 方便后续使用:

$ docker tag 10.0.2.2:5000/test ubuntu:18.04

注意:如果要使用安全证书,用户也可以从较知名的 CA 服务商(如 verisign)申请公开的 SSL/TLS 证书,或者使用 OpenSSL 等软件来自行生成。