Docker Registry 安装和使用

Posted big-cousin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker Registry 安装和使用相关的知识,希望对你有一定的参考价值。

 

前言

Docker Hub公共镜像市场

目前Docker官方维护了一个公共镜像仓库https://hub.docker.com,其中已经包括超过15000的镜像。大部分镜像需求,都可以通过在Docker Hub中直接下载镜像来实现。

Docker Registry私有仓库

公共仓库有很多镜像,但下载速度就那样,而且公共镜像缺乏个性化和实用性,毕竟每个公司得项目需求不一样。这样就可以自建一个Docker Registry。优点很明显,自建仓库很多都是局域网内吗,上传下载速度很快,安全性高。

Docker Registry有三个角色,分别是index、registry和registry client。

角色 1 -- Index 

index负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。它使用以下组件维护这些信息:

  • Web UI
  • 元数据存储
  • 认证服务
  • 符号化

角色 2 --Registry

registry是镜像和图表的仓库。然而,它没有一个本地数据库,也不提供用户的身份认证,由S3、云文件和本地文件系统提供数据库支持。此外,通过Index Auth service的Token方式进行身份认证。

角色 3 --Registry Client

Docker充当registry客户端来负责维护推送和拉取的任务,以及客户端的授权。

实验环境:

docker registry:192.168.1.201

docker clinent:192.168.1.200

首先保证两台宿主机上都已安装docker

技术分享图片

 

安装

1:docker hub 公共镜像中有 registry 的镜像,直接从docker hub拉取。此操作在192.168.1.201上执行

1 mkdir /registry
2 docker run -p 5000:5000  --restart=always --name registry -v /registry/:/var/lib/registry -d registry

注:registry容器启动时,会在容器内/var/lib/下面创建一个registry目录,用于存储作为私有仓库接受docker client 上传的镜像。-v:将宿主机/registry/目录挂载到容器内/var/lib/registry目录。

--restart 容器重启方式

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
  •   on-failure:3,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容器
  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

2:验证私有仓库是否搭建成功,使用浏览器访问192.168.1.201:5000/v2/

 技术分享图片

界面显示{},表示docker registry搭建成功

使用

实验目的:将上文档中的wordpress项目上传至私有仓库,在192.168.1.201中运行。

上篇文档中使用docker-compose创建了两个容器mariadb和wordpress ,宿主机为192.168.1.200,这里使用这两个容器作为实验对象。

技术分享图片

1:首先将两台实验机hosts解析。

1 cat >>/etc/hosts <<EOF
2 192.168.1.201 hub.com
3 EOF

注:registry和client都要解析。

2:添加认证方式。

docker registry  老版本可以使用http认证,但新版本很早就取消,不提供认证,但是又需要https认证才能实现上传和下载。可以借助nginx ssl 认证。这里先使用强制使用http方式认证。

 cat >>/etc/docker/daemon.json<<EOF
 {
     "registry-mirrors": [
         "http://68cdf6cf.m.daocloud.io"
     ],
     "insecure-registries":["Registry:81"]
 }
 EOF

注:registry和client都要配置,配置完后需要重启docker,再启动registry。

技术分享图片

 

3:提交镜像。

docker镜像命名格式为:提交者/镜像名:版本号

例如:Danny/wordpress:1.0  表示这个镜像由Danny用户创建,如果没有用户名,默认为Docker hub 官方创建,名称为wordpress,版本号为1.0。如果没有版本号,默认为最新版。  

提交用户必须和私有仓库IP:port,可以做hosts解析,不然会提交失败。

例如:你的仓库ip为192.168.1.201,registry映射到宿主机上的端口为5000,镜像名为nginx,你的client提交镜像须为:192.168.1.201:5000/nginx

现在将已存储数据的wordpress项目提交为hub.com用户的镜像。

技术分享图片

现有wordpress项目mariadb数据库又数据:用户名,密码,页面等等数据。

1:查看正在运行的容器

技术分享图片

 2:提交当前运行项目为新的镜像。

docker commit wordpress_wordpress_1 hub.com:5000/wordpress:1.0
docker commit wordpress_db_1 hub.com:5000/db:1.0

技术分享图片

3:上传镜像到私有仓库

docker push hub.com:5000/db:1.0
docker push hub.com:5000/wordpress:1.0

技术分享图片

4:查看私有仓库镜像,用浏览器访问http://192.168.1.201:5000/v2/_catalog

技术分享图片

 

 可以看到有db,wordpress两个镜像。

5:从私有仓库拉取镜像并启动容器,这里我们还是使用docker-compose启动容器。详情请看上一篇文章。

docker-compose配置文件

wordpress:
  image:
      hub.com:5000/wordpress:1.0
  links:
    - db:mysql
  ports:
    - 80:80
db:
  image:
      hub.com:5000/db:1.0
  environment:
     MYSQL_ROOT_PASSWORD: 123456
  volumes:
    - /docker/db/:/var/lib/mysql

技术分享图片

6:测试是否下载并启动成功。

技术分享图片

问题来了

我是用的镜像是有数据的镜像commit后的镜像,按理界面因该是我配置好的wordpress界面。现在还是没有数据,说明commit没有把mariadb的数据提交到新的镜像内。

为此我去查了文档:

发现docker默认使用的是文件系统。特征:它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。链接:https://docs.docker.com/storage/volumes/

然后我又去查看了docker commit 官方文档,发现提交操作将不包括容器内安装的卷中包含的任何数据。链接:https://docs.docker.com/engine/reference/commandline/commit/#options

就只有一种可能,就是容器内的mariadb数据存储的目录是以挂载卷方式挂载的。

通过 docker inspect wordpress_db_1 查看到"Mounts"中有如下信息:

技术分享图片

我将宿主机/docker-compose/mysql/目录挂载到容器内的/var/lib/mysql,存储数据全部写到挂载宿主机目录下。

如果我启动不挂载目录的话,他还是将宿主机的目录挂载到容器内用于保存数据存储目录中。

技术分享图片

到这里,原因知道了。

192.168.1.200数据库是挂载到宿主机上的,我把它拷到192.168.1.201挂载的目录上应该就行了吧。

192.168.1.201:关闭wordpress和mariadb

技术分享图片

192.168.1.200:将数据库挂载目录中文件scp到192.168.1.201数据库挂载目录。

技术分享图片

然后启动192.168.1.201的wordpress项目

技术分享图片

测试

技术分享图片

 

以上是关于Docker Registry 安装和使用的主要内容,如果未能解决你的问题,请参考以下文章

Docker Registry 安装和使用

Docker 私服Registry简介与使用Docker-Compose安装Registry

在CentOS 6上搭建私有的Docker Registry

使用harbor配置docker registry

docker(14):centos7 安装docker hub harbor,可视化registry

如何搭建及使用docker registry