一、Docker注册中心与仓库
Reastry 可译为注册中心或注册服务器,是存放仓库的地方,一个注册中心往往有很多仓库。Docker默认的注册中心是Docker Hub,其可以通过浏览器访问,也可以使用docker search命令访问。
仓库是集中存放镜像文件的地方。每个仓库集中存放某一类镜像,往往包括多个镜像文件,不同的摊像通过不同的标签来区分,并通过“仓库名:标签”格式指定特定版本的镜像。
仓库名经常以两段的格式出现,如gitlab/gitlab-ce,前者是命名空间,后者是仓库名。
根据所存储的镜像文件是否公开共享,可以将Docker仓库分为公开仓库和私有仓库。
二、Docker Hub
Docker Hub 是一个基于云的注册中心,它为镜像的检索、发布和变更管理、用户和团队协作、开发流程的自动化提供了集中式的资源服务,其主要功能:
- 镜像仓库:上传和下载容器镜像。
- 团队和组织:管理对容器镜像的私有仓库的访问。
- 官方镜像:下载和使用由Docker 官方提供的高质量容器镜像。
- 发布者镜像:下载和使用由外部供应商提供的高质量容器镜像。
- 构建:从GitHub和Bitbucket这两个源代码托管平台自动构建容器镜像并将它们上传到Docker一山,当对源代码库进行修改时,会自动构建一个新镜像。
- Webhooks:这是一个自动化构建特性,在一个镜像上传成功后,Webhooks 会触发操作,将Dncker Hub与其他服务进行整合。
根据镜像仓库的内容将它们分为顶级镜像仓库和次级镜像仓库。
三、官方仓库
Docker Hub包括大量的由厂商和贡献者向Docker提供的公开的、经过认证的仓库,能够确保仓库及时进行安全更新。因此,官方仓库有以下用途:
- 提供必要的基础 OS 镜像仓库(如 Ubuntu、CentOS),作为大多数用户构建镜像的起点。
- 为流行的编程语言运行时、数据存储和其他服务提供类似于平台即服务(PaaS)所提供的解决方案。
- 作为学习Dockerfile的最佳实践,提供清晰的文档供其他Dockerfile作者参考。
-
确保及时的安全更新。
四、镜像加速器
Docker Hub 部署在境外服务器中,在国内访问可能会受到影响。为解决此问题,需要配置相应的国内镜像源来提高镜像的下载速度和稳定性。目前国内提供的 Docker Hub 镜像服务主要有阿里云加速器、DaoCloud、网易云镜像仓库和时速云镜像服务等。
Docker 官方也提供了在我国的加速器,不用注册,直接使用加速器地址即可使用。使用该加速器的基本配置方法是修改/etc/docker/daemon.json文件,在其中加上以下语句。
"registry-mirros":["https://registry.docker-cn.com"]# 保存退出后重启Docker,使配置生效systemctl daemon-reloadsystemctl restart docker
五、创建Docker Hub账号
自行查阅..........
六、使用第三方Docker注册中心
除了Docker Hub之外,如阿里云——容器镜像服务。
1、搜索镜像
2、使用命名空间
- 阿里云的容器镜像服务使用命名空间来分区管理镜像仓库。
- 命名空间是一些仓库的集合面。要将镜像推送(上传)到阿里云的Docker仓库中,必须先创建命名空间。
- 这里默认允许用户直接推送镜像,系统自动根据仓库名称创建对应仓库,可以通过将自动创建仓库设置为关闭来禁用这一自动创建的功能。
-
对于推送镜像自动创建的仓库,默认其是私有的,可以将默认仓库类型设置为公开,以使自动创建的仓库默认为公开仓库。
3、从命令行登录阿里云Registry
无论是使用docker pull命令从阿里云镜像仓库拉取镜像,还是通过docker push命令将镜像推送到阿里云镜像仓库,都必须先使用docker login命令登录阿里云 Registry。
[root@docker-2322030238 ~]# docker login registry.cn-hangzhou.aliyuncs.comUsername: tb6824xxxxPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
此处用户名是阿里云账号,登录密码是在镜像仓库管理控制台设置的Registry登录密码,而不是阿里云账号登录密码。
4、将镜像推送到阿里云Registry
镜像在本地环境构建或是打包之后,就可以推送到Registry。 首先要确认登录的用户对指定的命名空间有写入权限,还要注意登录的Registry和当前操作镜像的Registry必须保持一致。
然后为镜像设置针对阿里云Registry的标签,其标签格式如下:
Registry 域名/命名空间/仓库名称:[标签]
其中,Registry域名为阿里云Registry的域名,仓库名称就是镜像名称,标签相当于镜像版本。在本示例中进行如下操作。
docker tag hello-world registry.cn-hangzhou.aliyuncs.com/docker_dok/hello-world
[root@docker-a ~]# docker push registry.cn-hangzhou.aliyuncs.com/docker_dok/hello-worldUsing default tag: latestThe push refers to repository [registry.cn-hangzhou.aliyuncs.com/docker_dok/hello-world]ac28800ec8bb: Pushed latest: digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7 size: 524
可以到阿里云Registry上查看新推送的仓库:
5、从阿里云Registry拉取镜像
拉取公开的镜像,不需要登录阿里云Registry。先通过浏览器搜索到要拉取的镜像,获取其地址,再进行拉取操作
# 拉取之前上传的镜像[root@docker-a ~]# docker pull registry.cn-hangzhou.aliyuncs.com/docker_dok/hello-worldUsing default tag: latestlatest: Pulling from docker_dok/hello-worldDigest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/docker_dok/hello-world:latestregistry.cn-hangzhou.aliyuncs.com/docker_dok/hello-world:latest
七、自建Docker注册中心
因为安全可控性和Internet连接限制的问题,用户可以建立自己的注册中心提供镜像仓库注册服务。Docker Registry工具已经开源,并在Docker Hub提供官方镜像。
1、基于容器安装运行Registry
# Docker Registry工具负责镜像仓库的管理[root@docker-a ~]# docker run -d -p 5000:5000 --restart=always --name myregistry -v /opt/data/registry:/var/lib/registry registryUnable to find image 'registry:latest' locallylatest: Pulling from library/registry619be1103602: Pull complete 5daf2fb85fb9: Pull complete ca5f23059090: Pull complete 8f2a82336004: Pull complete 68c26f40ad80: Pull complete Digest: sha256:fb9c9aef62af3955f6014613456551c92e88a67dcf1fc51f5f91bcbd1832813fStatus: Downloaded newer image for registry:latestce61d322127cf4a53537051663d58891239cb19f328e52df85af641c87dc51d0
- -v选项将主机的本地/opt/data/registry目录绑定到容器/var/ib/registry目录(DockerRegistry默认存放镜像文件的位置)中,这样可以实现数据的持久化,将镜像仓库存储到本地文件系统中。
- -p选项用于设置映射端口,这样访问主机的5000端口就能访问到Registry容器的服务。
- --restart选项设置重启策略,上面示例中值设置为always,表示这个容器即使异常退出也会自动重启,保持了Registry服务的持续运行。
-
--name myregistry选项表示将该容器命名为myregistry,便于后续操作。
可以执行以下命令获取所有的镜像仓库来测试Docker Registry服务,下面示例中说明服务正常运行,刚建立的注册中心还没有任何镜像。
[root@docker-a ~]# curl http://127.0.0.1:5000/v2/_catalog{"repositories":[]}
2、将镜像上传到自建的注册中心
上传镜像之前需要首先针对自建的注册中心设置相应的标签,其标签格式如下
[主机:端口]/仓库名称:[标签]
主机可以是自建注册中心的域名或IP地址,端口就是该中心对外提供注册服务的端口。
[root@docker-a ~]# docker tag hello-world 127.0.0.1:5000/hello-world:v1
# 上传镜像
[root@docker-a ~]# docker push 127.0.0.1:5000/hello-world:v1
The push refers to repository [127.0.0.1:5000/hello-world]
ac28800ec8bb: Pushed
v1: digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7 size: 524# 进行测试
[root@docker-a ~]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":["hello-world"]}
3、从注册中心下载镜像
[root@docker-2322030238 ~]# docker pull 127.0.0.1:5000/hello-world:v1
v1: Pulling from hello-world
Digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7
Status: Image is up to date for 127.0.0.1:5000/hello-world:v1
127.0.0.1:5000/hello-world:v1
4、配置注册中心地址
默认情况下,注册中心地址使用localhost或127.0.0.1是没有问题的。
如果要使用主机的域名或IP 地址就会报出“http: server gave HTTP response toHTTPS client”这样的错误,这是因为Docker自从 1.3.X 版之后,访问 Docker 注册中心默认使用的是 HTTPS,但是搭建的私有注册中心默认使用的是HTTP。
最简单的解决方案是修改Docker客户端的/etc/docker/daemon.json文件,将要使用的注册中心域名或 IP 地址添加到 insecure-registries 列表中,以允许 Docker 客户端与该列表中的注册中心进行不安全的通信。
# 本示例中定义如下:
“insecure-registries":"192.168.199.51:5000"]# 如果该配置文件没有内容,则需要加上花括号,例如:
{“insecure-registries":"192.168.199.51:5000"]}# 然后重启docker服务
systemctl restart docker# 然后上传、下载操作就没有问题了
[root@docker-a ~]# docker pull 192.168.199.51:5000/hello-world:v1
v1: Pulling from hello-world
Digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7
Status: Image is up to date for 192.168.199.51:5000/hello-world:v1
127.0.0.1:5000/hello-world:v1