dockerregistry(docker registry harbor)

本篇文章给大家谈谈dockerregistry,以及docker registry harbor对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何部署 Docker Registry 服务

官方镜像下的简单示例本节中,将创建一个Container来孝友运行Docker的官方Registry镜像。你将推送(Push)一个镜像到这个Registry服务器,然后再从该Registry中拉取(Pull)同一个镜像。这是个很好的弊卖练习,有助于理解客户端与本地Registry的基本交互。1、安装Docker。2、从Docker公共Registry中运行hello-world镜像。$dockerrunhello-worldrun命令自动从Docker的官方镜像库中将hello-world镜像pull下来。3、在localhost上启动Registry服务。$dockerrun-p5000:5000registry:2.0这将在DOCKER_HOST上启动一个Registry服务,并在5000端口监听。4、列出镜像。$dockerimagesREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEregistry2.0bbf0b6ffe9233daysago545.1MBgolang1.4121a93c904635daysago514.9MBhello-worldlateste45a5af57b003monthsago910B这个列表应当包括一个由先前运行而得来的hello-world镜像。5、为本地repoistory重新标记hello-world镜像。$dockertaghello-world:latestlocalhost:5000/hello-mine:latest此命令使用[REGISTRYHOST/]NAME[:TAG]格式为hello-world:latest重新打标。REGISTRYHOST在此例中是localhost。在MacOSX环境中,得把localhost换成$(boot2dockerip):5000。6、列出新镜像。租慎逗$dockerimagesREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEregistry2.0bbf0b6ffe9233daysago545.1MBgolang1.4121a93c904635daysago514.9MBhello-worldlateste45a5af57b003monthsago910Blocalhost:5000/hello-minelatestef5a5gf57b013monthsago910B可以看到,新镜像已经出现在列表中。7、推送新镜像到本地Registry中。$dockerpushlocalhost:5000/hello-mine:latestThepushreferstoarepository[localhost:5000/hello-mine](len:1)e45a5af57b00:Imagealreadyexists31cbccb51277:Imagesuccessfullypushed511136ea3c5a:ImagealreadyexistsDigest:sha256:a1b13bc01783882434593119198938b9b9ef2bd32a0a246f16ac99b01383ef7a8、使用curl命令及DockerRegistry服务APIv2列出Registry中的镜像:$curl-v-XGET*HostnamewasNOTfoundinDNScache*Trying127.0.0.1*Connectedtolocalhost(127.0.0.1)port5000(#0)GET/v2/hello-mine/tags/listHTTP/1.1User-Agent:curl/7.35.0Host:localhost:5000Accept:*/*

[img]

如何搭建及使用docker registry

registry是什么?

registry是Docker的镜像存储服务,docker hub上的registry镜像见Registry官方镜像,更多详细信息请哗铅参见源码。

搭建registry

在服务器上执行如下命令安装docker,这里选择腾讯云(Ubuntu Server 14.04.1 LTS 64位)镜像来创建服务器

curl -fsSL | sh

安装docker-compose Docker Compose是一个定义及运行多个Docker容器的工具。使用Docker Compose只需要在一个配置文件中定义多个Docker容器,然后使用一条命令将多个容器启动,Docker Compose会通过解析容器间的依赖关系,按先后顺序启动所定义的容器。详见Docker Compose

curl -L (uname -s)-$(uname -m) /usr/local/bin/docker-compose

chmod a+x /usr/local/bin/docker-compose

启动registry服务,此例中包含nginx和registry两个容器,涉及的包及配置文件请参见附件,解压后,直接执行如下命令即可创建服务。

docker-compose up -d

停止服务

docker-compose stop

重启服务

docker-compose restart

下线服务

docker-compose down

上传镜像

因为上面搭建的registry服务是http的,所以docker启动参数需要配置--insecure-registry localhost选项,修改/etc/default/docker文件

DOCKER_OPTS="--insecure-registry localhost"

重启docker

service docker restart

拉取上传镜像 docker pull;docker tag;docker push(tag默认为latest)

docker pull hello-world

docker tag hello-world localhost/library/hello-world

docker push localhost/library/hello-world

下载镜像

docker pull localhost/library/hello-world

删除镜像

docker rmi localhost/library/hello-world

获取镜像仓库列表

# curl

{"repositories":["library/hello-world"]}

未上传镜像前的输出如下:

# curl

{"repositories":[]}

获取镜像tag列表

# curl -X GET

{"name":"library/hello-world","tags":["latest"]}

获取镜像manifests信息段纯

# curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET

{

"schemaVersion": 2,

"mediaType"乱燃好: "application/vnd.docker.distribution.manifest.v2+json",

"config": {

"mediaType": "application/vnd.docker.container.image.v1+json",

"size": 1473,

"digest": "sha256:c54a2cc56cbb2f04003c1cd4507e118af7c0d340fe7e2720f70976c4b75237dc"

},

"layers": [

{

"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",

"size": 974,

"digest": "sha256:c04b14da8d1441880ed3fe6106fb2cc6fa1c9661846ac0266b8a5ec8edf37b7c"

}

]

}

其中c54a2cc56cbb2f04003c1cd4507e118af7c0d340fe7e2720f70976c4b75237dc即为执行docker images时看到的IMAGE ID。 layers表示了镜像的层次关系,可以通过layers中的digest来拉取blob,见下面获取镜像blob

获取镜像blob

在上面获取hello-world:latest镜像的manifests信息中可以看到其只有一个layer,以此为例来看如何获取镜像blob。从拉取的结果可以看到获取的blob与文件sha256是一致的。执行docker pull实际上就是首先获取到镜像的manifests信息后,再拉取blob的。

# curl -s -X GET -o hello-world.blob

# ls -l hello-world.blob

-rw-r--r-- 1 root root 974 Nov 23 09:56 hello-world.blob

# sha256sum hello-world.blob

c04b14da8d1441880ed3fe6106fb2cc6fa1c9661846ac0266b8a5ec8edf37b7c hello-world.blob

##删除镜像(soft delete)

首先通过curl -i 参数获取到镜像的Docker-Content-Digest,registry 2.3及以后的版本必须在header中指定Accept: application/vnd.docker.distribution.manifest.v2+json,否则默认返回的是schema1的digest,其与schema2的digest不同,使用不指定上述头信息返回的digest删除时会返回404。

# curl -i -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET

HTTP/1.1 200 OK

Server: nginx/1.11.5

Date: Wed, 23 Nov 2016 02:17:51 GMT

Content-Type: application/vnd.docker.distribution.manifest.v2+json

Content-Length: 524

Connection: keep-alive

Docker-Content-Digest: sha256:a18ed77532f6d6781500db650194e0f9396ba5f05f8b50d4046b294ae5f83aa4

Docker-Distribution-Api-Version: registry/2.0

Etag: "sha256:a18ed77532f6d6781500db650194e0f9396ba5f05f8b50d4046b294ae5f83aa4"

{

"schemaVersion": 2,

"mediaType": "application/vnd.docker.distribution.manifest.v2+json",

"config": {

"mediaType": "application/vnd.docker.container.image.v1+json",

"size": 1473,

"digest": "sha256:c54a2cc56cbb2f04003c1cd4507e118af7c0d340fe7e2720f70976c4b75237dc"

},

"layers": [

{

"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",

"size": 974,

"digest": "sha256:c04b14da8d1441880ed3fe6106fb2cc6fa1c9661846ac0266b8a5ec8edf37b7c"

}

]

}

根据上一步返回的Docker-Content-Digest删除,返回202表示删除成功

# curl -k -v -s -X DELETE

* Hostname was NOT found in DNS cache

* Trying 127.0.0.1...

* Connected to localhost (127.0.0.1) port 80 (#0)

DELETE /v2/library/hello-world/manifests/sha256:a18ed77532f6d6781500db650194e0f9396ba5f05f8b50d4046b294ae5f83aa4 HTTP/1.1

User-Agent: curl/7.35.0

Host: localhost

Accept: */*

**HTTP/1.1 202 Accepted**

* Server nginx/1.11.5 is not blacklisted

Server: nginx/1.11.5

Date: Wed, 23 Nov 2016 02:29:59 GMT

Content-Type: text/plain; charset=utf-8

Content-Length: 0

Connection: keep-alive

Docker-Distribution-Api-Version: registry/2.0

* Connection #0 to host localhost left intact

确认结果

# curl -X GET

{"name":"library/hello-world","tags":null}

删除镜像(hard delete)

在上一步中,只是删除了镜像的manifests信息,解引用的blob还在占用磁盘空间,执行如下命令可以查看可以删除的blob

docker exec -it myregistry_registry_1 /bin/registry garbage-collect --dry-run /etc/registry/config.yml

要删除blob,释放磁盘空间,需要执行下面的命令。需要特别注意的是在执行下面的命令时registry必须是只读模式(只读模式可在registry配置文件中设置),否则可能会导致数据不一致。

docker exec -it myregistry_registry_1 /bin/registry garbage-collect /etc/registry/

如何在Ubuntu14.04上搭建私有docker registry

docker是一款部署服务器的强有力工具。docker.io免费为用户提供上传镜像资源到官方registry的服务,然而,该registry对任何人均开放权限。也许毁岩对于一个非开源的项目,你并不情愿如此。

本文将指导你如何搭建私有docker registry,并确保其安全性。在本教程的最后,你将亲身体验上传自制的docker镜像到私有registry,并在不同的机器上安全的将该其拉去下来。

本教程不包含如何容器化应用服务的内容,而是旨在引导你去创建registry来存储你要部署的服务资源。如果你想要docker的入门教程,也许这儿可以帮到你。

基于Ubuntu14.04系统的单registry和单客户机模式,本教程已经通过测试,也许在其他基于debian的发布上仍可以运行。

docker概念

如果在此之前你尚未接触过docker,这需要花费你几分钟的时间来熟悉docker的关键概念。如果你对docker已得心应手,只是想了解如何构建私有registry的话,那么,你可以直接进入下一小节。

对于一个新手该如何使用docker,不妨试试这里优秀的docker笔记。

docker的核心就是要对应用以及应用的依赖与操作系统分离。为了达到上述目的,docker采用容器与镜像机制。一个docker镜像基本上是一个文件系统的模板。当你通过docker run命令运行一个docker镜像时,该文件系统的一个实例即被激活,并且运行在系统内的docker容器之中。默认的,该容器无法触及原始镜像以及docker本身所运行在的主机的文件系统。这是一个独立的环境。

对容器所做的任何改动都将保存在容器本身之内,并不会影响原始的镜像。如果想保留这些改动,那么余纤,可以通过docker commit命令将容器保存为镜像。这意味你可以通过原有的容器来衍生出新的容器,而不会对原始容器(或镜像)造成任何影响。如果你熟悉git,那么你会觉得该流程十分眼熟:从任意的容器上去创建新的分支(这里,分支的意思即为docker中的镜像)。运行镜像类似于执行git checkout操作。

更进一步形容,运行私有docker registry,就好比为docker镜像运行私有git仓库。

第一步——安装必要的软件

在docker registry服务器上,应当创建一个拥有sudo权限的用户(如果可以,在客户机上也如此纤毁御)。

docker registry软件是一款python应用,因此为了使其能够运行起来,需要安装python开发环境以及必要的库:

sudo apt-get updatesudo apt-get -y install build-essential python-dev libevent-dev python-pip liblzma-dev

第二步——安装并配置docker registry

为了安装最新的稳定的docker registry发行版(作者撰文时为0.7.3,译者译时为0.9.1),我们将使用python包管理工具pip:

sudo pip install docker-registry

docker-registry需要配置文件。

默认地,pip将该配置文件放置在相当偏僻的地方,因系统中python的安装位置而异。因此,为了找到该路径,我们将尝试运行registry,以查看相关的输出:

gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application

由于配置文件不在正确的位置,上述尝试将会以失败而告终,并输出一条包含FileNotFoundError错误消息,如下所示[在某些版本中,无下述信息输出,译者注]:

FileNotFoundError: Heads-up! File is missing: /usr/local/lib/python2.7/dist-packages/docker_registry/lib/../../config/config.yml

registry在同样的路径上包含一个示例配置文件,该文件名为config_sample.yml,因此,我们可以通过上述给出的路径名来定位示例配置文件。

从错误消息中复制路径信息(此时为/usr/local/lib/python2.7/dist-packages/docker_registry/lib/../../config/config.yml),然后,将config.yml部分去除,这样我们可以切换到该路径下。

cd /usr/local/lib/python2.7/dist-packages/docker_registry/lib/../../config/

将config_sample.yml文件的内容复制到config.yml中:

sudo cp config_sample.yml config.yml

默认情况下,docker的数据文件存放在/tmp文件夹下,但是在许多的类Linux系统中,系统重启时该文件夹被清空,这并不是我们所希望的。那么,我们创建一个永久性的文件夹来存储数据:

sudo mkdir /var/docker-registry

好的,下面我们配置config.yml文件,将对文件夹/tmp的引用更改为/var/docker-registry。首先,首先找到以sqlalchemy_index_database为首的靠近文件首部的一行:

sqlalchemy_index_database:_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db

将其更改指向/var/docker-registry,如下所示:

sqlalchemy_index_database:_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////var/docker-registry/docker-registry.db

向下一点,到local:部分,重复上述操作,更改如下内容:

local: localstorage: localstorage_path: _env:STORAGE_PATH:/tmp/registry

为:

local: localstorage: localstorage_path: _env:STORAGE_PATH:/var/docker-registry/registry

样例配置文件中的其他默认值均无需修改。一目十行即可。然而,如果你想要做一些复杂的配置,诸如采用扩展存储装置来存储docker数据,那么该文件正具有此功能。当然,这已超出本教程的范围,你可以查看docker-registry文档以获取更多的帮助。

既然配置文件已置于正确的位置,那么再一次尝试来测试docker registry服务器:

gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application

你会看到如下的输出:

2014-07-27 07:12:24 [29344] [INFO] Starting gunicorn 18.02014-07-27 07:12:24 [29344] [INFO] Listening at: (29344)2014-07-27 07:12:24 [29344] [INFO] Using worker: gevent2014-07-27 07:12:24 [29349] [INFO] Booting worker with pid: 293492014-07-27 07:12:24,807 DEBUG: Will return docker-registry.drivers.file.Storage

棒极了!现在我们已经拥有一个运行着的docker registry。下面执行Ctrl+C终止该程序。

到目前为止,docker registry并不是那么有用。它并不会自行启动除非我们执行上述gunicorn命令。另外,docker registry不没有引入任何的内置的认证机制,因此,其当前状态下是不安全并且对外部完全开放的。

第三步——以服务的形式启动docker registry

通过创建Upstart脚本,设置docker registry在系统的启动程序中开始运行。

首先,创建日志文件目录:

sudo mkdir -p /var/log/docker-registry

然后,用一款你拿手的文本编辑器来创建Upstart脚本:

sudo nano /etc/init/docker-registry.conf

将如下内容写入上述脚本中:

description "Docker Registry"start on runlevel [2345]stop on runlevel [016]respawnrespawn limit 10 5script exec gunicorn --access-logfile /var/log/docker-registry/access.log --error-logfile /var/log/docker-registry/server.log -k gevent --max-requests 100 --graceful-timeout 3600 -t 3600 -b localhost:5000 -w 8 docker_registry.wsgi:applicationend script

更多关于Upstart脚本的内容,请阅读该教程。

此时,执行如下命令:

sudo service docker-registry start

将看到下面的输出:

docker-registry start/running, process 2

docker registry使用指南

docker registry 的作用就是存储我们的镜像。通常情况下我们可以使用 docker hub 来存储,不过如果是在公司内部使用,不想将镜像公开,可以手动搭建一个本地registry,如 docker registry 或 harbor 。本文简单介绍一下 docker registry 的搭建使用及常用配置。

搭建registry最基础的命令为:

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

registry定义的对外服务端口为 5000 ,我们也可以通过环境变量 REGISTRY_HTTP_ADDR 来修改服务端口。

如果要使用其他存储,如 Amazon S3 bucket , Google Cloud Platform 或其他docker支持的 存储 ,也可以通过环境变量单独配置(推荐用yaml的形式来配置)。

注:私有仓库,推送镜像时,要在 /etc/docker/daemon.json 或 C:\ProgramData\docker\config\daemon.json 文件中添加以下配置,并重启docker。

创建服务端证书的第三步,可能会报错 unable to open '/etc/pki/CA/index.txt' ,需要手动创建该文件 touch /etc/pki/CA/index.txt , 并创建一个序列文件来标记CA证书 echo '1000' /etc/pki/CA/serial 。

证书生成也可以参考:

为了提高regsitry的安全性,可以开启访问控制,用户需要登陆后才可以使用registry。

首先,创建一个密码文件,里面包含一条用户名密码(stark/catherine)。

windows系统下需要修改编码格式:

docker run --rm --entrypoint htpasswd httpd:2 -Bbn testuser testpassword | Set-Content -Encoding ASCII auth/htpasswd

然后启动容器,带上用户认证。

配置一个域名解析: echo 127.0.0.1 myregistry.com /etc/hosts ,然后使用docker登录 docker login myregistry.com:5000 ,用户名/密码就是前面配置的stark/catherine。

注:使用身份认证,建议开启TLS,否则登录信息明文传输(header中),一样不安全。

x509报错解决:x509报错通常就是自签证书没有加入到docker client所局升在host的信任证书中,手动加入即可。对于linux用户,只需要拷贝根证书文件到 /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt 中即可。

最后,也可以在浏览器中访问 或是 查看仓库信息。

以上只是最简单的用户认证,只能使用我们预先定义好的用户来访问。

我们也可以在regsitry之前使用一个代枯没理,来实现没腊纳更高级的身份认证;或者将registry集成到我们自己的身份认证和访问控制系统中,由我们的鉴权服务来签发token给用户,然后用户使用签发的token访问我们的registry。harbor就提供了这样一整套服务,如果有此方面的需求,可以考虑使用harbor。

不知到为啥,容器起来了,但访问不了

完整的配置选项 参考 。

配置文件和环境变量的对应关系。配置文件中的内容为:

上述配置文件如果通过环境变量来配置,则对应的环境变量为:

REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry

格式为 REGISTRY_variable ,其中 variable 为配置的变量,通过 _ 连接yaml文件中的各层变量得到。

token 认证流程简图:

什么是docker registry

就是镜像仓库,存放docker镜像的地方。橘含推送或者拉取docker镜像需要指定圆银笑镜像仓库搏唤,如果是私有的镜像仓库还需要输入账号和密码。

关于dockerregistry和docker registry harbor的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表