前言:
学习golang几个月了,一直在论坛和qq群里潜水,一直都想写点什么回报你们积极的知识分享。php
前几日在CSDN上看到了一篇文章:如何将nodeclub构建成Docker镜像.也对docker有所了解,就来分享一下我平时怎么应用docker来跑个人项目。node
先引用Beego做者谢大描述虚拟机的一段话:"日常咱们常常会遇到这样的问题:在开发机上面开发完毕程序,放到正式环境以后会出现各类奇怪的问题:描述符少了、nginx配置不正确、MySQL编码不对、php缺乏模块、glibc版本过低等。因此咱们就须要虚拟开发环境,咱们虚拟和正式环境同样的虚拟开发环境"mysql
可是虚拟机真的好重,虚拟机不只启动慢,并且浪费不少的cpu,内存资源,因而应运而生了docker,为咱们提供了一个轻量级的虚拟环境。linux
关于docker的更多介绍资料就不少了。InfoQ的这一系列文章很值得阅读。nginx
关于如何使用Docker,能够参考上面nodeclub的文章和官方文档git
首先来贴上个人Dockerfilegithub
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地址。可是其中的依赖包须要本身get而且放到github.com目录下。golang
咱们一句一句分析:sql
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须要的包文件。
3.输入 tce push beetest就开始构建镜像了。简单粗暴。docker
4.构建过程当中,能够查看到整个过程的日志输出。
5.构建完成后咱们就能够进入 官网-》镜像-》个人镜像 下找到咱们刚刚构建的镜像了。而后就能够直接经过这个镜像直接建立容器了。
6.在的容器页下能够直接建立容器,省心省力。直接打开,看到咱们的小 beego。
若是是在咱们平时的开发过程当中,以上的方法确定是不可取的。否则每次对代码有一点点改动,难道就要从新构建一个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地址。的也能够在时速云共有镜像找到。
这样,把模块细化,产品运行环境隔离,只要你构建成功,而且成功跑起来了该项目。那么之后不再会出现让不少人头疼的环境问题了。而且你也能够将这个镜像打包,直接把这个镜像在产品环境启动,都是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,固然代码会自动从新运行的)。
是否是很是酷!这样来讲既没有了各类环境问题带来的困扰,又能够轻松编写构建代码了。最重要的是你不须要再为了迁移部署到其余地方再搭一遍环境了。
我的来讲,学习go语言几个月了,期间也看了一些docker。docker就是go语言的一个精良产物,而且围绕docker的不少工具也都是用go来写的,看着内心就有一种大go要崛起的赶脚。
平时在工做的时候,有时候在测试机上要跑个简单的go程序,可是发现没有go环境,装环境还烦,刚好机器上有docker。随便写个Dockerfile。用命令 docker run -ti myimage /bin/bash就跑到容器里去调程序,当时的真的感受"这东西咋这么方便呢",若是你要弄个php,ruby这些都不用去弄环境了,直接容器里就都有了,用着真的很方便。
在说说我在时速云上一点点发现。在他们的镜像区里的公有镜像有好多新奇的发现。其中发现一个的Discuz镜像,出于好奇,我建了一个discuz容器和mysql容器。
而后就直接装上了这个discuz,而且能够直接当作管理员来各类拖拽玩了。仍是挺有意思的。经过这些来看,docker确实为咱们带来了不少便利,即便不懂技术,能够根本不会部署各类环境,可是只要会用linux系统就能够从头至尾维护一个社区网站了,甚至是作更多用处了。