温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何搭建一个私有的Docker registry

发布时间:2022-05-26 16:35:12 来源:亿速云 阅读:153 作者:iii 栏目:大数据

这篇文章主要介绍“如何搭建一个私有的Docker registry”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何搭建一个私有的Docker registry”文章能帮助大家解决问题。

本地搭建

首先你需要安装boot2docker以及docker cli。如果你已经搭建好了基本的docker环境,你可以直接跳过这一步。

从终端运行以下命令(我假设你使用os x,使用 homebrew 来安装相关软件,你可以根据你的环境使用不同的包管理软件来安装):

brew install boot2docker docker

如果一切顺利(想要了解搭建docker环境的完整指南,请参阅 ) ,你现在就能够通过如下命令启动一个 docker 运行于其中的虚拟机:

boot2docker up

按照屏幕显示的说明,复制粘贴book2docker在终端输出的命令。如果你现在运行docker ps命令,终端将有以下显示。

container id image command created status ports names

好了,docker已经准备就绪,这就够了,我们回过头去搭建registry。

创建服务器

登录进你的do账号,选择一个预安装了docker的镜像文件,创建一个新的drople。(本文写成时选择的是 image > applications > docker 1.4.1 on 14.04)

你将会以邮件的方式收到一个根用户凭证。登录进去,然后运行docker ps命令来查看系统状态。

搭建aws s3

我们现在将使用amazo simple storage service(s3)作为我们registry/repository的存储层。我们将需要创建一个桶(bucket)以及用户凭证(user credentials)来允许我们的docker容器访问它。

登录到我们的aws账号(如果没有,就申请一个),在控制台选择s3(simpole storage service)。

点击 create bucket,为你的桶输入一个名字(把它记下来,我们一会需要用到它),然后点击create

ok!我们已经搭建好存储部分了。

设置aws访问凭证

我们现在将要创建一个新的用户。退回到aws控制台然后选择iam(identity & access management)。

dashboard的左边,点击users。然后选择 create new users

输入一个用户名(例如 docker-registry)然后点击create。写下(或者下载csv文件)你的access key以及secret access key。回到你的用户列表然后选择你刚刚创建的用户。

在permission section下面,点击attach user policy。之后在下一屏,选择custom policy。

如何搭建一个私有的Docker registry

custom policy的内容如下:

{
 "version": "2012-10-17",
 "statement": [
  {
   "sid": "somestatement",
   "effect": "allow",
   "action": [
    "s3:*"
   ],
   "resource": [
    "arn:aws:s3:::docker-registry-bucket-name/*",    
    "arn:aws:s3:::docker-registry-bucket-name"
   ]
  }
 ]
}

这个配置将允许用户(也就是regitstry)来对桶上的内容进行操作(读/写)(确保使用你之前创建aws s3时使用的桶名)。总结一下:当你想把你的docker镜像从你的本机推送到仓库中时,服务器就会将他们上传到s3。

安装registry

现在回过头来看我们的do服务器,ssh登录其上。我们将要一个官方docker registry镜像。

输入如下命令,开启registry。

docker run \ 
     -e settings_flavor=s3 \
     -e aws_bucket=bucket-name \
     -e storage_path=/registry \
     -e aws_key=your_aws_key \
     -e aws_secret=your_aws_secret \
     -e search_backend=sqlalchemy \
     -p 5000:5000 \
     --name registry \
     -d \
     registry

docker将会从docker hub上拉取所需的文件系统分层(fs layers)并启动守护容器(daemonised container)。

测试registry

如果上述操作奏效,你可以通过ping命令,或者查找它的内容来测试registry(虽然这个时候容器还是空的)。

我们的registry非常基础,而且没有提供任何“验明正身”的方式。因为添加身份验证可不是一件轻松事(至少我认为没有一种部署方法是简单的,像是为了证明你努力过似的),我觉得“查询/拉取/推送”仓库内容的最简单方法就是通过ssh通道的未加密连接(通过http)。

打开ssh通道的操作非常简单:

ssh -n -l 5000:localhost:5000 root@your_registry.com

这条命令建立了一条从registry服务器(前面执行docker run命令的时候我们见过它)的5000号端口到本机的5000号端口之间的 ssh 管道连接。

如果你现在用浏览器访问 ,将会看到下面这个非常简短的回复。

{}

这个意味着registry工作正常。你还可以通过登录 http://localhost:5000/v1/search 来查看registry内容,内容相似:

{
 "num_results": 2,
 "query": "",
 "results": [
  {
   "description": "",
   "name": "username/first-repo"
  },
  {
   "description": "",
   "name": "username/second-repo"
  }
 ]
}

创建一个镜像

我们现在创建一个非常简单的docker镜像,来检验我们新弄好的registry。在我们的本机上,用如下内容创建一个dockerfile(这里只有一点代码,在下一篇文章里我将会展示给你如何将一个rails应用绑定进docker容器中。):

# ruby 2.2.0 的基础镜像
from ruby:2.2.0
maintainer michelangelo chasseur <michelangelo.chasseur@touchwa.re>

并创建它:

docker build -t localhost:5000/username/repo-name .

localhost:5000这个部分非常重要:docker镜像名的最前面一个部分将告知docker push命令我们将要把我们的镜像推送到哪里。在我们这个例子当中,因为我们要通过ssh管道连接远程的私有registry,localhost:5000精确地指向了我们的registry。

如果一切顺利,当命令执行完成返回后,你可以输入docker images命令来列出新近创建的镜像。执行它看看会出现什么现象?

推送到仓库

接下来是更好玩的部分。实现我所描述的东西着实花了我一点时间,所以如果你第一次读的话就耐心一点吧,跟着我一起操作。我知道接下来的东西会非常复杂(如果你不自动化这个过程就一定会这样),但是我保证到最后你一定都能明白。在下一篇文章里我将会使用到一大波shell脚本和rake任务,通过它们实现自动化并且用简单的命令实现部署rails应用。

你在终端上运行的docker命令实际上都是使用boot2docker虚拟机来运行容器及各种东西。所以当你执行像docker push some_repo这样的命令时,是boot2docker虚拟机在与registry交互,而不是我们自己的机器。

接下来是一个非常重要的点:为了将docker镜像推送到远端的私有仓库,ssh管道需要在boot2docker虚拟机上配置好,而不是在你的本地机器上配置。

有许多种方法实现它。我给你展示最简短的一种(可能不是最容易理解的,但是能够帮助你实现自动化)

在这之前,我们需要对 ssh 做最后一点工作。

设置 ssh

让我们把boot2docker 的 ssh key添加到远端服务器的“已知主机”里面。我们可以使用ssh-copy-id工具完成,通过下面的命令就可以安装上它了:

brew install ssh-copy-id

然后运行:

ssh-copy-id -i /users/username/.ssh/id_boot2docker root@your-registry.com

用你ssh key的真实路径代替/users/username/.ssh/id_boot2docker。

这样做能够让我们免密码登录ssh。

现在我们来测试以下:

boot2docker ssh "ssh -o 'stricthostkeychecking no' -i /users/michelangelo/.ssh/id_boot2docker -n -l 5000:localhost:5000 root@registry.touchwa.re &" &

分开阐述:

boot2docker ssh允许你以参数的形式传递给boot2docker虚拟机一条执行的命令;

最后面那个&表明这条命令将在后台执行;
ssh -o 'stricthostkeychecking no' -i /users/michelangelo/.ssh/id_boot2docker -n -l 5000:localhost:5000 root@registry.touchwa.re &是boot2docker虚拟机实际运行的命令;

-o 'stricthostkeychecking no'——不提示安全问题;
-i /users/michelangelo/.ssh/id_boot2docker指出虚拟机使用哪个ssh key来进行身份验证。(注意这里的key应该是你前面添加到远程仓库的那个)

最后我们将打开一条端口5000映射到localhost:5000的ssh通道。

从其他服务器上拉取

你现在将可以通过下面的简单命令将你的镜像推送到远端仓库:

复制代码 代码如下:

docker push localhost:5000/username/repo_name 

关于“如何搭建一个私有的Docker registry”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI