阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

搭建一个私有的Docker registry

101次阅读
没有评论

共计 5304 个字符,预计需要花费 14 分钟才能阅读完成。

搭建一个私有的 Docker registry

[TL;DR] 这是系列的第二篇文章,这系列讲述了我的公司如何把基础服务从 PaaS 迁移到 Docker 上

  • 第一篇文章: 我谈到了接触 Docker 之前的经历;
  • 第三篇文章: 我展示如何使创建镜像的过程自动化以及如何用 Docker 部署一个 Rails 应用。

为什么需要搭建一个私有的 registry 呢?嗯,对于新手来说,Docker Hub(一个 Docker 公共仓库)只允许你拥有一个免费的私有版本库(repo)。其他的公司也开始提供类似服务,但是价格可不便宜。另外,如果你需要用 Docker 部署一个用于生产环境的应用,恐怕你不希望将这些镜像放在公开的 Docker Hub 上吧!

这篇文章提供了一个非常务实的方法来处理搭建私有 Docker registry 时出现的各种错综复杂的情况。我们将会使用一个运行于 DigitalOcean(之后简称为 DO)的非常小巧的 512MB VPS 实例。并且我会假定你已经了解了 Docker 的基本概念,因为我必须集中精力在复杂的事情上!

 

本地搭建

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

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

  1. brew install boot2docker docker

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

  1. boot2docker up

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

  1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

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

 

创建服务器

登录进你的 DO 账号,选择一个预安装了 Docker 的镜像文件,创建一个新的 Drople。(本文写成时选择的是 Image > Applications > Docker 1.4.1 on 14.04)

搭建一个私有的 Docker registry

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

 

搭建 AWS S3

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

登录到我们的 AWS 账号(如果没有,就申请一个 http://aws.amazon.com/),在控制台选择 S3(Simpole Storage Service)。

搭建一个私有的 Docker registry

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

搭建一个私有的 Docker registry

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

 

设置 AWS 访问凭证

我们现在将要创建一个新的用户。退回到 AWS 控制台然后选择 IAM(Identity & Access Management)。

搭建一个私有的 Docker registry

在 dashboard 的左边,点击 Users。然后选择 Create New Users

如图所示:

搭建一个私有的 Docker registry

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

在 Permission section 下面,点击 Attach User Policy。之后在下一屏,选择 Custom Policy。

搭建一个私有的 Docker registry

custom policy 的内容如下:

  1. {
  2. "Version":"2012-10-17",
  3. "Statement":[
  4. {
  5. "Sid":"SomeStatement",
  6. "Effect":"Allow",
  7. "Action":[
  8. "s3:*"
  9. ],
  10. "Resource":[
  11. "arn:aws:s3:::docker-registry-bucket-name/*",
  12. "arn:aws:s3:::docker-registry-bucket-name"
  13. ]
  14. }
  15. ]
  16. }

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

 

安装 registry

现在回过头来看我们的 DO 服务器,SSH 登录其上。我们将要使用一个官方 Docker registry 镜像。

输入如下命令,开启 registry。

  1. docker run \
  2. -e SETTINGS_FLAVOR=s3 \
  3. -e AWS_BUCKET=bucket-name \
  4. -e STORAGE_PATH=/registry \
  5. -e AWS_KEY=your_aws_key \
  6. -e AWS_SECRET=your_aws_secret \
  7. -e SEARCH_BACKEND=sqlalchemy \
  8. -p 5000:5000 \
  9. --name registry \
  10. -d \
  11. registry

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

 

测试 registry

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

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

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

  1. ssh -N -L 5000:localhost:5000 root@your_registry.com

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

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

  1. {}

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

  1. {
  2. "num_results":2,
  3. "query":"",
  4. "results":[
  5. {
  6. "description":"",
  7. "name":"username/first-repo"
  8. },
  9. {
  10. "description":"",
  11. "name":"username/second-repo"
  12. }
  13. ]
  14. }

 

创建一个镜像

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

  1. # ruby 2.2.0 的基础镜像
  2. FROM ruby:2.2.0
  3. MAINTAINER MichelangeloChasseur<michelangelo.chasseur@touchwa.re>

并创建它:

  1. 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 工具完成,通过下面的命令就可以安装上它了:

  1. brew install ssh-copy-id

然后运行:

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

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

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

现在我们来测试以下:

  1. 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 通道。

 

从其他服务器上拉取

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

  1. docker push localhost:5000/username/repo_name

在下一篇文章中,我们将会了解到如何自动化处理这些事务,并且真正地容器化一个 Rails 应用。请继续收听!

如有错误,请不吝指出。祝你 Docker 之路顺利!

CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm 

Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm 

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm 

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm

在 Ubuntu Trusty 14.04 (LTS) (64-bit)安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm 

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm 

Ubuntu 14.04 安装 Docker  http://www.linuxidc.com/linux/2014-08/105656.htm 

阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm 

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-05/117000.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计5304字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中