如何用Docker定制你自己的Beego环境

karl · · 5019 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

# 如何用Docker定制你自己的Beego环境 ###前言: 学习golang几个月了,一直在论坛和qq群里潜水,一直都想写点什么回报大家积极的知识分享。 前几日在CSDN上看到了一篇文章:[如何将nodeclub构建成Docker镜像](http://www.csdn.net/article/2015-07-21/2825268).正好也对docker有所了解,就来分享一下我平时怎么应用docker来跑我的项目。 ### 一、为什么要用Docker 先引用Beego作者谢大描述虚拟机的一段话:"平常我们经常会遇到这样的问题:在开发机上面开发完毕程序,放到正式环境之后会出现各种奇怪的问题:描述符少了、nginx配置不正确、MySQL编码不对、php缺少模块、glibc版本太低等。所以我们就需要虚拟开发环境,我们虚拟和正式环境一样的虚拟开发环境" 但是虚拟机真的好重,虚拟机不仅启动慢,而且浪费很多的cpu,内存资源,于是应运而生了docker,为我们提供了一个轻量级的虚拟环境。 关于docker的更多介绍资料就很多了。InfoQ的这一系列[文章](http://www.infoq.com/cn/articles/docker-core-technology-preview)很值得阅读。 关于如何使用Docker,可以参考[上面nodeclub的文章](http://www.csdn.net/article/2015-07-21/2825268)和[官方文档](http://docs.docker.com/reference/builder/) ### 二、小试牛刀,用Docker构建一个Beego的环境并运行hello程序 * 首先来贴上我的Dockerfile ``` FROM golang:1.4.2 #author MAINTAINER carl #add beego and other package ADD github.com /go/src/github.com #build bee tool script ADD build.sh /build.sh RUN chmod +x /build.sh RUN /build.sh #add bee tool to PATH ENV PATH $PATH:$GOPATH/bin #add our project ADD hello /go/src/hello #start project script ADD run.sh / RUN chmod +x /run.sh EXPOSE 8080 CMD ["/run.sh"] ``` * 先附上这个项目[github地址](https://github.com/qwding/beegoDockerfile/tree/master/beegoWithHello)。但是其中的依赖包需要自己get并且放到github.com目录下。 * 我们一句一句分析: 1. `FROM golang:1.4.2` 这句话**必须**是Dockerfile的第一句话,并且指明我要用的基础镜像。这里我用的是dockerHub的官方golang:1.4.2镜像,毕竟官方镜像才是最值得信赖的。 2. `MAINTAINER puppy` 指明作者是谁,可有可无。 3. `ADD github.com /go/src/github.com`查阅golang:1.4.2镜像说明我们了解到该镜像的GOPATH是/go目录。于是我们将提前准备好的"github.com/astaxie/beego","github.com/beego/bee"包通过这条命令都加到我们的GOPATH。并且我们了解到生成 bee工具的时候需要几个依赖包。分别是github.com/go-sql-driver/mysql、github.com/howeyc/fsnotify、github.com/lib/pq 、github.com/smartystreets/goconvey/convey、github.com/jtolds/gls。 4. `ADD build.sh /build.sh` 因为Dockerfile 的RUN命令只支持linux的基本命令,而我们在生成bee工具时候需要用到go。 install,所以我们只能通过运行脚本来生成bee工具。 5. `RUN chmod +x /build.sh` 为脚本赋运行权限,也可以提前赋好权限,就不用在构建过程中运行这条命令了。 6. `RUN /build.sh`运行脚本,构建bee工具。 7. `ENV PATH $PATH:$GOPATH/bin` 将bee工具添加到环境变量里。 8. `ADD hello /go/src/hello`将我们的hello项目添加到$GOPATH下面。 9. `EXPOSE 8080` 启动容器后容器暴露给外部的端口 10. `CMD ["/run.sh"]`CMD命令是我们在根据镜像启动容器后自动执行的动作,这里我们添加了run.sh脚本,这个脚本就是用bee run 来启动我们hello项目的。 * 通过上边nodjs的文章了解到时速云提供了一个可以在windows下构建镜像的tce客户端。 1. 下载后,安装需要配置环境变量。 2. 进入到项目目录,目录下包含了Dockerfile以及Dockerfile里需要的build.sh,run.sh,和beego需要的包文件。 4. 输入 `tce push beetest`就开始构建镜像了。简单粗暴。 ![push](https://www.tenxcloud.com/upload/4f995d44cd09ffc7ca5a20492d97091a.png) 5. 构建过程中,可以查看到整个过程的日志输出。 6. 构建完成后我们就可以进入 官网-》镜像-》我的镜像 下找到我们刚刚构建的镜像了。然后就可以直接通过这个镜像直接创建容器了。 ![beegoImage](https://www.tenxcloud.com/upload/9ddef1dd8a6e1e74769c80c3c4b69be8.png) 7. 在的容器页下可以直接创建容器,省心省力。直接打开,看到我们的小 beego。 ![beegohelloweb](https://www.tenxcloud.com/upload/03ddeae7de45719342eb638d4ec3bcda.png) ###三、初步实践,开发过程中用到docker 如果是在我们平时的开发过程中,以上的方法肯定是不可取的。不然每次对代码有一点点改动,难道就要重新构建一个beego的镜像么? **NO** **docker好处之一就是随时可以把想要定制化的容器随时打包成镜像** 于是我们可以将以上的镜像分成两部分,让我们的不需要经常改动的package打成一个镜像A,再将我们的经常开发的代码用之前构建的镜像A为base镜像,构建成我们常用的产品镜像。 那么问题又来了 我们在写程序的过程中,常常会引入了新的代码包,是不是还要一并的重新构建beego镜像。可是我们猿类都现在趋向于解耦,当然耦合度越低越好了。于是我们可以将此分为三层。 * 用golang:1.4.2镜像构建成的Beego镜像mybeego * 用mybeego镜像构建成的包含项目依赖的Packages的镜像beego-package * 用beego-package镜像构建成的包含项目代码的镜像myhello 这样mybeego 可以提交到DockerHub作为一个公共的Beego基础镜像。 beego-package 是我们不常改动的代码依赖环境镜像。 myhello 是我们经常改动的代码镜像。 于是可以将Dockerfile分别写成 * mybeego:v1 ``` FROM golang:1.4.2 MAINTAINER carl ENV PATH $PATH:$GOPATH/bin ADD github.com /go/src/github.com ADD build.sh /build.sh RUN chmod +x /build.sh RUN /build.sh ``` * beego-package:v1 ``` FROM mybeego:v1 ADD github.com /go/src/github.com ADD golang.org /go/src/golang.org . . . ``` * myhello:v1 ``` ADD beego-blog /go/src/beego-blog ADD run.sh / RUN chmod +x /run.sh EXPOSE 8080 CMD ["/run.sh"] ``` 附上[Beego基础镜像的github地址](https://github.com/qwding/beegoDockerfile/tree/master/beegobase)。也可以在时速云共有镜像找到。 这样,把模块细化,产品运行环境隔离,只要你构建成功,并且成功跑起来了该项目。那么以后再也不会出现让很多人头疼的环境问题了。并且你也可以将这个镜像打包,直接把这个镜像在产品环境启动,都是OK没问题的,只要你的PC装了docker就可以。 ###四、懒人绝招、镜像都懒得构建 我就是个懒人,本来windows是安装不了docker的,但是懒得开虚拟机,所以用了时速云这个客户端。以上做法都已经很简便开发了,但是每次构建还都需要重新构建一个镜像,虽然步骤简单,但是也很让人烦。 有没有不用每次构建镜像就可以开发的方法么? **当然有!** 但是你必须是在linux环境下。我们应用的是Docker -v命令, volume映射的方法。 首先要小小改动一下我们代码的Dockerfile * myhello:v1 ``` ADD run.sh / RUN chmod +x /run.sh EXPOSE 8080 CMD ["/run.sh"] ``` 对比发现,只是把`ADD beego-blog $GOPATH/src/beego-blog`这句话去掉了。 然后用docker命令来启动容器 `sudo docker run -p 8006:8080 -v /root/beego-blog:/go/src/beego-blog myhello:v1` -p 命令是端口映射,后面的端口8080是容器暴露出来的端口,前面的8006是对应我们host宿主机的端口。 -v 命令是文件映射的命令,通过以上的命令,将宿主机的/root/beego-blog文件夹,映射到了$GOPATH/src/beego-blog文件夹。其中要注意的是-v后参数 前面的是host宿主机路径,后面是容器路径,并且路径都必须是**绝对路径**。 启动容器后,你就可以访问localhost:8006来访问我们的myhello程序了。如果你对代码有了改动。将会自动同步到容器内部,只需要docker restart container_id 就可以了。(其实如果你run.sh里的启动方式是bee run,当然代码会自动重新运行的)。 是不是非常酷!这样来说既没有了各种环境问题带来的困扰,又可以轻松编写构建代码了。最重要的是你不需要再为了迁移部署到其他地方再搭一遍环境了。 ###五、个人体会、取之于docker,用之于docker 个人来说,学习go语言几个月了,期间也看了一些docker。docker就是go语言的一个精良产物,并且围绕docker的很多工具也都是用go来写的,看着心里就有一种大go要崛起的赶脚。 平时在工作的时候,有时候在测试机上要跑个简单的go程序,但是发现没有go环境,装环境还烦,恰好机器上有docker。随便写个Dockerfile。用命令 `docker run -ti myimage /bin/bash`就跑到容器里去调程序,当时的真的感觉"这东西咋这么方便呢",如果你要弄个php,ruby这些都不用去弄环境了,直接容器里就都有了,用着真的很方便。 在说说我在时速云上一点点发现。在他们的镜像区里的公有镜像有好多新奇的发现。其中发现一个的Discuz镜像,出于好奇,我建了一个discuz容器和mysql容器。 ![discuz_diy](https://www.tenxcloud.com/upload/40d8cdb968584d4368d91feacae32b74.png) 然后就直接装上了这个discuz,并且可以直接当做管理员来各种拖拽玩了。还是挺有意思的。通过这些来看,docker确实为我们带来了很多便利,即使不懂技术,可以根本不会部署各种环境,但是只要会用linux系统就可以从头到尾维护一个社区网站了,甚至是做更多用处了。 ![discuz_diy](https://www.tenxcloud.com/upload/be8f556dd86269a5c8d03fef997c29d7.png)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5019 次点击  ∙  3 赞  
加入收藏 微博
2 回复  |  直到 2015-07-31 06:07:03
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传