本指南旨在让工程师能轻松自动的在digital ocean服务器上,利用wercker 平台进行相关应用的部署。
什么是wercker ?简单地说,wercker 就是一个能让你简单的将很多应用以容器化的方式自动化的进行部署的平台,即使你现在搞不懂wercker具体是什么,也不用在意,我们会在下面的文字里慢慢讲解。
在本教程开始之前,我假设读者已经将你的相关应用程序代码提交到类似于github/bitbucket这样的托管平台上了—如果还没有的话,那么建议你先提交代码,在回头来读这篇文章。
当你在向git发起一个推送时,wercker 会将你的应用程序会容器化并且会被推送至Docker Hub注册表(把它想象成像github一样的容器),一旦你的应用程序被wercker 推送后,你的digital ocean服务器就会自动下载新版本的容器,删除老旧版本,并开始自动运行新版本容器—这一切不都用你做任何干涉,听起来很酷吧?下面我们来体验一下。
如果你碰巧没有wercker 和Docker Hub账户,那现在就应该开始创建一个了。
首先,创建一个新的wercker应用,并将其链接到你的github/bitbucket库中。
为了使wercker能同时与你的 Docker Hub注册表和Digital Ocean服务器同时进行通讯,你需要添加一些环境变量以及添加一个ssh密钥。
在应用设置下,点击“环境变量”,添加两个新的变量,分别为“DOCKER_USERNAME”和“DOCKER_PASSWORD”,切记设置“DOCKER_PASSWORD”为保护模式。
转到SSH KEY部分,生产一对名叫“digitalocean’”的新密钥,然后复制出公钥,后面在设置你的Digital Ocean服务器时会用的上。
转到目标部分,单击“添加部署目标”,在选中“自定义部署”,设置一个名字,如“production”,并且将其设置在“master”上为自动部署(这一个其实并不是必选项,但是选择后会在你后期利用wercker部署应用省掉手动部署的麻烦)。
在完成设置target后,你需要添加上一步中生成的公钥了。点击“add new variable”,将其命名为“DIGITAL_OCEAN_KEY”,选择“SSH key pair”并选中“digitalocean’”。
Digital Ocean使得设置docker变得简单。只需要简单的点击“reate Droplet”,然后选择“One-click apps”并选中docker即可。
在开始创建droplet之前,请先在“Add your SSH keys”中单击“new”,并将你在第二步中复制出来的公钥粘贴进来。
这时就可以创建droplet,Digital Ocean就会开始工作了。
wercker.yml文件包含一组指令,wercker通过这组指令将你的应用编译并生成一个容器。我们将每组指令称之为管道,每个指令称之为step,但是我们将集中讲解部署管道。
在根目录下创建一个 wercker.yml文件,并使用你喜欢的编辑器打开。
文件的第一行中需要添加的是一个基础镜像,wercker将通过这个镜像创建一个容器,如果你自己创建一个nodeJS 应用的话,那么他看起来像是这样的:
box: node
如果你要创建一个Python应用,你可能会用“box: python”这样的语法,或者会同时像这样声明版本“box: python:2.7.11”。
现在我们就可以定义两个管道了,编译个部署–其实编译管道非常简单:
build:编译
# The steps that will be executed on build
steps:
# A step that executes `npm install` command
— npm-install
如你所见,到目前为止我们只用了一步而已,在这里面,你可以添加测试,语法分析以及任何你想要加入的东西。
下面我们看看后面的几个步骤是怎么样的:
deploy:
steps:
— npm-install
— script:
name: install supervisor
code: npm install -g supervisor
— internal/docker-push:
username: $DOCKER_USERNAME
password: $DOCKER_PASSWORD
repository: <username>/<app-name>
ports: ""
cmd: /bin/bash -c “cd /pipeline/source && supervisor — watch ./src src/server.js”
首先,我会运行npm-install,然后,我会安装一个监视器,以便于在应用出现崩溃时,它可以自动重启。
第三步就是最有意思的地方了-这一步比较特殊,通过一个内部的机制你可以将容器推动到Docker hub中。在库中,将 和 替换成你Docker Hub 中的用户名和应用名称。同时将替换成你应用所需要使用的端口。
在命令行模式下,我们首先将工作目录切换到/pipeline/source目录下(wercker将我们的应用放在容器中的位置),同时运行主命令使应用运行。但是这命令目前还没有运行,它被放在容器中-这意味着一旦我们将容器和管道开启后,docker会自动运行它。
剩下的两步我们会添加的是:
-添加ssh密钥
keyname: DIGITAL_OCEAN
-添加已知主机
hostname:
为了能访问droplet,首先我们添加已经定义好的target的ssh密钥。然后将我们自己的服务器添加到已知主机中-将 替换成droplet主机的IP地址。
下面我们要做的:
- script:
name: pull latest image
code: ssh root@ docker pull davegri/librestock:latest
— script:
name: stop running container
code: ssh root@ docker stop name> || echo ‘failed to stop running container’
— script:
name: remove stopped container
code: ssh root@ docker rm name> || echo ‘failed to remove stopped container’
— script:
name: remove image behind stopped container
code: ssh root@ docker rmi /name>:current || echo ‘failed to remove image behind stopped container’
— script:
name: tag newly pulled image
code: ssh root@ docker tag /name>:latest /name>:current
— script:
name: run new container
code: ssh root@ docker run -d -p 8080:by app> --name /:current
剩下的就是等待奇迹发生的时刻了,别担心,其实它本身比看起来还要简单。
由于这些命令是在我们的主机上执行的,所以所有的命令都是以“ssh root@”开始的。当然千万不要忘记了将 , 和 的值替换为实际使用的值。
- 首先我们将获取(更新)最新版本的容器(就是我们之前上传的那个版本)
- 然后我们将现目前运行的容器停止
- 然后将刚刚停止的容器删除掉
- 下一步最主要的工作就是清理了,当我们在获取(更新)一个docker容器时,其实我们是将一个用于创建容器的镜像获取到(更新)本地了,而这些镜像是会占用很多硬盘空间的,所以这一步主要工作是将这些老旧的镜像删除以释放空间。
- 现在我们将给新获取(更新)到的镜像进行相关标注,这样以方便下一次删除镜像时的辨认。
- 最后我们运行新的容器,注意,我们的应用开放8080端口,-d标识表明在容器运行后我们将容器进程断开(主要目的是让它在后台运行),-name标识是给容器起个名字,以便于我们能轻松识别它并进行相关的停止/删除/重启工作。
就是这样:)
提交你的 wercker.yml,并将其推送到 master branch,当wercker 编译时注意你的项目首页,然后在将你的应用部署到Digital Ocean上。