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-Compose安装Registry
在CentOS 6上搭建私有的Docker Registry