Docker部署SDN环境

DockOne 发表了文章 • 0 个评论 • 3117 次浏览 • 2014-12-04 17:28 • 来自相关话题

感谢作者李呈的投稿。 #前言 5月份的时候,当我还是一个大学生的时候,有个网友问我,你有研究Docker吗?当时我连Docker是什么都不知道。谷歌之后,对Docker产生兴趣,但是一直没有时间去学习。这个周终于将这个学习计划列入了To ...查看全部
感谢作者李呈的投稿。
#前言
5月份的时候,当我还是一个大学生的时候,有个网友问我,你有研究Docker吗?当时我连Docker是什么都不知道。谷歌之后,对Docker产生兴趣,但是一直没有时间去学习。这个周终于将这个学习计划列入了Todolist。所以我花了3天时间,认真地把这《Docker 从入门到实践》看完并实践了一遍,收获颇丰。虽然我的导师以及我自己还是觉得我在瞎转,而且我觉得没有方向的日子很痛苦。所以只好自己做计划,学习点新知识,打打基础了。本篇内容主要介绍什么是Docker、Docker简单入门以及如何使用Docker部署SDN环境,以及docker的网络配置等内容。What is Docker和Why Docker部分摘自《Docker从入门到实践》。
#What is Docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
virtualization.png

docker.png

图1:Docker和虚拟机对比
#Why Docker
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
##更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
##更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
##更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
##更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
#Docker简单入门
谷歌出来的教程实在太多了。所以我也不打算太多介绍,只讲一些我觉得对于网络研究人员而言比较有用的命令。
##基本概念
镜像(Image):镜像是一个只读模板。用户上传制作好的镜像供其他人下载使用。用户可以基于镜像去创建Container。
容器(Container):容器可以理解为一个隔离起来的linux环境,用于运行应用,Namespace可以帮助你理解。
仓库(Repository):如果你会使用Git/Github的话,不难理解,就是用于存放镜像的场所。
##Docker安装
本文的实验环境是Ubuntu14.04-amd64。非常需要注意的一点是,目前Docker只支持64位机器。Ubuntu14.04安装方式有两种:1)通过系统自带包安装和2)通过Docker源安装。推荐第二种方式,能安装比较新的版本。
```shell
sudo apt-get install apt-transport-https
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker
```
#获取镜像
首先,推荐到注册帐号,这样可以向使用Git/Github那样使用Docker/Dockerhub。注册和登陆可通过如下命令完成:
```shell
docker login```
注册之后,可以通过如下命令进行搜索,如搜索ryu:
```shell
docker search ryu```

可以从搜索结果中的Star来确定资源的好坏,从而找到合适的images,如muzixing/ryu。然后使用如下命令,将其拉到本地:
```shell
docker pull muzixing/ryu```

下载完成后,可以通过如下命令查看已存在的images
```shell
docker images```
7f593341jw1emxdzs4wf6j20qp04rdh0.jpg

图2:images
#创建容器
创建容器使用示例如下,-t=tty, -i=interactive, -d=debug, -p=port, --name 可以用于命名container。 其他的命令可以通过--help来查看。
```shell
docker run -i -t --name muzixing/ryu:SDN /bin/bash```
如果你需要对端口映射,或者网络配置方面的设置,还需要仔细去查看手册。举例如下:
```shell
docker run -i -t -p :: --name muzixing/ryu:SDN /bin/bash```
以上命令创建并运行了一个名字叫的container,并且将容器内部的端口port映射到主机的某个port,完成了端口映射,允许外网访问容器。这是容器与外界通信的方式之一。如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 /etc/default/docker 中指定 DOCKER_OPTS="--ip=IP_ADDRESS",之后重启 Docker 服务即可生效。设置网络访问的参数默认是 --icc=ture,如果--icc=false,则禁止网络访问。
查看容器:
```shell
docker ps [-opt]```

-a为全部容器。
查看打印信息可以通过:
```shell
dokcer logs ```
暂停容器:
```shell
docker stop ```
开启暂停的容器:
```shell
docker start ```
重启容器:
```shell
docker restart ```
有时候我们开启了容器,但是没有开窗口,在后台运行,可以通过一下命令进入容器:
```shell
docker attach ```
#部署SDN控制器RYU
首先获取镜像:
```shell
docker pull muzixing/ryu```
然后创建容器,并将容器的6633端口绑定到主机的6633端口。
```shell
docker run -i -t -p 0.0.0.0:6633:6633 --name ryu3.15 muzixing/ryu:SDN /bin/bash```
进入容器之后,运行ryu.
在另一个能ping通运行容器主机的机器上运行mininet.
7f593341jw1emxf7rriqyj20k10cp75p.jpg

图3:mininet运行图
从上图可以看出控制器IP是172.16.192.128。这个IP地址的主机网卡信息如下:
7f593341jw1emxdzrwx4nj20k20jadkv.jpg

图4:Host地址信息
从图上可以看出,与mininet通信的是主机(实际情况下会是某台服务器)eth0的地址。但是从下面的图中看出运行的RYU地址是172.17.0.5。为什么可以通信呢?

图5:容器信息
因为做了端口映射,将主机的所有接口的6633端口的地址都转发到容器172.17.0.5的6633端口,从而完成数据通信。其实现的原理是:Docker在启动之后,会创建一个docker0的网桥,从图4可以看到。然后还会创建veth pair。其中一端挂载在网桥上,如图4的vethba5f9f3,另一端是容器的网卡eth0,此案例中是172.17.0.5的网卡。其实这相当与一个link。原理图如下:
7f593341jw1emxfusmbzoj20l30dhmy1.jpg

图6:Docker网络通信原理
在运行容器的主机上使用iptables命令查看nat规则:
7f593341jw1emxf7rim1mj20jj082dh5.jpg

图7:iptables查看NAT。
同理mininet,或者其他的应用程序也可以使用容器部署,不再赘述,读者可自行尝试。
#上传镜像
首先需要将部署了应用的容器导出为tar文件。可以使用docker export container > file 命令。举例如下:
```shell
docker export ryu3.15 > ryu.tar ```
然后使用docker import命令将其导入为镜像:
```shell
cat ryu.tar | sudo docker import - muzixing/ryu:sdn```
以上命令为读取ryu.tar 将其导入成muzixing/ryu:sdn的image。完成之后可通过docker images查看。
确保无误之后,可将其推送到Dockerhub。
```shell
docker push muzixing/ryu```
读者也可以尝试更好的自动创建方式。
#网络配置
我们完全可以将Docker理解成一个独立的主机,可以对其网络进行配置,如配置DNS,iptables等。可以通过启动时配置,也可以通过修改文件的方式配置。

-b BRIDGE or --bridge=BRIDGE --指定容器挂载的网桥
--bip=CIDR --定制 docker0 的掩码
-H SOCKET... or --host=SOCKET... --Docker 服务端接收命令的通道
--icc=true|false --是否支持容器之间进行通信
--ip-forward=true|false --请看下文容器之间的通信
--iptables=true|false --禁止 Docker 添加 iptables 规则
--mtu=BYTES --容器网络中的 MTU

文件配置则如同正常的主机配置,进入到/etc/目录下,修改制定文件即可。同样的,Dokcer可以配置网络链接的网桥,可以不选择docker0网桥,而选择其他网桥,如使用brctl创建的网桥,或者使用OpenvSwitch创建的网桥,具体操作不再赘述。
#后语
工欲善其事,必先利其器。Docker可以允许我们更灵活地使用资源,并且可以很方便地迁移环境。比如以后需要安装RYU的同学就不需要再去关注,为什么six版本不够?为什么gcc报错这些问题了。只需要有一台64位的机器,然后安装docker,理论上是不会有错的。然后将镜像下载下来,创建并运行容易,就可以得到ryu控制器运行的环境。同理Nginx,Tornado和MySQL等软件也可以直接获取,而不需要自己安装配置环境。这大大加快了生产环境的部署,也显著提高了资源的利用率,个人认为将在未来对虚拟机产生强烈的冲击。

【Deis文档】使用Deis之管理应用程序

DockOne 发表了文章 • 0 个评论 • 2863 次浏览 • 2014-12-03 20:08 • 来自相关话题

【Deis文档】使用Deis之配置一个应用程序

DockOne 发表了文章 • 0 个评论 • 2853 次浏览 • 2014-12-03 20:06 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 一个 Deis 应用程序[在环境变量中存储配置][1] 配置一个应用程序 为已经已部署的应用程序使用 `deis config` 来修改环境变 ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

一个 Deis 应用程序[在环境变量中存储配置][1]
配置一个应用程序
为已经已部署的应用程序使用 `deis config` 来修改环境变量。
```
$ deis help config
Valid commands for config:
config:list list environment variables for an app
config:set set environment variables for an app
config:unset unset environment variables for an app
config:pull extract environment variables to .env
Use `deis help [command]` to learn more
```
当配置改变了,一个新发行版被创建和被自动部署。
附加的支持服务
Deis 把支持服务如数据库(databases), 缓存(caches) 和 队列(queues)看作是[附加资源][2]。
比如,使用 ` deis config` 设置一个 DATABASE_URL,给应用程序附加一个外部的 PostgreSQL 数据库。
```
$ deis config:set DATABASE_URL=postgres://user:pass@example.com:5432/db
=== peachy-waxworks
DATABASE_URL: postgres://user:pass@example.com:5432/db
```
执行 `deis config:unset` 拆分。
定制域名
你可以使用 `deis domains` 来添加或移除定制的域名到你的应用程序。
```
$ deis domains:add hello.bacongobbler.com
Adding hello.bacongobbler.com to finest-woodshed... done
```
一旦完成这个,你可以进入你的 DNS 注册商,并从新的应用名字到旧的设置一个 CNAME。
```
$ dig hello.deisapp.com
[...]
;; ANSWER SECTION:
hello.bacongobbler.com. 1759 IN CNAME finest-woodshed.deisapp.com.
finest-woodshed.deisapp.com. 270 IN A 172.17.8.100
```

注意
为你的根域名设置一个 CNAME 会引起问题。设置你的 @ 记录作为一个 CNAME 会引起所有的流量到其他的域名,包括 mail 和 SOA(“start-of-authority”)记录。高度推荐你给应用程序绑定一个子域名,不管怎样,你可以通过指定 @ 记录到负载均衡的地址来变通。
追踪变化
每次对你的应用程序做了一次构建或是配置变更,一个[新版本][3]被创建。使用 `deis releases` 追踪你应用程序的变化。
```
$ deis releases
=== peachy-waxworks Releases
v4 3 minutes ago gabrtv deployed d3ccc05
v3 1 hour 17 minutes ago gabrtv added DATABASE_URL
v2 6 hours 2 minutes ago gabrtv deployed 7cb3321
v1 6 hours 2 minutes ago gabrtv deployed deis/helloworld
```
回滚应用程序
使用 ` deis rollback` 来恢复到前面的版本
```
$ deis rollback v2
Rolled back to v2
$ deis releases
=== folksy-offshoot Releases
v5 Just now gabrtv rolled back to v2
v4 4 minutes ago gabrtv deployed d3ccc05
v3 1 hour 18 minutes ago gabrtv added DATABASE_URL
v2 6 hours 2 minutes ago gabrtv deployed 7cb3321
v1 6 hours 3 minutes ago gabrtv deployed deis/helloworld
```
[quote] 注意
所有的发行版(包括回滚)都会追加到发行分类。

[/quote]


[1]: http://12factor.net/config
[2]: http://12factor.net/backing-services
[3]: http://docs.deis.io/en/latest/reference/terms/release/#release

【Deis文档】使用Deis之使用 Docker 镜像

DockOne 发表了文章 • 0 个评论 • 2689 次浏览 • 2014-12-03 20:04 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 Deis 支持通过使用一个已经存在的 [Docker 镜像][1]来部署应用程序。这对于把 Deis 集成到基于 Docker 的 CI/CD pipelines 中非 ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

Deis 支持通过使用一个已经存在的 [Docker 镜像][1]来部署应用程序。这对于把 Deis 集成到基于 Docker 的 CI/CD pipelines 中非常有用。
提取准备应用程序
从 clone 一个示例应用程序开始:
```
$ git clone https://github.com/deis/example-go.git
$ cd example-go
$ git checkout docker
```
下一步使用你本地的 docker 客户端来构建镜像并 push 到 [DockerHub][2]。
```
$ docker build -t /example-go .
$ docker push /example-go
```
# Docker 镜像要求
为了部署 Docker 镜像,它们必须使以下的要求一致:
    []Dockerfile 必须暴露(EXPOSE)仅仅一个端口[/][]暴露的端口必须是一个 HTTP 服务,可以连接到一个 HTTP router[/][]必须为正在运行的容器规定一个默认的 CMD[/]

注意
Dockerfiles 暴露超过一个端口将在 issue 1156 讨论(hit)。
创建一个应用程序
使用 `deis create` 在 [Controller][3] 上创建一个应用程序。
```
$ mkdir -p /tmp/example-go && cd /tmp/example-go
$ deis create
Creating application... done, created example-go
```
[quote] 注意
deis 客户端使用当前目录的名字作为默认的应用名
部署应用程序
使用 `deis pull` 从 [DockerHub][4] 或一个私有 registry 部署你的应用程序。
```
$ deis pull gabrtv/example-go:latest
Creating build... done, v2
$ curl -s http://example-go.local3.deisapp.com
Powered by Deis
```
因为你正在部署一个 Docker 镜像,在第一次部署时,cmd 进程类型是自动扩展到 1。
> 注意
很快就会支持 Docker registry 身份校验
定义进程类型
Docker 容器有默认的命令,通常由 [CMD 指令][4]规定。Deis 使用 `cmd` 进程类型引用这个默认命令。
当使用 Docke 镜像时,进程类似除了 cmd 其他是不支持的。

[/quote]


[1]: https://docs.docker.com/introduction/understanding-docker/
[2]: https://registry.hub.docker.com/
[3]: http://docs.deis.io/en/latest/reference/terms/controller/#controller
[4]: https://registry.hub.docker.com/

【Deis文档】使用Deis之使用 Dockerfiles

DockOne 发表了文章 • 0 个评论 • 2828 次浏览 • 2014-12-02 21:52 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 Deis 支持通过 Dockerfiles 部署应用程序。一个 [Dockerfile][1] 能自动化制作一个 [Docker 镜像][2]的步骤。Dockerfil ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

Deis 支持通过 Dockerfiles 部署应用程序。一个 [Dockerfile][1] 能自动化制作一个 [Docker 镜像][2]的步骤。Dockerfiles 是难以置信的强大,但是要求一些额外的工作来定义你需要的应用程序运行环境。
预先准备应用程序
如果你没有一个已经存在的应用程序,你可以 clone 一个示例应用程序来证明 Dockerfile 工作流。
```
$ git clone https://github.com/deis/helloworld.git
$ cd helloworld
```
# Dockerfile 要求
为了部署 Dockerfile 应用程序,它们必须是的以下的需求一致:
    []Dockerfile 必须暴露(EXPOSE)仅仅一个端口[/][]暴露的端口必须是一个 HTTP 服务,可以连接到一个 HTTP router[/][]必须为正在运行的容器规定一个默认的 CMD[/]
[quote] 注意Dockerfiles 暴露超过一个端口将在 issue 1156 讨论(hit)。 创建一个应用程序使用 `deis create ` 在 [Controller][3] 创建一个应用程序。```$ deis createCreating application... done, created folksy-offshootGit remote deis added``` 使用 push 部署使用 `git push deis master` 部署你的应用程序。
$ git push deis masterCounting objects: 13, done.Delta compression using up to 8 threads.Compressing objects: 100% (13/13), done.Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done.Total 13 (delta 2), reused 0 (delta 0)-----> Building Docker imageUploading context 4.096 kBUploading contextStep 0 : FROM deis/base:latest ---> 60024338bc63Step 1 : MAINTAINER OpDemand  ---> Using cache ---> 2af5ad7f28d6Step 2 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz ---> Using cache ---> cf9ef8c5caa7Step 3 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz ---> Using cache ---> 515b1faf3bd8Step 4 : RUN mkdir -p /go ---> Using cache ---> ebf4927a00e9Step 5 : ENV GOPATH /go ---> Using cache ---> c6a276eded37Step 6 : ENV PATH /usr/local/go/bin:/go/bin:$PATH ---> Using cache ---> 2ba6f6c9f108Step 7 : ADD . /go/src/github.com/deis/helloworld ---> 94ab7f4b977bRemoving intermediate container 171b7d9fdb34Step 8 : RUN cd /go/src/github.com/deis/helloworld && go install -v . ---> Running in 0c8fbb2d2812github.com/deis/helloworld ---> 13b5af931393Removing intermediate container 0c8fbb2d2812Step 9 : ENV PORT 80 ---> Running in 9b07da36a272 ---> 2dce83167874Removing intermediate container 9b07da36a272Step 10 : CMD ["/go/bin/helloworld"] ---> Running in f7b215199940 ---> b1e55ce5195aRemoving intermediate container f7b215199940Step 11 : EXPOSE 80 ---> Running in 7eb8ec45dcb0 ---> ea1a8cc93ca3Removing intermediate container 7eb8ec45dcb0Successfully built ea1a8cc93ca3-----> Pushing image to private registry[/quote]       Launching... done, v2-----> folksy-offshoot deployed to Deis       http://folksy-offshoot.local.deisapp.com       To learn more, use `deis help` or visit http://deis.ioTo ssh://git@local.deisapp.com:2222/folksy-offshoot.git * [new branch]      master -> master$ curl -s http://folksy-offshoot.local.deisapp.comWelcome to Deis!See the documentation at http://docs.deis.io/ for more information.
因为一个 Dockerfile 应用程序被检测到,在第一次部署的时,`cmd` 进程类型被自动扩展成 1。 定义进程类型Docker 容器有默认的命令,通常由 [CMD 指令][4]规定。Deis 使用 `cmd` 进程类型引用这个默认命令。Deis 也支持扩展其他的进程类型(process types)定义在一个 [Procfile][5]。为了使用这个功能,你必须:[list=1][]使用你的 repository root 目录的 Procfile 定义进程类型(process types)[/][]包含一个 start 可执行程序,可以使用 `start ` 调用[/]



[1]: https://docs.docker.com/reference/builder/
[2]: https://docs.docker.com/introduction/understanding-docker/
[3]: http://docs.deis.io/en/latest/reference/terms/controller/#controller
[4]: https://docs.docker.com/reference/builder/#cmd
[5]: https://devcenter.heroku.com/articles/procfile

【Deis文档】使用Deis之使用 Buildpacks

DockOne 发表了文章 • 0 个评论 • 3784 次浏览 • 2014-12-02 21:49 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 Deis 支持通过 [Heroku Buildpacks][1] 部署应用程序。如果你对 遵循 Heroku 构建应用程序的最佳实践有兴趣或是你正在部署一个已经运行在 ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

Deis 支持通过 [Heroku Buildpacks][1] 部署应用程序。如果你对 遵循 Heroku 构建应用程序的最佳实践有兴趣或是你正在部署一个已经运行在 Heroku 上的应用程序,那么 Buildpacks 是非常有用的。
预先准备应用程序
如果你没有一个已经存在的应用程序,你可以 clone 一个示例应用程序,证明 Heroku Buildpack 工作流。
```
$ git clone https://github.com/deis/example-ruby-sinatra.git
$ cd example-ruby-sinatra
```
创建一个应用程序
使用 `deis create` 在 [Controller][2] 创建一个应用程序。
```
$ deis create
Creating application... done, created unisex-huntress
Git remote deis added
```
使用 push 来部署
使用 `git push deis master` 来部署你的应用程序:
$ git push deis master
Counting objects: 95, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (52/52), done.
Writing objects: 100% (95/95), 20.24 KiB | 0 bytes/s, done.
Total 95 (delta 41), reused 85 (delta 37)
-----> Ruby app detected
-----> Compiling Ruby/Rack
-----> Using Ruby version: ruby-1.9.3
-----> Installing dependencies using 1.5.2
Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
Fetching gem metadata from http://rubygems.org/..........
Fetching additional metadata from http://rubygems.org/..
Using bundler (1.5.2)
Installing tilt (1.3.6)
Installing rack (1.5.2)
Installing rack-protection (1.5.0)
Installing sinatra (1.4.2)
Your bundle is complete!
Gems in the groups development and test were not installed.
It was installed into ./vendor/bundle
Bundle completed (8.81s)
Cleaning up the bundler cache.
-----> Discovering process types
Procfile declares types -> web
Default process types for Ruby -> rake, console, web
-----> Compiled slug size is 12M
-----> Building Docker image
Uploading context 11.81 MB
Uploading context
Step 0 : FROM deis/slugrunner
---> 5567a808891d
Step 1 : RUN mkdir -p /app
---> Running in a4f8e66a79c1
---> 5c07e1778b9e
Removing intermediate container a4f8e66a79c1
Step 2 : ADD slug.tgz /app
---> 52d48b1692e5
Removing intermediate container e9dfce920e26
Step 3 : ENTRYPOINT ["/runner/init"]
---> Running in 7a8416bce1f2
---> 4a18f93f1779
Removing intermediate container 7a8416bce1f2
Successfully built 4a18f93f1779
-----> Pushing image to private registry

Launching... done, v2

-----> unisex-huntress deployed to Deis
http://unisex-huntress.local.deisapp.com

To learn more, use `deis help` or visit http://deis.io

To ssh://git@local.deisapp.com:2222/unisex-huntress.git
* [new branch] master -> master

$ curl -s http://unisex-huntress.local.deisapp.com
Powered by Deis!

因为一个 Heroku 风格的应用程序被检测到了,web 进程类型第一次部署自动被扩展到 1。
已经包含的 Buildpacks
为了方便起见,许多 buildpacks 与 Deis 捆绑在一起:
- [Ruby Buildpack][3]
- [Nodejs Buildpack][4]
- [Java Buildpack][5]
- [Gradle Buildpack][6]
- [Grails Buildpack][7]
- [Play Buildpack][8]
- [Python Buildpack][9]
- [PHP Buildpack][10]
- [Clojure Buildpack][11]
- [Scala Buildpack][12]
- [Go Buildpack][13]
- [Multi Buildpack][14]
Deis 将重复循环每个 buildpack 的 `bin/detect` 脚本来匹配你正在发布的代码。
使用定制的 Buildpack
为了使用一个定制的 buildpack,设置 ` BUILDPACK_URL` 环境变量。
```
$ deis config:set BUILDPACK_URL=https://github.com/dpiddy/heroku-buildpack-ruby-minimal
Creating config... done, v2
=== humble-autoharp
BUILDPACK_URL: https://github.com/dpiddy/heroku-buildpack-ruby-minimal
```
在你下一步的 `git push`,定制的 buildpack 将被使用。



[1]: https://devcenter.heroku.com/articles/buildpacks
[2]: http://docs.deis.io/en/latest/reference/terms/controller/#controller
[3]: https://github.com/heroku/heroku-buildpack-ruby
[4]: https://github.com/heroku/heroku-buildpack-nodejs
[5]: https://github.com/heroku/heroku-buildpack-java
[6]: https://github.com/heroku/heroku-buildpack-gradle
[7]: https://github.com/heroku/heroku-buildpack-grails
[8]: https://github.com/heroku/heroku-buildpack-play
[9]: https://github.com/heroku/heroku-buildpack-python
[10]: https://github.com/deis/heroku-buildpack-php
[11]: https://github.com/heroku/heroku-buildpack-clojure
[12]: https://github.com/heroku/heroku-buildpack-scala
[13]: https://github.com/kr/heroku-buildpack-go
[14]: https://github.com/heroku/heroku-buildpack-multi

【Deis文档】使用Deis之部署应用程序

DockOne 发表了文章 • 0 个评论 • 3504 次浏览 • 2014-12-02 21:43 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 使用 `git push` 或者是 deis 客户端 部署应用程序到 Deis。 支持的应用程序 Deis 可以部署任何能运行在 Docker ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

使用 `git push` 或者是 deis 客户端 部署应用程序到 Deis。
支持的应用程序
Deis 可以部署任何能运行在 Docker 容器中应用程序或服务。为了可以水平的扩展,应用程序必须遵循 Heroku 的[十二要素方法学][1](twelve-factor methodology)并在外部的后台服务存储状态。
例如,如果你的应用程序状态持久化在本地文件系统 -- 通用的内容管理系统像 Wordpress 和 Drupal -- 它不可能使用 `deis` 水平扩展。
幸运地是,大部分现代应用程序的特性是无状态的,可以在 Deis 中水平的扩展。
登录 Controller
在部署一个应用程序前,用户首先必须对 `Deis Controller` 做身份校验。
```
$ deis login http://deis.example.com
username: deis
password:
Logged in as deis
```

注意:对于 Vagrant 集群:deis login http://deis.local3.deisapp.com



选择一个构建方法
Deis 支持三种不同的方式构建应用程序:
1. Heroku Buildpacks
2. Dockerfiles
3. Docker Images
# Buildpacks
如果你想遵循关于 Heroku 部署程序的最佳实践或者你想从 Heroku 移植一个应用程序,Heroku buildpacks 是非常有用的。
学习在 Deis 上怎样[使用 Buildpacks][2] 部署应用程序。
# Dockerfiles
Dockerfiles 是一种强大的用来定义一个基于你选择的 OS 的便携式执行环境的方式。
学习在 Deis 上怎样[使用 Dockerfiles][3] 部署应用程序。
# Docker 镜像
部署一个 Docker 镜像到 Deis 上,允许你不论是从公有或是私有的 registry 获取一个 Docker 镜像并复制它。确保你在开发环境或是你的 CI pipeline 运行着相同的镜像,如同你是在生产环境一样。
学习在 Deis 上怎样[使用 Docker 镜像][4]部署应用程序


[1]: http://12factor.net/
[2]: http://docs.deis.io/en/latest/using_deis/using-buildpacks/#using-buildpacks
[3]: http://docs.deis.io/en/latest/using_deis/using-dockerfiles/#using-dockerfiles
[4]: http://docs.deis.io/en/latest/using_deis/using-docker-images/#using-docker-images

【Deis文档】使用Deis之注册用户

DockOne 发表了文章 • 0 个评论 • 2731 次浏览 • 2014-12-02 21:36 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 为了使用 Deis,你必须首先在 [Controller][1] 上注册一个用户。 注册一个 Controller 使用 `deis regi ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

为了使用 Deis,你必须首先在 [Controller][1] 上注册一个用户。
注册一个 Controller
使用 `deis register` 和 [Controller][2] URL(你的 Deis administrator 支持的) 来创建一个新账号。你将自动登录。
你使用的域应该与你使用 `deisctl config platform` 中设置的 `domain=` 相匹配。注意你需要一直使用 `deis.` 来与你的 controller 通信。
```
$ deis register http://deis.example.com
username: myuser
password:
password (confirm):
email: myuser@example.com
Registered myuser
Logged in as myuser
```

注意
对于 Vagrant 集群: deis register http://deis.local3.deisapp.com
----
[quote] 重要
注册到 Deis 的第一个用户拥有“superuser”权限
上传你的 SSH 公钥
如果你计划使用 `git push` 来部署你的应用程序到 Deis,你必须提供的 SSH 公钥。使用 `deis keys:add` 命令来上传你默认的 SSH 公钥,通常是其中之一:

    []~/.ssh/id_rsa.pub[/][]~/.ssh/id_dsa.pub[/]
```
$ deis keys:add
Found the following SSH public keys:
1) id_rsa.pub
Which would you like to use with Deis? 1
Uploading /Users/myuser/.ssh/id_rsa.pub to Deis... done
```
从 Controller 退出
使用 `deis logout` 从一个已经存在的 controller 会话退出。
```
$ deis logout
Logged out as deis
```
登录 Controller
如果你已经有一个账号,使用 ` deis login` 来校验身份登录 Deis [Controller][3]。
```
$ deis login http://deis.example.com
username: deis
password:
Logged in as deis
```
> 注意
对于 Vagrant 集群:deis login http://deis.local3.deisapp.com
---
> 重要
Deis 会话(session)信息是存储在你的用户的 `~/.deis` 目录。

[/quote]



[1]: http://docs.deis.io/en/latest/reference/terms/controller/#controller
[2]: http://docs.deis.io/en/latest/reference/terms/controller/#controller
[3]: http://docs.deis.io/en/latest/reference/terms/controller/#controller

【Deis文档】使用Deis之安装客户端

DockOne 发表了文章 • 0 个评论 • 3013 次浏览 • 2014-12-02 21:33 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 Deis 命令行接口(CLI),或者客户端,允许你与 Deis [Controller][1] 交互。你必须通过安装客户端来使用 Deis。 安装 Dei ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

Deis 命令行接口(CLI),或者客户端,允许你与 Deis [Controller][1] 交互。你必须通过安装客户端来使用 Deis。
安装 Deis 客户端
在 Linux 或 Mac OS X 上安装最新版的 `Deis` 客户端:
```
$ curl -sSL http://deis.io/deis-cli/install.sh | sh
```
安装程序把 `Deis` 放在你的当前目录,但是你应该把它移到你的 `$PATH`。
代理支持
设置 `http_proxy or https_proxy` 环境变量开启代理支持:
```
$ export http_proxy="http://proxyip:port"
$ export https_proxy="http://proxyip:port"
```
综合帮助
Deis 客户端为每个命令自带综合的文档,使用 `deis help` 帮助你查看可用的命令:
$ deis help
The Deis command-line client issues API calls to a Deis controller.
Usage: deis [...]
Auth commands::
register register a new user with a controller
login login to a controller
logout logout from the current controller
Subcommands, use ``deis help [subcommand]`` to learn more::
...

为了获取子命令的帮助信息,使用 `deis help [subcommand]`:
$ deis help apps
Valid commands for apps:

apps:create create a new application
apps:list list accessible applications
apps:info view info about an application
apps:open open the application in a browser
apps:logs view aggregated application logs
apps:run run a command in an ephemeral app container
apps:destroy destroy an application
Use `deis help [command]` to learn more




[1]: http://docs.deis.io/en/latest/reference/terms/controller/#controller

【Deis文档】管理Deis之添加和删除主机

DockOne 发表了文章 • 0 个评论 • 3667 次浏览 • 2014-11-26 21:48 • 来自相关话题

注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。 大多数的组件都能很好的处理新机器加入的情况。然而当机器从集群中被移除的时候需要我们留意,因为deis的存储(store)组件充当着后端存储的作用,Deis所有有状态性的 ...查看全部
注:本文翻译自Deis官方文档,无任何商业目的,转载请注明出处。

大多数的组件都能很好的处理新机器加入的情况。然而当机器从集群中被移除的时候需要我们留意,因为deis的存储(store)组件充当着后端存储的作用,Deis所有有状态性的数据都存在其中,这些数据是Deis正常运行的保障。
请留意这些说明遵循Ceph文档中的删除监控(removing monitors)和删除OSD(removing OSDs)的部分。假如这些说明与Ceph的文档有明显的出入,应该优先以Ceph的文档为准,并且我们十分感激你能给我们提交一个更新文档的pull request。
因为Ceph使用的时Paxos算法,在集群中有足够多的监控器(monitors)以达到大多数(majority)的状态至关重要。可以是1:1,2:3, 3:4, 4:6等等。推荐尽可能在删除一个老的节点之前,先把新的节点添加进集群。
本文档将会假定一个三节点集群的情况。我们将会添加第四个节点到集群中,然后删除第一个节点。
检测健康状态
----------
在我们开始之前,我们应该检查Ceph集群的状态,保证其状态是正常的。我们可以登录到集群中的任意机器上,进入一个存储(store)容器,然后查询Ceph的状态:
```shell
core@deis-1 ~ $ nse deis-store-monitor
root@deis-1:/# ceph -s
cluster 20038e38-4108-4e79-95d4-291d0eef2949
health HEALTH_OK
monmap e3: 3 mons at {deis-1=172.17.8.100:6789/0,deis-2=172.17.8.101:6789/0,deis-3=172.17.8.102:6789/0}, election epoch 16, quorum 0,1,2 deis-1,deis-2,deis-3
mdsmap e10: 1/1/1 up {0=deis-2=up:active}, 2 up:standby
osdmap e36: 3 osds: 3 up, 3 in
pgmap v2096: 1344 pgs, 12 pools, 369 MB data, 448 objects
24198 MB used, 23659 MB / 49206 MB avail
1344 active+clean
```
从pgmap那一部分可以看到我们有1344个安置组(placement groups),并且全部都处于active(激活)+clean(干净)的状态。好极了!
添加一个节点
-----------
要添加一个节点到Deis集群,只需要配置一个新的CoreOS机器,在cloud-config文件中制定同样的etcd探索路径。你可以运行`fleetctl list-machines`来进行确认。
因为存储(store)组件是全局的单元(unit),他们会自动的在新的节点上启动。
一旦新的机器开始运行,我们可以再次检测Ceph集群的健康状态:
```bash
root@deis-1:/# ceph -s
cluster 20038e38-4108-4e79-95d4-291d0eef2949
health HEALTH_WARN 4 pgs recovering; 7 pgs recovery_wait; 31 pgs stuck unclean; recovery 325/1353 objects degraded (24.021%); clock skew detected on mon.deis-4
monmap e4: 4 mons at {deis-1=172.17.8.100:6789/0,deis-2=172.17.8.101:6789/0,deis-3=172.17.8.102:6789/0,deis-4=172.17.8.103:6789/0}, election epoch 20, quorum 0,1,2,3 deis-1,deis-2,deis-3,deis-4
mdsmap e11: 1/1/1 up {0=deis-2=up:active}, 3 up:standby
osdmap e40: 4 osds: 4 up, 4 in
pgmap v2172: 1344 pgs, 12 pools, 370 MB data, 451 objects
29751 MB used, 34319 MB / 65608 MB avail
325/1353 objects degraded (24.021%)
88 active
7 active+recovery_wait
1245 active+clean
4 active+recovering
recovery io 2302 kB/s, 2 objects/s
client io 204 B/s wr, 0 op/s
```
留意我们处在`HEALTH_WARN`的状态,并且我们有安置组正在修复。Ceph正在向新节点拷贝数据。在它完成之前我们可以一直查询其状态。然后,我们会看到如下状态:
```bash
root@deis-1:/# ceph -s
cluster 20038e38-4108-4e79-95d4-291d0eef2949
health HEALTH_OK
monmap e4: 4 mons at {deis-1=172.17.8.100:6789/0,deis-2=172.17.8.101:6789/0,deis-3=172.17.8.102:6789/0,deis-4=172.17.8.103:6789/0}, election epoch 20, quorum 0,1,2,3 deis-1,deis-2,deis-3,deis-4
mdsmap e11: 1/1/1 up {0=deis-2=up:active}, 3 up:standby
osdmap e40: 4 osds: 4 up, 4 in
pgmap v2216: 1344 pgs, 12 pools, 372 MB data, 453 objects
29749 MB used, 34324 MB / 65608 MB avail
1344 active+clean
client io 409 B/s wr, 0 op/s
```
状态又恢复成了`HEALTH_OK`,并且注意以下的部分:
```bash
monmap e4: 4 mons at {deis-1=172.17.8.100:6789/0,deis-2=172.17.8.101:6789/0,deis-3=172.17.8.102:6789/0,deis-4=172.17.8.103:6789/0}, election epoch 20, quorum 0,1,2,3 deis-1,deis-2,deis-3,deis-4
mdsmap e11: 1/1/1 up {0=deis-2=up:active}, 3 up:standby
osdmap e40: 4 osds: 4 up, 4 in
```
我们有四个监控器,OSD,和元数据服务器!Hooray!
注意:
如果你用了自定义的防火墙脚本,你应该再次运行这个脚本,并且重启你的节点以让iptables删除重复的条目。
删除一个节点
----------
当从一个运行着deis存储组件的集群中删除一个节点的时候,你应该告诉Ceph这个主机上的存储服务即将从集群中移除。在这个例子中,我们将会把第一个节点deis-1移除。该主机的IP地址为172.17.8.100。
# 删除一个OSD
在我们通知Ceph去移除一个OSD之前,我们需要得到OSD的ID。我们可以通过从etcd中得到:
```bash
core@deis-2 ~ $ etcdctl get /deis/store/osds/172.17.8.100
2
```
注意:在一些情形下,我们可能不知道主机的IP地址或者主机名,如果这样我们可以使用`ceph osd tree`来查看当前集群的状况。这会列出集群中所有的OSD,并且报告出哪些主机已经离线。
现在我们有了OSD的ID,让我们开始移除的工作吧。我们需要处在集群中的一个存储容器的终端(除开我们正要移除的这个主机)。在这个例子中,我将使用`deis-2`主机。
```bash
core@deis-2 ~ $ nse deis-store-monitor
root@deis-2:/# ceph osd out 2
marked out osd.2.
```
这会让Ceph开始把安置组从哪个OSD移动到另外一个主机上。我们可以使用`ceph -w`查看这个过程:
```shell
root@deis-2:/# ceph -w
cluster 20038e38-4108-4e79-95d4-291d0eef2949
health HEALTH_WARN 4 pgs recovery_wait; 151 pgs stuck unclean; recovery 654/1365 objects degraded (47.912%); clock skew detected on mon.deis-4
monmap e4: 4 mons at {deis-1=172.17.8.100:6789/0,deis-2=172.17.8.101:6789/0,deis-3=172.17.8.102:6789/0,deis-4=172.17.8.103:6789/0}, election epoch 20, quorum 0,1,2,3 deis-1,deis-2,deis-3,deis-4
mdsmap e11: 1/1/1 up {0=deis-2=up:active}, 3 up:standby
osdmap e42: 4 osds: 4 up, 3 in
pgmap v2259: 1344 pgs, 12 pools, 373 MB data, 455 objects
23295 MB used, 24762 MB / 49206 MB avail
654/1365 objects degraded (47.912%)
151 active
4 active+recovery_wait
1189 active+clean
recovery io 1417 kB/s, 1 objects/s
client io 113 B/s wr, 0 op/s
```
```
2014-11-04 06:45:07.940731 mon.0 [INF] pgmap v2260: 1344 pgs: 142 active, 3 active+recovery_wait, 1199 active+clean; 373 MB data, 23301 MB used, 24757 MB / 49206 MB avail; 619/1365 objects degraded (45.348%); 1724 kB/s, 0 keys/s, 1 objects/s recovering
2014-11-04 06:45:17.948788 mon.0 [INF] pgmap v2261: 1344 pgs: 141 active, 4 active+recovery_wait, 1199 active+clean; 373 MB data, 23301 MB used, 24757 MB / 49206 MB avail; 82 B/s rd, 0 op/s; 619/1365 objects degraded (45.348%); 843 kB/s, 0 keys/s, 0 objects/s recovering
2014-11-04 06:45:18.962420 mon.0 [INF] pgmap v2262: 1344 pgs: 140 active, 5 active+recovery_wait, 1199 active+clean; 373 MB data, 23318 MB used, 24740 MB / 49206 MB avail; 371 B/s rd, 0 B/s wr, 0 op/s; 618/1365 objects degraded (45.275%); 0 B/s, 0 keys/s, 0 objects/s recovering
2014-11-04 06:45:23.347089 mon.0 [INF] pgmap v2263: 1344 pgs: 130 active, 5 active+recovery_wait, 1209 active+clean; 373 MB data, 23331 MB used, 24727 MB / 49206 MB avail; 379 B/s rd, 0 B/s wr, 0 op/s; 572/1365 objects degraded (41.905%); 2323 kB/s, 0 keys/s, 4 objects/s recovering
2014-11-04 06:45:37.970125 mon.0 [INF] pgmap v2264: 1344 pgs: 129 active, 4 active+recovery_wait, 1211 active+clean; 373 MB data, 23336 MB used, 24722 MB / 49206 MB avail; 568/1365 objects degraded (41.612%); 659 kB/s, 2 keys/s, 1 objects/s recovering
2014-11-04 06:45:40.006110 mon.0 [INF] pgmap v2265: 1344 pgs: 129 active, 4 active+recovery_wait, 1211 active+clean; 373 MB data, 23336 MB used, 24722 MB / 49206 MB avail; 568/1365 objects degraded (41.612%); 11 B/s, 3 keys/s, 0 objects/s recovering
2014-11-04 06:45:43.034215 mon.0 [INF] pgmap v2266: 1344 pgs: 129 active, 4 active+recovery_wait, 1211 active+clean; 373 MB data, 23344 MB used, 24714 MB / 49206 MB avail; 1010 B/s wr, 0 op/s; 568/1365 objects degraded (41.612%)
2014-11-04 06:45:44.048059 mon.0 [INF] pgmap v2267: 1344 pgs: 129 active, 4 active+recovery_wait, 1211 active+clean; 373 MB data, 23344 MB used, 24714 MB / 49206 MB avail; 1766 B/s wr, 0 op/s; 568/1365 objects degraded (41.612%)
2014-11-04 06:45:48.366555 mon.0 [INF] pgmap v2268: 1344 pgs: 129 active, 4 active+recovery_wait, 1211 active+clean; 373 MB data, 23345 MB used, 24713 MB / 49206 MB avail; 576 B/s wr, 0 op/s; 568/1365 objects degraded (41.612%)
```
最终,集群将会恢复成干净的状态。同时状态也会显示为`HEALTH_OK`。然后我们可以停止守护进程。因为存储单元是全局的单元,我们不能指定某一个让它停止,我们而是应该登进该主机并且告诉Docke停止该容器。
小提示:请确保你登陆进的是你要从集群中移除的那个主机。
```bash
core@deis-1 ~ $ docker stop deis-store-daemon
deis-store-daemon
```
回到deis-2主机上的存储容器,我们终于可以移除OSD了:
```bash
core@deis-2 ~ $ nse deis-store-monitor
root@deis-2:/# ceph osd crush remove osd.2
removed item id 2 name 'osd.2' from crush map
root@deis-2:/# ceph auth del osd.2
updated
root@deis-2:/# ceph osd rm 2
removed osd.2
```
同时作为清理工作,我们也应该吧OSD从etcd中删除。
```bash
core@deis-2 ~ $ etcdctl rm /deis/store/osds/172.17.8.100
```
搞定!如果我们现在检测健康状态,我们可以看到现在又有三个osd了。并且所有的安置组都是active+clean的状态。
```bash
core@deis-2 ~ $ nse deis-store-monitor
root@deis-2:/# ceph -s
cluster 20038e38-4108-4e79-95d4-291d0eef2949
health HEALTH_OK
monmap e4: 4 mons at {deis-1=172.17.8.100:6789/0,deis-2=172.17.8.101:6789/0,deis-3=172.17.8.102:6789/0,deis-4=172.17.8.103:6789/0}, election epoch 20, quorum 0,1,2,3 deis-1,deis-2,deis-3,deis-4
mdsmap e11: 1/1/1 up {0=deis-2=up:active}, 3 up:standby
osdmap e46: 3 osds: 3 up, 3 in
pgmap v2338: 1344 pgs, 12 pools, 375 MB data, 458 objects
23596 MB used, 24465 MB / 49206 MB avail
1344 active+clean
client io 326 B/s wr, 0 op/s
```
## 移除一个监控器(monitor)
移除一个监控器容易的多。首先我们需要移除etcd中的条目,这样任何使用Ceph的客户端将不会使用该监控器来进行连接:
```bash
$ etcdctl rm /deis/store/hosts/172.17.8.100
```
在5秒内,confd将会在所有的存储客户端上运行,并且把该监控器从ceph.conf配置文件中删除。
```
core@deis-1 ~ $ docker stop deis-store-monitor
deis-store-monitor
```
回到另一个主机,我们又可以进入一个存储容器然后移除这个监控器:
```bash
core@deis-2 ~ $ nse deis-store-monitor
root@deis-2:/# ceph mon remove deis-1
removed mon.deis-1 at 172.17.8.100:6789/0, there are now 3 monitors
2014-11-04 06:57:59.712934 7f04bc942700 0 monclient: hunting for new mon
2014-11-04 06:57:59.712934 7f04bc942700 0 monclient: hunting for new mon
```
注意接下来可能会报错,这种情形很正常,当Ceph客户端无法与一个监控器进行通信。重要的是我们需要看到`removed mon.deis-1 at 172.17.8.100:6789/0, there are now 3 monitors.`一行。
最后,让我们检测集群的健康状态:
```bash
root@deis-2:/# ceph -s
cluster 20038e38-4108-4e79-95d4-291d0eef2949
health HEALTH_OK
monmap e5: 3 mons at {deis-2=172.17.8.101:6789/0,deis-3=172.17.8.102:6789/0,deis-4=172.17.8.103:6789/0}, election epoch 26, quorum 0,1,2 deis-2,deis-3,deis-4
mdsmap e17: 1/1/1 up {0=deis-4=up:active}, 3 up:standby
osdmap e47: 3 osds: 3 up, 3 in
pgmap v2359: 1344 pgs, 12 pools, 375 MB data, 458 objects
23605 MB used, 24455 MB / 49206 MB avail
1344 active+clean
client io 816 B/s wr, 0 op/s
```
搞定了!
# 移除一个元数据(metadata)服务器
和守护进程一样,我们将会停止元数据服务的容器。
小提示:确保你登进去的主机是你要从集群中移除的主机。
```bash
core@deis-1 ~ $ docker stop deis-store-metadata
deis-store-metadata
```
这就是唯一需要的一步。ceph提供了一个`ceph mds rm`命令。但是没有提供其文档,参见:
http://docs.ceph.com/docs/giant/rados/operations/control/#mds-subsystem
# 将主机从etcd中移除
etcd集群仍然有我们已经删除的主机的条目,因此我们需要删除该条目。这可以通过像etcd API发送请求来完成。详情参考“移除主机(removing machines)”。