3.5 使用 Dockerfiles
Deis 支持通过 Dockerfiles 部署应用程序。一个 Dockerfile 能自动化制作一个 Docker 镜像的步骤。Dockerfiles 是难以置信的强大,但是要求一些额外的工作来定义你需要的应用程序运行环境。
预先准备应用程序
如果你没有一个已经存在的应用程序,你可以 clone 一个示例应用程序来证明 Dockerfile 工作流。
$ git clone https://github.com/deis/helloworld.git
$ cd helloworld
Dockerfile 要求
为了部署 Dockerfile 应用程序,它们必须是的以下的需求一致:
- Dockerfile 必须暴露(EXPOSE)仅仅一个端口
- 暴露的端口必须是一个 HTTP 服务,可以连接到一个 HTTP router
- 必须为正在运行的容器规定一个默认的 CMD
注意
Dockerfiles 暴露超过一个端口将在 issue 1156 讨论(hit)。
创建一个应用程序
使用 deis create
在 Controller 创建一个应用程序。
$ deis create
Creating application... done, created folksy-offshoot
Git remote deis added
使用 push 部署
使用 git push deis master
部署你的应用程序。
$ git push deis master
Counting 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 image
Uploading context 4.096 kB
Uploading context
Step 0 : FROM deis/base:latest
---> 60024338bc63
Step 1 : MAINTAINER OpDemand <info@opdemand.com>
---> Using cache
---> 2af5ad7f28d6
Step 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
---> cf9ef8c5caa7
Step 3 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz
---> Using cache
---> 515b1faf3bd8
Step 4 : RUN mkdir -p /go
---> Using cache
---> ebf4927a00e9
Step 5 : ENV GOPATH /go
---> Using cache
---> c6a276eded37
Step 6 : ENV PATH /usr/local/go/bin:/go/bin:$PATH
---> Using cache
---> 2ba6f6c9f108
Step 7 : ADD . /go/src/github.com/deis/helloworld
---> 94ab7f4b977b
Removing intermediate container 171b7d9fdb34
Step 8 : RUN cd /go/src/github.com/deis/helloworld && go install -v .
---> Running in 0c8fbb2d2812
github.com/deis/helloworld
---> 13b5af931393
Removing intermediate container 0c8fbb2d2812
Step 9 : ENV PORT 80
---> Running in 9b07da36a272
---> 2dce83167874
Removing intermediate container 9b07da36a272
Step 10 : CMD ["/go/bin/helloworld"]
---> Running in f7b215199940
---> b1e55ce5195a
Removing intermediate container f7b215199940
Step 11 : EXPOSE 80
---> Running in 7eb8ec45dcb0
---> ea1a8cc93ca3
Removing intermediate container 7eb8ec45dcb0
Successfully built ea1a8cc93ca3
-----> Pushing image to private registry
Launching... done, v2
-----> folksy-offshoot deployed to Deis
http://folksy-offshoot.local.deisapp.com
To learn more, use `deis help` or visit http://deis.io
To ssh://git@local.deisapp.com:2222/folksy-offshoot.git
* [new branch] master -> master
$ curl -s http://folksy-offshoot.local.deisapp.com
Welcome to Deis!
See the documentation at http://docs.deis.io/ for more information.
因为一个 Dockerfile 应用程序被检测到,在第一次部署的时,cmd
进程类型被自动扩展成 1。
定义进程类型
Docker 容器有默认的命令,通常由 CMD 指令规定。Deis 使用 cmd
进程类型引用这个默认命令。
Deis 也支持扩展其他的进程类型(process types)定义在一个 Procfile。为了使用这个功能,你必须:
- 使用你的 repository root 目录的 Procfile 定义进程类型(process types)
- 包含一个 start 可执行程序,可以使用
start <process-type>
调用