如何使用ker部署GoWeb应用程序_第1页
如何使用ker部署GoWeb应用程序_第2页
如何使用ker部署GoWeb应用程序_第3页
如何使用ker部署GoWeb应用程序_第4页
如何使用ker部署GoWeb应用程序_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、熟悉docker如何提升你在构建、测试并部署go web应用程序的方式,并几理解如何 使川semaphore來持续部署。简介人多数情况下go应用程序被编译成单个二进制文件,web应用程序则会包括模版和 配置文件。而当一个项目中有很多文件的时候,由于很多文件没有同步就会导致错误的发4: 并且产生很多的问题。在本教程111,你将啓习如何使用docker部署个go web应用程序,并且认识到docker 将如何改进你的开发工作流及部署流程。各种规模的团队都会从这里所介绍的设置中受益。冃标在本文结束后,你将:o对docker有基本的了解,o发现在docker将如何帮助你开发go应用程序o学习如何为一个

2、生产环境中的go应川程序创建docker容器o知道如何使用semaphore持续地在你的服务器上部署docker容器先决条件为了学习本教程,你讲需要:o在你的主机或者服务器上安装dockero具有一台能够使用ssh密钥对ssh请求进行认证的服务器理解dockerdocker帮助你为应用程序创建一个单独的可部署单元。这个单元,也被称为容器,包 含该应用程序需要的所有东西。它包括代码(或者二进制文件)、untime (运行环境)、 系统工具盒系统库。将所有必需的资源打包成个单元将确保无论应用程序部署到哪里都有 完全相同的坏境。这也有助于维护一个完全相同的开发和牛产配置,这在以前是很难追踪的。一旦开

3、始,容器的创建和部署将自动完成。它消除了一大类问题。这些问题主要是山 于文件没有同步或者开发和牛产环境z间的差异导致的。docker帮助解决了这些问题。相比于虚拟机的优势容器提供了与虚拟机相似的资源分配和隔离优势。然而,相同z处仅此而已。一个虚拟机需要它自己的客户操作系统而容器共享主机操作系统的内核。这意味着容 器更加轻量而月需要更少的资源。从木质上讲,一个虚拟机是操作系统中的一个操作系统。 而另一方面的容器则更像是操作系统中的其它应用程序。棊木上,容器需要的资源(内存、 磁盘空间等等)比虚拟机少很多,并旦具有比虚拟机快很多的启动时间。docker在开发阶段的优势在开发屮使用docker的优势

4、包括:o 一个用于所有团队成员的标准开发环境。更新的依赖性集中化以及在任何地方都能使用相同的容器o在开发和生产中完全相同的环境。修复了可能只会出现在生产环境中的潜在问题为什么使用docker运行一个go web应用程序?多数go应用程序时简单的二进制文件。这就引发一个问题一为什么使用docker运行 一个go应用程序? 一些使用docker运行go的理由包括:o web应用程序通常都有模版和配置文件。docker有助于保持这些文件与二进制文件 的同步o docker确保了在开发或生产中完全相同的配置。很多吋候当应用程序可以在开发环 境中正常工作吋,在生产环境去无法正常工作。使用docker则把

5、你从对这些问题的担心中 解放了出來。o在一个人型的团队小主机、操作系统及所安装的软件可能存在很大的不同。docker 提供了 种机制来确保致的开发环境配置。这将提升团队的生产力并tl在开发阶段减少冲 突和可避免问题的发生。创建一个简单的go web应用程序在本文中味了演示,我们会用go创建一个简单的web应用程序。这个我们称z为mathapp的应用程序将:o探索不同数学运算的路径0在视图中使川html模版o使用一个可配置的文件来定制化该应用程序o包含所选功能的测试访问/sum/3/6将显示一个包含3与6相加后结果的页面。同样的,访问/product/3/6 将显示一个3和6乘积的页面。在本文中

6、我们使用beego框架。请注意你可以为你的应用亨旭使用任何框架(或者什 么也不用)。最终的目录结构完成之后,mathapp的目录结构应该看起来如下:mathapp |conf |1app.conf |main.go |main_test.go 1views|泊 valid-route.html 1result.html我们假设mathapp h录位于/ app h录z中。应用程序的主文件时main.go,为主应用程序的根目录屮。这个文件包含该应用的所 有功能。一些main.go屮的功能是使用main_test.go来测试的。views文件夹中包含视图文件invald-route.html和re

7、sult.html。配置文件app.conf 位于conf文件夹川。beego使用该文件來定制化应用程序。应用程序文件的内容应用程序主文件(main.go)包含所有的应用程序逻辑。该文件的内容如下:*/ main.go*package* main*import* (”strconv” ” the main function defines a single route, its handler*/ and starts listening on port 8080 (default port for beego)*func* main() */* this would match routes

8、 like the following:*/sum/3/5*/product/6/23*.*/*beego.router(7:operation/:num1 :int/:num2:inr, smaincontroller) beego.run()* this is the controller that this application uses*type* maincontroller *struct* beego.controller*/ get() handles all requests to the route defined above*func* (c *maincontroll

9、er) get() */obtain the values of the route parameters defined in the route above* operation := c.ctxput.param(n:operation”)num1, _ := strconv.atoi(c.ctx.lnput.param(”:num1”)num2, _ := strconv.atoi(c.ctx.lnput.param(n:num2n) */set the values for use in the template* c.data"operation” = operation

10、 c.data”num1” = num1 c.data”num?' = num2 c.tpiname = "result.html” */ perform the calculation depending on the 'operation' route parameter* *switch* operation *case* "sum”: c.datahresulth = add(num1, num2) *case* "product": c.datahresultn = multiply(num1, num2) "

11、default卄:c.tpiname = "invalid-route.html" *func* add(n1, n2 int) int *return* n1 + n2*func* multiply(n1, n2 int) int *return* n1 * n2在你的应用程序中,它可能被分割到多个文件中。然而,针对木教程的目的,我们希 望事情简单化。测试文件的内容main.go文件有一些需要测试的功能。对于这些功能的测试可以在main_test.go小找 到。该文件的内容如下:/ main_test.gopackagemainimport ”testing”functe

12、stsum(t *testing.t) if add(2, 5) != 7 t.fail()if add(2, 100) != 102 t.fail()if add(222, 100) != 322 t.fail()functestproduct(t *testing.t) if multiply(2, 5) != 10 t.fail()if multiply(2, 100) != 200 t.fail()if multiply(222, 3) != 666 t.fail()如果你想进行持续的部署,那么对你的应用程序进行测试是特别有用的。如果你有了足够的测试,那么你可以持续地部署而不必担心在你

13、的应川程序屮出现错谋。视图文件内容视图文件时html模版。应川程序使川它们來显示对请求的应答。result.html的内容如下:v! result.html -><!- this file is used to display the result of calculations -xidoctype html><html><headxtitle>mathapp .operation</title></head><body> the .operation of .num1 and .num2 is.result<

14、;/bodyx/html>invalid-route.html 的内容如下:<!- invalid-route.html -><!- this file is used when an invalid operation is specified in the route -xidoctype html><html><headxtitle>mathapp</title><meta name="viewport,'content=”width=devicewidth, initial-scale=1&quo

15、t;><meta charset=,utf-8"x/headxbody invalid operation</bodyx/html>配置文件的内容app.conf是beego用于配置应用程序的文件。它的内容如下:;app.confappname = mathapphttpport = 8080runmode = dev在这个文件中:o appname是应川程序将要运行的进程的名字o httpport是应用程序将要监听的的端口 runmode声明了应用程序将要运行的模式。有效的指包括dev用于开发而prod用于生产。在开发中使用docker本节将介绍在开发过程中

16、使用docker的好处,并且向你展示在开发中使用docker的必须步骤。配置docker用于开发我们将使用dockerfile来配置docker以便用于开发。针对开发坏境,对其的配置应该满足以下的要求:o我们将使用上一节所提及的应用程序o这些文件无论从容器的内部还是外部都可以访问o我们将使用beego 口带的bee工具。它用丁在开发过程中在线地重新加载应用程序(在docker容器的内部)o docker将为应用程序开放8080端口o在我们的主机上,m用程序保存在/app/mathapp屮o在docker容器中,应用程序保存在/go/src/mathapp中我们将为开发所创建的docker im

17、age的名字是ma-imageo我们将要运行的docker容器的名字是mainstance步骤一一创建dockerfile如下的dockerfile可以满足以上的要求:*from* golang:1.6*# install beego and the bee dev tool*run* go get go get expose the application on port 8080*expose* 8080*# set the entry point of the container to the bee command that runs the*# application and wat

18、ches for changes*cmd* ”bee”,”run”第一行,from golang:1.6将go的官方映像文件作为基础映像。该映像文件预安装了 go 1.6 该映像已经把$gopath的值设宜到了 /go。所有安装在/go/src'l'的包将能够被go命令访问。第二行,run go get go get 安装beego包和bee工具。beego包将在应用程序中使用。bee丄具用语在开发中 再现地重新加载我们的代码。第三行,expose 8080在开发主机上利用容器为应用程序开放8080端口。最后一行,cmd ,beeu, hrunn使用bee命令启动应用程序的在线

19、重新加载。步骤二一构建image一旦创建了 docker file,运行如下的命令来创建image:docker build t ma-image .执行以上的命令将创建名为ma-image的image。该image现在可以用于使用该应用 程序的任何人。这将确保这个团队能够使用一个统一的开发环境。为了查看你的系统上的image列花运行如下的命令:docker images这行该命令将输出与以下类似的内容:repository tag image id created sizema-image latest 8d53aa0dd0cb 31 seconds ago 784.7 mbgolang 1

20、.6 22a6ecf1f7cc 5 days ago 743.9 mb注意image的确切名字和编号可能不同,但是,你应该至少看到列表屮有golang和 ma-image image。步骤三一运行容器一旦maimage已经完成,你町以使用以下的命令启动一个容器:docker run -it -rm -name ma-instance -p 8080:8080 /-v /app/mathapp:/go/src/mathapp -w /go/src/mathapp ma-image让我们分析一下上而的命令来看看它做了什么。o docker run命令用于从一个image上启动一个容器o -it标签

21、以交互的方式启动容器orm标签在容器关闭后将会将英清除oname ma-instance 将容器命名为 mainstaneeo -p 8080:8080标签允许通过8080端口访问该容器o -v /app/mathapp:/go/src/mathapp 更复杂些。它将主机的/app/mathapp 映射到容器中的/go/src/mathapp.这将使得开发文件在容器的内部和外部都可以访问。o ma-image部分声明了用于容器的image。执行以上的命令将启动docker容器。该容器为你的应用程序开发了 8080端ii。无论 何时你做了变更,它都将白动地重构你的应用程序。你将在console

22、(控制台)上看到以下 的输出:bee :1.4.1beego :1.6.1go :go version go1.6 linux/amd642016/04/10 13:04:15 info uses 'mathapp' as 'appname'2016/04/10 13:04:15 info initializingwatcher.2016/04/10 13:04:15 trac directory(/go/src/mathapp)2016/04/10 13:04:15 info start building.2016/04/10 13:04:18 succ bu

23、ild was successful2016/04/10 13:04:18 info restarting mathapp .2016/04/10 13:04:18 info ./mathapp is running.2016/04/10 13:04:18 asm_amd64.s: 1998i http server running on :8080为了检查相关的设进,可以在浏览器中访问。你讲看到与卜面类似的东西:-c d localhost:8080/sum/4/5the sum of 4 and 5 is 9注意:这里假定你是在使用木地主机步骤四一开发应用程序现在,让我们看看这将如何在开发

24、阶段提供帮助。在完成以下的操作时请确保容器在运行。在# main.go #文件中,将第34行: c.data,operationh = operation改成:c.data"operatiort = "real" + operation在你保存修改的一刻,你讲看到类似以卜的输出:2016/04/10 13:17:51 even ,7go/src/mathapp/main.go,*: mod ify2016/04/10 13:17:51skip 7go/src/mathapp/main.goh: mod ify2016/04/10 13:17:52 info sta

25、rt building.2016/04/10 13:17:56 succ build was successful2016/04/10 13:17:56 inforestarting mathapp .2016/04/10 13:17:56 info ./mathapp is running.2016/04/10 13:17:56 asm_amd64.s: 1998i http server running on :8080为了检查该变更,在你的浏览器中访问。你将看到类似下面的输出:g t g q localhost:8080/sum/4/5the real sum of 4 and 5 is

26、 9如你所见,你的应用程序在保存了修改之麻自动地编译并提供了服务。在生产中使用docker木节将讲解如何在一个docker容器小部署go应用程序。我们将使用semaphore来完 成以下的工作:o当一个变更被推送到git资料库后口动地进行编译o白动地运行测试。如果编译成功并且通过测试就创建一个docker映像o将docker映像文件推送入docker hubo更新服务器以便使用最新的docker映像创建一个生产用的dockerfile在开发过程中,我们的冃录冇如下的结构:mathapp |conf |1app.conf |main.go |main_test.go 1views|invalid

27、 route.html 1result.html由于我们想要从项目中构建docker映像,我们需要创建一个将用于生产环境的dockerfileo在项fl的根冃录小创建一个dockerfile0新的fi录结构如下所示:mathapp |conf |1app.conf |dockerfile |main.go |main_test.go 1views |invalid-route.html 1result.html在dockerfile文件中输入以下的内容:from golang:1.6 create the directory where the application will resider

28、unmkdir/appcopy the application files (needed for production)addmathapp/app/mathappaddviews/app/viewsaddconf/app/c onfset the working directory to the app directoryworkdir/appexpose the application on port 8080. this should be the same as in the app.conf fileexpose8080set the entry point of the cont

29、ainer to the application executableentrypoint/app/mathapp让我们具体看一下这些命令都做了什么。第一个命令,from golang: 1.6表明将基于我们在开发中使用的golang: 1.6映像构建新的映像文件。第二个命令:run mkdir /app在容器的根里创建一个名为app的目录,我们用其来保存项目文件。第三个命令集:add mathapp /app/mathappadd views /app/viewsaddconf /app/conf从主机中拷贝二进制、视图文件夹及配置文件夹到映像文件中的应用程序h录。第四 个命令:workdi

30、r/app在映像文件中把/app设置为工作冃录。第五个命令:expose 8080在容器中开放8080端口。该端口应该与应川程序的app.conf文件中声明的端口一致。 最后的命令:entrypoint /app/mathapp将映像文件的入口设置为应用程序的二进制文件。这将启动二进制文件的执行并监听8080 端 m o自动地编译及测试一旦你把代码上传到你的资料库中semaphore将口动地对代码进行编译和测试,一切 都变得简单了。点击这里了解如何添加你的github或bitbucket项h并口在semaphore上 设置golang项冃。一个go项目的缺省配置文件关注以下儿点:o获取相关文件

31、o编译项目o运行测试一旦你完成这个过程,就可以在semaphore仪表盘上看到最近的编译和测试状态。如 果编译或测试失败,该过程会终止而且也不会部署任何内容。在semaphore上仓u建initial setup來实现自动部:署一旦你配置好了编译过程,卜-步就是配置部署过程。为了部署应用程序,你需要:1. 创建 docker image2. 将 docker image 推送入 docker hub3. 拉取新的image來更新服务器并基于该image启动一个新的docker弈器作为开始,我们需要在semaphore上配置项冃实现持续部署。前三个步骤相对简单:o选择部署模式o选择部署策略o选择

32、在部署过程中使用的资料库分支第四步(设置部署命令),我们将使用下一节中的命令。当前暂空着并转到下一步。在第五步屮,输入你的服务器屮用户的ssh私钥。这将使得一些部署命令可以在你的 服务器上安全执行而不需要输入口令。在笫六部中,你可以命名你的服务器。如果你做的话,semaphore会给该服务器指定 一个类似server-1234这样的随机名字。在服务器上设置更新脚本z后,我们将配置部署过程,semaphore将创建新的image冰将其上传到docker hub 屮。一旦完成,一个semaphore的命令将执行你的服务器上的脚木来初始化更新过程。为了完成这个工作,我们需耍将名为update.sh的

33、文件放直到你的服务器屮。#!/bin/bashdocker pull $1 /ma-prod:latestifdocker stop ma-app; then dockerrm ma-app; fidocker run d p 8080:8080 name ma-app $1/ma-prodifdockerrmi $(docker images -filter "dangling=trueh -q-trunc); then :; fi使用如卜的命令给该文件赋予执行权限:chmod 4-x update.sh让我们来看一卜-该文件是如何使用的。这个脚本接收一个参数并且在命令中使用该参数

34、。这个参数应该是你在docker hub ±的丿ij户名。下面是使川该命令的例了:./update.sh docker_hub_username现在让我们看一下这个文件屮的每一个命令来理解他们要做什么。第一个命令,docker pull $1/ma-prod:latest从docker hub上拉取最新的image到服务器屮。如果你在docker hub上的川户名是 demo_user,该命令将拉取 docker hub i:标记为 latest、名为 demo_user/ma-prod 的 image。第二个命令:ifdocker stop ma-app; then dockerr

35、m ma-app; fi停止并删除之,前任何以maapp为名字而启动的容器。第三个命令:docker run -d -p 8080:8080 -name ma-app $1/ma-prod使用在最近一次编译中包涵变更的最新image来川动一个新的容器。最麻的命令:dockerrmi $(docker images -filter *'dangling=true” -q no-trunc)从服务器上删除任何没有用的imageo这种清理将保持服务器整洁并降低磁盘空间的 占用。注意:这个文件必须存放在用八主目录中,而该用八就是之前的步骤中所用到的ssh 密钥的所有者。如果文件的位直发住了变化

36、,则需要在后而的章节小相应地更新部署命令。 配置项口使其能够支持docker缺省情况下,semaphore ±的新项目使用ubuntu 14.04 lts v1603平台。该平台并 不支持dockero由于我们希望使用docker,我们需要修改semaphore的配置来使用ubuntu 14.04 lts v1603(beta with docker support)平台。设置坏境变量为了在部署过程屮安全使用docker hub,我们需要把我们的证书保存在semaphore 自动初始化的环境变最屮。我们将保存以下的变量:o dh_username docker hub 用户名o dh

37、_password 一 docker hub 口令o dh_email docker hub email 地址这里是如何以安全的方式设置环境变量。设置部署命令虽然我们完成了初始配置,但是实际上什么也不会部署。原因是我们在命令环节中都 述是空白。在第一步,我们将输入用于完成部署过程的命令。为了完成这一步,请进入semaphore 中你的项目主页。q httptj/mmaphortctccxn 在这一页上,点击server栏屮服务器的名字。这将带你进入:点击位于页头下方页面右侧的edit server按钮。a hnp« > scmaphoreclcom 在随后的一页中,我们需要关注

38、标题为deploy commands的最后一栏。点击change deploy commands链接來开丿j命令编辑。rmp% semaphoreclcom 乃 mmaphorvdeploy ccmmemlt90 f /90 build *o rathapp q usfzhf p som 10m emaudocker build t oo*»rod docker uy m prodiutmt tth ifsermw/m prodiuteit(tocter ptnh ton mcmw/m prod:latest1rk1tkeycheckingoo four mtver utemmm*r

39、ouf 3 mmresswh usermare第翡城雨(obiiti 问 en在编辑框中,输入如卜的命令并点击save deploy commands按钮:go get -v -d ./go build -v -0 mathappdocker login -u $dh_username -p $dh_password -e $dh_emaildocker build t ma-prod .docker tag ma-prod:latest $dh_username/ma-prod:latestdocker push $dhjjsername/ma-proddatestssh -ostricth

40、ostkeychecking=no your_server_usernameyour_ip_address ”/update.sh $dh_username”注意:请确定用正确的值替换 your_server_usemameyour_ip_address。让我们具体看一下每个命令。前两个命令go get和go build是go的标准命令用于获取相关文件并和应地编译项目。 注意go build命令说声明的二进制文件名应该是mathapp。这个名字应该与dockerfile中使 用的名字相同。第三个命令,docker login -u $dh_username -p $dh_password -e $dh_email使用环境变量实现在docker hub ±的认证,从而使得我们能够推送最新的image。第四个命令, docker build t ma-prod .基于最新的代码库莱创建docker image。第五个命令,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论