跳到元数据的末尾
进入元数据的开始

Artifactory作为Docker注册表

Artifactory允许您将存储库作为成熟的本地存储库使用码头工人各方面的注册。

在Artifactory的基础上现有的支持对于高级工件管理,Artifactory支持Docker提供:

  1. 在组织内分发和共享Docker映像
  2. 使用本地私有注册表保护Docker推拉
  3. 广泛的安全特性,为您提供对注册表和映像的细粒度访问控制。
  4. 对Docker映像的可靠和一致访问
  5. 智能搜索图像
  6. 支持相关的调用Docker注册API而且Docker Hub API这样你就可以透明地使用Docker客户端通过Artifactory访问图像。
  7. 与Bintray集成,用于自动分发Docker图像

对Docker的支持始于Artifactory 3.4版本,从3.7版本开始,Artifactory还支持Docker V2注册表API。

将Artifactory作为Docker容器运行

Artifactory也可以作为Docker镜像在Bintray上使用,也可以作为容器运行。详情请参阅使用Docker运行

兼容性表

Artifactory不断更新以支持最新版本的Docker。为了确保你的Artifactory和Docker版本是兼容的,请参考下表:

Artifactory版本

Docker客户端版本

码头工人V1API

Docker V2 API

3.9.4 1。8 (勾选) (勾选)
3.7 + 17 (勾选) (勾选)
3.4 + 1.7 (勾选)

(错误)

配置Artifactory

局部存储库

要在本地存储库中启用Docker映像支持,请在编辑本地存储库对话框,选择按TAB键检查启用Docker支持

远程存储库

码头工人版本

注意,远程Docker存储库仅支持Docker V2。

一个远程存储库在Artifactory中定义的缓存代理,用于在远程URL上管理的注册中心,例如https://registry-1.docker.io(Docker Hub)。

从远程存储库请求的Docker映像将按需缓存。你可以从远程存储库缓存中删除下载的镜像,但是你不能手动将Docker镜像推送到远程Docker存储库。

定义一个远程存储库来代理远程Docker注册表,请遵循以下步骤:

  1. 管理选项卡下配置|存储库远程存储库部分,并选择“新建”
  2. 设置库的关键属性中指定远程注册中心的URLURL字段,如下所示
  3. 的标签。新的远程存储库对话框中,设置启用Docker支持然后点击“创建”

    代理官方Docker Hub

    如果您正在代理官方Docker Hub,请使用https://registry-1.docker.io作为URL,并确保检查启用令牌认证复选框,因为Docker Hub只支持基于令牌的身份验证。

页面内容


反向代理要求(Nginx/Apache)

Docker客户端有一些限制:

  1. 在提供注册表路径时(例如,不能提供上下文路径)localhost: 8080 / artifactory无效)
  2. 当使用HTTPS主机时,Docker将只发送基本的HTTP身份验证

因此,Artifactory只能通过反向代理与Docker一起使用。

使用自签名SSL证书

从Docker 1.3.1版本开始,您可以使用自签名SSL证书码头工人推/拉命令,但是要使其工作,您需要指定——insecure-registry每个不安全注册表的守护进程标志。

详情请参阅码头工人的文档

例如,如果您将Docker作为服务运行,请编辑/etc/default/docker文件,并附加——insecure-registry标记你的注册表URL到DOCKER_OPTS变量,如下例所示:

编辑DOCKER_OPTS变量
DOCKER_OPTS = " - h unix: / / / var /运行/码头工人。袜子——insecu-registry artprod.company.com"

需要重新启动Docker服务才能生效。

如果您正在使用Boot2Docker,请参考Boot2Docker文档不安全的注册表

如果您没有对——insecure-registryDaemon标志,你应该得到以下错误:

错误消息
错误:无效注册表端点https://artprod.company.com/v1/:获取https://artprod.company.com/v1/_ping: x509:由未知权威签署的证书。

使用以前版本的Docker

为了在以前版本的Docker中使用自签名SSL证书,您需要手动将证书安装到运行Docker客户端的每台机器的操作系统中(请参阅发行2687

配置反向代理

Docker的push和pull命令的形式是:

Docker push/pull [registry_hostname[:port]/][user_name/](repository_name:version_tag)

下面是Nginx和Apache的配置示例,它们在端口443上配置SSL,服务器名为artprod.company.com

Nginx配置

注意,下面的配置将nginx的443端口绑定到Artifactory中特定的本地存储库(命名为Docker-local或docker-local2).

如果您想使用多个存储库,您需要复制这个配置,并将不同的端口绑定到Artifactory中的每个本地存储库。

绑定非443的端口时,请注意代理标头的配置必须与端口号附加在proxy_set_header线。例如,对于运行在端口444上的服务器,您应该编写proxy_set_header主机$ Host:444

需要Nginx 1.3.9或更高版本

这段代码要求nginx支持分块传输编码,该编码可从nginx v1.3.9获得。

[…##基本设置##[…]服务器{监听443;server_name artprod.company.com;ssl;ssl_certificate /etc/ssl/certs/artprod.company.com.crt;ssl_certificate_key /etc/ssl/private/artprod.company.com.key;access_log /var/log/nginx/artprod.company.com.access.log;error_log /var/log/nginx/artprod.company.com.error.log;主机$ Host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Original-URI $request_uri; proxy_read_timeout 900; client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486) chunked_transfer_encoding on; location /v1 { proxy_pass http://artprod.company.com:8080/artifactory/api/docker/docker-local/v1; } } }
[…##基本设置##[…]服务器{监听443;server_name artprod2.company.com;ssl;ssl_certificate /etc/ssl/certs/artprod2.company.com.crt;ssl_certificate_key /etc/ssl/private/artprod2.company.com.key;access_log /var/log/nginx/artprod2.company.com.access.log;error_log /var/log/nginx/artprod2.company.com.error.log;主机$ Host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Original-URI $request_uri; proxy_read_timeout 900; client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486) chunked_transfer_encoding on; location /v2 { proxy_pass http://artprod2.company.com:8080/artifactory/api/docker/docker-local2/v2; } } }

Apache配置

 ServerName artprod.company.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/artprod.company.com.pem SSLCertificateKeyFile /etc/ssl/private/artprod.company.com.key ProxyRequests off ProxyPreserveHost on ProxyPass / http://artprod.company.com:8080/artifactory/api/docker/docker-local/ ProxyPassReverse / http://artprod.company.com:8080/artifactory/api/docker/docker-local/  .pem
 ServerName artprod2.company.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/artprod2.company.com.pem SSLCertificateKeyFile /etc/ssl/private/artprod2.company.com.key ProxyRequests off ProxyPreserveHost on ProxyPass / http://artprod.company.com:8080/artifactory/api/docker/docker-local2/ ProxyPassReverse / http://artprod.company.com:8080/artifactory/api/docker/docker-local2/< /虚拟主机>

HAProxy配置

前端正常绑定*:80绑定*:443 ssl crt /etc/haproxy/ssl模式http选项forwardfor reqadd X-Forwarded-Proto: \ https如果{ssl_fc}选项forwardfor头X-Real-IP default_backend正常前端码头工人绑定*:5001 ssl crt /etc/haproxy/ssl模式http选项forwardfor reqadd X-Forwarded-Proto: \ https如果{ssl_fc}选项forwardfor头X-Real-IP reqirep  ^([^\ :]*)\ / 1 v1美元(. *)\ \ / artifactory / api /码头工人/ docker-prod-local / v1 \ 2 reqirep  ^([^\ :]*)\ / 美元v2 (. *) \ \ 1/artifactory/api/docker/docker-prod-local2/v2\2 default_backend normal后端正常模式HTTP服务器localhost 127.0.0.1:8081

Docker存储库路径必须以api/ Docker为前缀,并使用显式IP地址

当通过Artifactory访问Docker存储库时,存储库URL必须加上前缀api /码头工人在路上。

您可以在配置本地Docker存储库时从UI复制完整的URL,如上所述。

例如,如果你使用Artifactory独立或作为本地服务,你可以使用以下URL访问Docker存储库:

http://localhost:8081/artifactory/api /码头工人<库关键>

此外,Docker存储库的域必须表示为显式的IP地址。唯一的例外是在本地工作时,可以使用本地主机域名。


码头工人登录

你可以在启用或禁用匿名访问的情况下使用Artifactory,这会影响你设置Docker凭证的方式。

禁用匿名访问的Artifactory

禁用匿名访问后,使用常用的方式登录Docker码头工人登录

启用匿名访问的Artifactory

从3.9.3版Artifactory支持码头工人登录允许匿名访问启用。

允许匿名访问启用后,Artifactory默认不会向Docker客户端查询身份验证参数,因此需要指示Artifactory以不同的方式请求身份验证参数。

属性可以覆盖默认行为artifactory.docker。forceAuthentication中的系统属性美元ARTIFACTORY_HOME / etc / artifactory.system.properties文件将指定行为如下:

价值 行为
"false",空或属性未定义

Artifactory将尝试匿名访问Docker存储库。如果存储库允许匿名访问,那么Artifactory将下载所请求的映像。

否则,Artifactory将向Docker客户端返回一个错误。

"true"或"all" 在试图访问任何Docker存储库之前,Artifactory将首先从Docker客户端请求身份验证参数。

以逗号分隔的存储库列表(没有空格)。

如repo1、repo2 repo3……

Artifactory将首先从Docker客户端请求身份验证参数,然后再尝试访问指定的码头工人存储库。对于其他存储库,Artifactory将尝试匿名访问。

重新启动要求

您需要重新启动Artifactory以使此更改生效。

手动设置凭证

如果您正在使用Docker V1 API,或者由于任何其他原因无法登录Docker,您可能需要手动设置您的凭据。

Docker命令行工具支持使用基本HTTP身份验证对敏感操作(如推送)进行身份验证。

要强制对docker存储库进行身份验证访问,您需要向docker配置文件提供以下参数。

  • Docker端点URL(必须使用HTTPS进行基本身份验证才能工作)
  • 您的Artifactory用户名和密码(已格式化用户名:密码),Base64编码的字符串
  • 你的电邮地址

您可以使用以下命令直接从Artifactory获取这些字符串,并将它们复制/粘贴到~/中.dockercfg文件:

sudo

如果您使用“sudo”或以root用户(例如在安装Docker客户端后)使用Docker命令,请注意Docker配置文件应该位于/root/.dockercfg

直接从Artifactory获取.dockercfg条目

$ curl -uadmin:密码"https://artprod.company.com/<版本>/auth"

“https://artprod.company.com”:{
“auth”:“YWRtaW46QVA1N05OaHZTMnM5Qk02RkR5RjNBVmF4TVFl”,
“邮箱”:“admin@email.com”

地点:<版本>= v1 | v2

Docker配置文件可以为您希望访问的每个注册表包含一个单独的身份验证块。

下面是一个有两个URL端点的例子:

{"https://artprod.company.com": {"auth":"YWRtaW46cGFzc3dvcmQ=", "email":"myemail@email.com"}, "https://artprod2.company.com": {"auth":"YWRtaW46cGFzc3dvcmQ=", "email":"myemail@email.com"}}

码头工人推

为了使用docker push,你需要用正确的反向代理URL来标记你的图像以上

例如,推官方Ubuntu基本图进入我们本地的Artifactory存储库:

#首先我们需要从docker hub $ docker pull Ubuntu #接下来我们用自己的端点URL $ docker tag Ubuntu artprod.company.com/ubuntu #最后我们可以推送标记图像$ docker push artprod.company.com/ubuntu

码头工人拉

您可以简单地从定义的端点URL执行docker pull以上

$ docker拉artprod.company.com/ubuntu

在没有匿名访问的情况下使用Artifactory

默认情况下,Artifactory允许匿名访问docker存储库。它的定义是安全|总体配置.详情请参阅允许匿名访问
控件,如果希望能够跟踪用户如何与存储库交互,则需要取消选中允许匿名访问设置。这意味着用户将需要输入所述的用户名和密码设置证书以上。


使用Docker V2注册表API

使用Docker V1

如果您使用的Docker版本在1.6以下,请参考使用Docker V1注册表API

Docker存储库布局

Artifactory将Docker blob和manifest存储在一起,便于安全管理和删除:

此外,属性附加到每个blob和清单,以方便搜索它们:

  • manifest -每个清单都用一个名为sha256这是它的sha256校验和以及它的名字存储在一个名为docker.manifest
  • blob -每个blob也用它的sha256校验和财产。

Docker形象推广

从3.5.3版本开始,Artifactory支持将Docker映像从Artifactory中的一个Docker存储库提升到另一个Docker存储库。

使用cURL可以使用以下端点触发升级:

POST api/docker///promote {"targetRepo": "", "dockerRepository": "", "tag": "", "copy": }

地点:

< repoKey >

源存储库密钥(例如,docker-local如本页所使用)

<版本>

您使用的Docker版本(v1 | v2)

< targetRepo >

要移动或复制的目标存储库

< dockerRepository >

要提升的docker存储库名称

<标记>

要提升的可选标记名,如果为空—整个docker存储库将被提升。默认值:"

< >复制

是否复制而不是移动。默认值:假

例如,当您需要将Docker映像从开发存储库提升到生产时,这是非常有用的。

一个提升docker形象的例子“jfrog / ubuntu”所有的标签都来自docker-localdocker-prod使用cURL将是:

Docker形象推广
curl -i -uadmin:password -X POST "https://artprod.company.com/v1/promote" -H "Content-Type: application/json" -d '{"tagetRepo":"docker-prod","dockerRepository":"jfrog/ubuntu"}'

注意,上面的示例是通过反向代理执行的。要直接通过Artifactory,您将执行以下命令:

curl -i -uadmin:password -X POST "http://localhost:8080/artifactory/api/docker/docker-local/v1/promote" -H "Content-Type: application/json" -d '{"targetRepo":"docker-prod","dockerRepository":"jfrog/ubuntu"}'

使用Docker V1注册表API

Docker存储库布局

Artifactory将docker图像存储在一个由2个主要目录组成的布局中:

  • .images:存储所有平面docker图像。
  • 存储库:使用标记存储所有存储库信息(类似于存储库在Docker Hub中的存储方式)。

此外,Artifactory用两个属性注释每个部署的docker映像:

  • docker.imageId:映像id
  • docker.size:以比特为单位的图像大小

部署的标签还带有两个属性:

  • docker.tag.name:标记名称
  • docker.tag.content:此标记所指向的图像的id


查看Docker映像树

Artifactory允许您直接从UI查看特定图像的完整图像树,其方式与从Docker映像树命令。

工件选项卡上,选择树浏览器并向下钻取以选择ancestry.json要检查的文件。元数据显示在码头工人的祖先选项卡。

查看单个Docker映像信息

Artifactory允许您直接从UI查看特定图像的完整图像树。

工件选项卡上,选择树浏览器并向下钻取以选择json.json要检查的文件。元数据显示在码头工人信息选项卡。

搜索Docker映像

在上面提到的现有属性之上,Artifactory还保存了另一个属性,docker.repoName,表示存储库名称(例如"library/ubuntu"):

使用Docker客户端进行搜索

Docker客户端本身支持在私有注册表中搜索图像。

例如,搜索ubuntu形象artprod.company.com,使用如下命令:

Docker搜索artprod.company.com/ubuntu

然而,由于Docker客户端不发送身份验证凭证,这就要求你有匿名访问在Artifactory中启用。

码头工人版本

只有Docker V1支持使用Docker客户端进行搜索。

使用REST API搜索

如果您使用的是Docker版本下面1.2.0,您可以使用Artifactory REST API搜索图像,如下所示:

Curl -i -uadmin:password "https://artprod.company.com/v1/search?q=ubun" {"num_results": 1, "query": "ubun", "results": [{"name": "library/ubuntu", "description": ""}]}

您可以选择添加docker.description财产。

在这种情况下,描述也用于搜索,并显示在Docker注册表REST API响应中。

...

"results": [{"name": "library/ubuntu", "description": "Main Linux distribution"}]
...

删除和清理

从3.5版开始,Artifactory本地支持删除标记和存储库,并遵守Docker Hub规范

删除Docker标记和存储库会自动清除剩下的任何孤立层(未被任何其他标记/存储库使用的层)。

目前,Docker客户端不支持DELETE命令,但是可以使用cURL手动触发删除。下面是一些例子:

删除存储库和标记
//删除"jfrog/ubuntu"资源库curl -uadmin:password -X DELETE "https://artprod.company.com/v1/repositories/jfrog/ubuntu" //删除"jfrog/ubuntu"资源库中的"12.04"标签curl -uadmin:password -X DELETE "https://artprod.company.com/v1/repositories/jfrog/ubuntu/tags/12.04"

你也可以通过UI删除标签和存储库:

空目录

删除存储库或标记后留下的任何空目录将在下一个文件夹修剪作业期间自动删除(默认每5分钟执行一次)。

使用V1推广Docker映像

使用Docker V1提升Docker映像的方法与之前完全相同使用Docker V2推广图像


将V1存储库迁移到V2

我们建议在可能的情况下使用Docker V2存储库(前提是您的Docker客户端是1.6及以上版本)。

如果你有一个现有的Docker V1存储库,你可以使用cURL将它的内容迁移到V2存储库中:

POST api/docker//v1/migrate {"targetRepo": "", "dockerRepository": "", "tag": ""}

地点:

< repoKey >

源存储库密钥(例如,docker-local如本页所使用)

< targetRepo >

要迁移到的目标存储库(例如,docker-local2如本页所使用)

< dockerRepository >

一个可选的要迁移的docker存储库名称,如果为空—整个源存储库将被迁移。默认值:"

<标记>

要提升的可选标记名,如果为空—整个docker存储库将被提升。默认值:"

一个迁移docker映像的示例“jfrog / ubuntu”所有的标签都来自docker-localdocker-local2使用cURL将是:

curl -i -uadmin:password -X POST "http://localhost:8080/artifactory/api/docker/docker-local/v1/migrate" -H "Content-Type: application/json" -d '{"tagetRepo":"docker-local2","dockerRepository":"jfrog/ubuntu"}'

在Artifactory Online中使用Docker

由于Docker客户端的限制,在Artifactory Online中,每个服务器都有一个子域的特殊配置,这取决于您正在使用的Docker Registry API版本。

Docker Registry V1 API

您需要创建一个新的启用Docker的本地存储库docker-local。

在使用Docker客户端时,请使用以下地址:" $ {account_name} .artifactoryonline.com”



Docker Registry V2 API

您需要创建一个新的启用Docker V2的本地存储库,命名为dockerv2-local。

在使用Docker客户端时,请使用以下地址:" $ {account_name} -docker-dockerv2-local.artifactoryonline.com”