2
0
mirror of https://github.com/LCTT/TranslateProject.git synced 2025-03-27 02:30:10 +08:00

PUB:20150128 Docker-2 Setting up a private Docker registry

@DongShuaike 翻译的很不错,很用心。
This commit is contained in:
wxy 2015-05-03 23:55:24 +08:00
parent 13e714d086
commit 07aa6a3079

View File

@ -2,58 +2,58 @@
================================================================================
![](http://cocoahunter.com/content/images/2015/01/docker2.jpg)
[TL;DR]这是系列的第二篇文章这系列讲述了我的公司如何把基础服务从PaaS迁移到Docker上
[TL;DR] 这是系列的第二篇文章这系列讲述了我的公司如何把基础服务从PaaS迁移到Docker上
- [First part][1]: 第一篇文章里我谈到了接触Docker之前的经历
- [Third pard][2]: 第三篇文章里我展示如何使创建images的过程自动化以及如何用Docker部署一个Rails应用。
- [第一篇文章][1]: 我谈到了接触Docker之前的经历
- [第三篇文章][2]: 我展示如何使创建镜像的过程自动化以及如何用Docker部署一个Rails应用。
----------
为什么需要搭建一个私有的registry呢Docker Hub一个Docker公共仓库只允许你拥有一个免费的私有版本库repo。其他的公司提供类似服务但是价格可不便宜。另外如果你需要部署一个基于Docker的应用产品恐怕你不希望这些images在开放的Docker Hub被公开吧!
为什么需要搭建一个私有的registry呢对于新手来说,Docker Hub一个Docker公共仓库只允许你拥有一个免费的私有版本库repo。其他的公司也开始提供类似服务,但是价格可不便宜。另外,如果你需要用Docker部署一个用于生产环境的应用恐怕你不希望将这些镜像放在公开的Docker Hub上吧!
这篇文章提供了一个非常务实的方法来处理搭建私有Docke registry时出现的各种错综复杂的情况。我们将会使用一个运行于DigitalOcean之后简称为DO的非常小巧的512MB实例。并且我会假定你已经了解了Docker的基本概念因为我必须集中精力在复杂的事情上
这篇文章提供了一个非常务实的方法来处理搭建私有Docker registry时出现的各种错综复杂的情况。我们将会使用一个运行于DigitalOcean之后简称为DO的非常小巧的512MB VPS 实例。并且我会假定你已经了解了Docker的基本概念因为我必须集中精力在复杂的事情上
###本地搭建###
首先你需要安装**boot2docker**以及docker CLI。如果你已经搭建好了基本的Docker环境你可以直接跳过这一步。
从终端运行以下命令[1][3]:
从终端运行以下命令我假设你使用OS X使用 HomeBrew 来安装相关软件,你可以根据你的环境使用不同的包管理软件来安装):
brew install boot2docker docker
如果一切顺利[2][4]你现在将能够启动VM在VM当中输入下列命令
如果一切顺利想要了解搭建docker环境的完整指南请参阅 [http://boot2docker.io/][10] ,你现在就能够通过如下命令启动一个 Docker 运行于其中的虚拟机:
boot2docker up
Follow the instructions, copy and paste the export commands that boot2docker will print in the terminal. If you now run `docker ps` you should be greeted by the following line
按照说明复制粘贴book2docker打印在终端的export命令这块翻译不太好。现在运行`docker ps`命令,终端将有以下显示。
按照屏幕显示的说明复制粘贴book2docker在终端输出的命令。如果你现在运行`docker ps`命令,终端将有以下显示。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
好了Docker已经准备就绪我们回过头去搭建registry。
好了Docker已经准备就绪,这就够了,我们回过头去搭建registry。
###创建服务器###
登录进你的DO账号选择一个提前安装好Docker的映像文件创建一个新的Drople。[^n]
登录进你的DO账号选择一个预安装了Docker的镜像文件创建一个新的Drople。本文写成时选择的是 Image > Applications > Docker 1.4.1 on 14.04
![](http://cocoahunter.com/content/images/2015/01/Screenshot-2015-01-20-18-26-14.png)
你将会以邮件的方式收到一个根用户凭证。登录进去,然后运行`docker ps`命令来查看系统状态。
### 搭建AWS S3 ###
我们现在将使用Amazo Simple Storage ServiceS3作为我们registry/repository的存储层。我们需要创建一个桶(bucket)以及用户凭证user credentials来允许我们的docker容器访问它。
我们现在将使用Amazo Simple Storage ServiceS3作为我们registry/repository的存储层。我们需要创建一个桶(bucket)以及用户凭证user credentials来允许我们的docker容器访问它。
登录到我们的AWS账号如果没有就申请一个[http://aws.amazon.com/][5]在控制台选择S3Simpole Storage Service
登录到我们的AWS账号如果没有就申请一个[http://aws.amazon.com/][5]在控制台选择S3Simpole Storage Service
![](http://cocoahunter.com/content/images/2015/01/Screenshot-2015-01-20-19-29-21.png)
点击 **Create Bucket**,为你的桶输入一个名字(把它下来,我们一会需要用到它),然后点击**Create**。
点击 **Create Bucket**,为你的桶输入一个名字(把它下来,我们一会需要用到它),然后点击**Create**。
![](http://cocoahunter.com/content/images/2015/01/Screenshot-2015-01-20-19-22-50.png)
OK!我们已经搭建好存储部分了。
OK我们已经搭建好存储部分了。
### 安装AWS访问凭证###
### 设置AWS访问凭证###
我们现在将要创建一个新的用户。退回到AWS控制台然后选择IAMIdentity & Access Management)。
@ -65,9 +65,9 @@ OK!我们已经搭建好存储部分了。
![](http://cocoahunter.com/content/images/2015/01/Screenshot-2015-01-20-19-31-42.png)
输入你的用户名(例如 docker-registry然后点击Create。写下或者下载csv文件你的Access Key以及Secret Access Key。回到你的用户列表然后选择你刚刚创建的用户。
输入一个用户名(例如 docker-registry然后点击Create。写下或者下载csv文件你的Access Key以及Secret Access Key。回到你的用户列表然后选择你刚刚创建的用户。
在Permission section下面点击Attach User Policy。之后选择Custom Policy。
在Permission section下面点击Attach User Policy。之后在下一屏选择Custom Policy。
![](http://cocoahunter.com/content/images/2015/01/Screenshot-2015-01-20-19-41-21.png)
@ -90,11 +90,11 @@ custom policy的内容如下
]
}
这个配置将允许用户也就是regitstry来对桶上的内容进行操作读/写确保使用你之前创建AWS S3时使用的桶名。总结起来当你想把你的Docker映像从你的本机推送到仓库中时服务器将能够将他们上传到S3。
这个配置将允许用户也就是regitstry来对桶上的内容进行操作读/写确保使用你之前创建AWS S3时使用的桶名。总结一下当你想把你的Docker镜像从你的本机推送到仓库中时服务器就会将他们上传到S3。
### 安装registry ###
现在回过头来看我们的DO服务器SSH登录其上。我们将要使用[^n]一个官方Docker registry映像。[6]
现在回过头来看我们的DO服务器SSH登录其上。我们将要[使用][11]一个[官方Docker registry镜像][6]。
输入如下命令开启registry。
@ -110,25 +110,25 @@ custom policy的内容如下
-d \
registry
Docker将会从Docker Hub上拉取所需的文件系统层(fs layers)并启动守护容器(daemonised container)
Docker将会从Docker Hub上拉取所需的文件系统分层fs layers并启动守护容器daemonised container
### 测试registry ###
如果上述操作奏效你可以通过ping命令或者查找它的内容来测试registry虽然这个时候容器还是空的
我们的registry非常基础而且没有提供任何“验明正身”的方式。因为添加身份验证可不是一件轻松事至少我认为没有一种部署方法是简单的像是为了证明你努力过似的我觉得 查询/拉取/推送 仓库内容的最简单方法就是通过SSH的未加密连接(通过HTTP)
我们的registry非常基础而且没有提供任何“验明正身”的方式。因为添加身份验证可不是一件轻松事至少我认为没有一种部署方法是简单的像是为了证明你努力过似的我觉得“查询/拉取/推送”仓库内容的最简单方法就是通过SSH通道的未加密连接通过HTTP
打开SSH通道的操作非常简单
ssh -N -L 5000:localhost:5000 root@your_registry.com
这条命令建立了一条从registry服务器前面执行`docker run`命令的时候我们见过它的5000号端口到本机的5000号端口之间的连接。
这条命令建立了一条从registry服务器前面执行`docker run`命令的时候我们见过它的5000号端口到本机的5000号端口之间的 SSH 管道连接。
如果你现在登录[http://localhost:5000/v1/_ping][7],将会看到下面这个非常简短的回复。
如果你现在用浏览器访问 [http://localhost:5000/v1/_ping][7],将会看到下面这个非常简短的回复。
{}
这个意味着registry工作正常。你还可以通过登录[http://localhost:5000/v1/search][8]来查看registry内容内容相似
这个意味着registry工作正常。你还可以通过登录 [http://localhost:5000/v1/search][8] 来查看registry内容内容相似
{
"num_results": 2,
@ -145,40 +145,38 @@ Docker将会从Docker Hub上拉取所需的文件系统层(fs layers)并启动
]
}
### 创建一个像 ###
### 创建一个像 ###
我们现在创建一个非常简答的Docker映来检验我们新弄好的registry。在我们的本机上用如下内容创建一个Dockerfile:[^n]
我们现在创建一个非常简单的Docker镜来检验我们新弄好的registry。在我们的本机上用如下内容创建一个Dockerfile这里只有一点代码在下一篇文章里我将会展示给你如何将一个Rails应用绑定进Docker容器中。
# Base image with ruby 2.2.0
# 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`命令我们将要把我们的image推送到哪里。在我们这个例子当中因为我们要通过SSH管道连接远端私有registry`localhost:5000`精确地表示了对我们的registry的一个引用
`localhost:5000`这个部分非常重要Docker镜像名的最前面一个部分将告知`docker push`命令我们将要把我们的镜像推送到哪里。在我们这个例子当中因为我们要通过SSH管道连接远程的私有registry`localhost:5000`精确地指向了我们的registry
如果一切顺利,当命令执行完成返回后,你可以输入`docker images`命令来列出新近创建的像。执行它看看会出现什么现象?
如果一切顺利,当命令执行完成返回后,你可以输入`docker images`命令来列出新近创建的像。执行它看看会出现什么现象?
### 推送到仓库 ###
接下来是更好玩的部分。实现我所描述的东西着实花了我一点时间,所以如果你第一次读的话就耐心一点吧,跟着我一起操作。我知道接下来的东西会非常复杂(如果你不自动化程就一定会这样但是我保证到最后你一定都能明白。在下一篇文章里我将会使用到一大波shell脚本和Rake任务通过它们实现自动化并且用简单的命令实现部署Rails应用。
接下来是更好玩的部分。实现我所描述的东西着实花了我一点时间,所以如果你第一次读的话就耐心一点吧,跟着我一起操作。我知道接下来的东西会非常复杂(如果你不自动化这个过程就一定会这样但是我保证到最后你一定都能明白。在下一篇文章里我将会使用到一大波shell脚本和Rake任务通过它们实现自动化并且用简单的命令实现部署Rails应用。
运行的docker命令都是实际上都是在boot2docker虚拟机上运行的。所以当你执行像`docker push some_repo`这样的命令时是boot2docker虚拟机在与registry交互而不是我们自己的机器。
在终端上运行的docker命令实际上都是使用boot2docker虚拟机来运行容器及各种东西。所以当你执行像`docker push some_repo`这样的命令时是boot2docker虚拟机在与registry交互而不是我们自己的机器。
接下来是一个非常重要的点为了将Docker像推送到远端的私有仓库SSH管道需要在boot2docker虚拟机上配置好。
接下来是一个非常重要的点为了将Docker像推送到远端的私有仓库SSH管道需要在boot2docker虚拟机上配置好,而不是在你的本地机器上配置
许多种方法实现它。我给你展示最简短的一种(可能不是最容易理解的,但是能够帮助你实现自动化)
许多种方法实现它。我给你展示最简短的一种(可能不是最容易理解的,但是能够帮助你实现自动化)
First of all though we need to sort one last thing with SSH.
(不太会翻译)
在这之前,我们需要对 SSH 做最后一点工作。
### Setting up SSH ###
### 设置 SSH ###
我们添加boot2docker SSH key到远端服务器已知的hosts里面。我们可以使用ssh-copy-id工具,通过下面的命令就可以安装上它了:
让我们把boot2docker 的 SSH key添加到远端服务器的“已知主机”里面。我们可以使用ssh-copy-id工具完成,通过下面的命令就可以安装上它了:
brew install ssh-copy-id
@ -188,7 +186,7 @@ First of all though we need to sort one last thing with SSH.
用你ssh key的真实路径代替`/Users/username/.ssh/id_boot2docker`。
这样做能够让我们密码登录SSH。
这样做能够让我们密码登录SSH。
现在我们来测试以下:
@ -196,26 +194,23 @@ First of all though we need to sort one last thing with SSH.
分开阐述:
- `boot2docker ssh`允许你以参数的形式传递给boot2docker虚拟机一条执行命令
- `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'`——不提示安全问题;
- `-o 'StrictHostKeyChecking no'`——不提示安全问题;
- `-i /Users/michelangelo/.ssh/id_boot2docker`指出虚拟机使用哪个SSH key来进行身份验证。注意这里的key应该是你前面添加到远程仓库的那个
- 最后我们将打开一条端口5000到本地端口5000的SSH通道。
- 最后我们将打开一条端口5000映射到localhost:5000的SSH通道。
### 从其他服务器上拉取 ###
你现在将可以通过下面的简单命令将你的像推送到远端仓库:
你现在将可以通过下面的简单命令将你的像推送到远端仓库:
docker push localhost:5000/username/repo_name
在下一篇文章[9]中我们将会了解到如何自动化处理这些事务并且真正地容器化一个Rails应用。请继续收听
在下一篇[文章][9]中我们将会了解到如何自动化处理这些事务并且真正地容器化一个Rails应用。请继续收听
如有错误请不吝指出。祝你Docker之路顺利
1. 我假设你使用OS X。
2. 想要了解搭建docker环境的完整之南请参阅[http://boot2docker.io/][10]。
3. 本文写成时选择的是 Image > Applications > Docker 1.4.1 on 14.04。
4. [https://github.com/docker/docker-registry/][11]
5. 这是一个存根在下一篇文章里我将会展示给你如何将一个Rails应用绑定进Docker容器中。
--------------------------------------------------------------------------------
@ -223,12 +218,12 @@ via: http://cocoahunter.com/2015/01/23/docker-2/
作者:[Michelangelo Chasseur][a]
译者:[DongShuaike](https://github.com/DongShuaike)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出
[a]:http://cocoahunter.com/author/michelangelo/
[1]:http://cocoahunter.com/2015/01/23/docker-1/
[1]:https://linux.cn/article-5339-1.html
[2]:http://cocoahunter.com/2015/01/23/docker-3/
[3]:http://cocoahunter.com/2015/01/23/docker-2/#fn:1
[4]:http://cocoahunter.com/2015/01/23/docker-2/#fn:2