05 | 仓库访问

如何更好地存储和分发镜像呢,Docker的镜像仓库。
我们不仅可以使用公共镜像仓库存储和分发镜像,也可以自己搭建私有的镜像仓库

仓库是什么?

仓库(Repository)是存储和分发Docker镜像的地方。Docker Hub 是用来提供 Docker 镜像存储和分发的地方。

注册服务器(Registry)和仓库(Repository)。注册服务器是存放仓库的实际服务器,而仓库则可以被理解为一个具体的项目或者目录;注册服务器可以包含很多个仓库,每个仓库又可以包含多个镜像。例如我的镜像地址为 docker.io/centos,docker.io 是注册服务器,centos 是仓库名。 它们之间的关系如图 1 所示。

jcenter仓库 “仓库.io”_推送

公共镜像仓库

公共镜像仓库一般是 Docker 官方或者其他第三方组织(阿里云,腾讯云,网易云等)提供的,允许所有人注册和使用的镜像仓库。

Docker Hub 是全球最大的镜像市场,目前已经有超过 10w 个容器镜像,这些容器镜像主要来自软件供应商、开源组织和社区。大部分的操作系统镜像和软件镜像都可以直接在 Docker Hub 下载并使用。

我们首先访问Docker Hub官网,点击注册按钮进入注册账号界面。注册完成后,我们可以点击创建仓库,新建一个仓库用于推送镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PIKe5b2F-1602229727946)(./img/docker创建镜像仓库.png)]

下面通过一个实例来演示一下如何推送镜像到自己的仓库中。

首先我们使用以下命令拉取 busybox 镜像:

docker pull busybox

在推送镜像仓库前,我们需要使用docker login命令先登录一下镜像服务器,因为只有已经登录的用户才可以推送镜像到仓库。

$ 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: gavinhu04
Password:
Login Succeeded

docker login命令默认会请求 Docker Hub,如果你想登录第三方镜像仓库或者自建的镜像仓库,在docker login后面加上注册服务器即可。例如我们想登录访问阿里云镜像服务器,则使用docker login registry.cn-beijing.aliyuncs.com,输入阿里云镜像服务的用户名密码即可。

在本地镜像推送到自定义仓库前,我们需要先把镜像“重命名”一下,注意必须使用自己的docker用户名(gavinhu04),才能正确推送到自己创建的镜像仓库中,使用docker tag命令将镜像“重命名”:

docker tag busybox gavinhu04/busybox

镜像“重命名”后使用docker push命令就可以推送镜像到自己创建的仓库中了。

docker push gavinhu04/busybox

搭建私有仓库

启动本地仓库

Docker 官方提供了开源的镜像仓库 Distribution,并且镜像存放在 Docker Hub 的 Registry 仓库下供我们下载。

我们可以使用以下命令启动一个本地镜像仓库:

$ docker run -d -p 5000:5000 --name registry registry:2.7

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d7e449a8a93e        registry:2.7        "/entrypoint.sh /etc…"   50 seconds ago      Up 49 seconds       0.0.0.0:5000->5000/tcp   registry

此时我们就拥有了一个私有镜像仓库,访问地址为localhost,端口号为 5000。

推送镜像到本地仓库

我们依旧使用 busybox 镜像举例。首先我们使用docker tag命令把 busybox 镜像"重命名"为localhost:5000/busybox

$ docker tag busybox localhost:5000/busybox

此时 Docker 为busybox镜像创建了一个别名localhost:5000/busybox,localhost:5000为主机名和端口,Docker 将会把镜像推送到这个地址。

使用docker push推送镜像到本地仓库:

$ docker push localhost:5000/busybox
The push refers to repository [localhost:5000/busybox]
514c3a3e64d4: Layer already exists
latest: digest: sha256:400ee2ed939df769d4681023810d2e4fb9479b8401d97003c710d0e20f7c49c6 size: 527

此时,我们验证一下从本地镜像仓库拉取镜像。

$ docker pull localhost:5000/busybox
Using default tag: latest
latest: Pulling from busybox
Digest: sha256:400ee2ed939df769d4681023810d2e4fb9479b8401d97003c710d0e20f7c49c6
Status: Downloaded newer image for localhost:5000/busybox:latest
localhost:5000/busybox:latest

使用docker image ls busybox命令查看一下本地busybox镜像:

$ docker image ls busybox
持久化镜像存储

我们知道,容器是无状态的。上面私有仓库的启动方式可能会导致镜像丢失,因为我们并没有把仓库的数据信息持久化到主机磁盘上,这在生产环境中是无法接受的。下面我们使用以下命令将镜像持久化到主机目录:

$ docker run -v /var/lib/registry/data:/var/lib/registry -d -p 5000:5000 --name registry registry:2.7

事实上,registry 的持久化存储除了支持本地文件系统还支持很多种类型,例如 S3、Google Cloud Platform、Microsoft Azure Blob Storage Service 等多种存储类型。

到这里我们的镜像仓库虽然可以本地访问和拉取,但是如果你在另外一台机器上是无法通过 Docker 访问到这个镜像仓库的,因为 Docker 要求非localhost访问的镜像仓库必须使用 HTTPS,这时候就需要构建外部可访问的镜像仓库。

构建外部可访问的镜像仓库

留更

总结

  1. 注册服务器、仓库和镜像的关系
  2. 公共镜像仓库的创建以及push本地镜像到公共仓库。
  3. 搭建本地仓库

遇到的问题

原因分析:

win10怎么切换桌面快捷键
win + ctrl + 左/右

列出正在运行的容器
docker ps

显示所有的容器,包括未运行的
docker ps -a