14.5 Go

Go语言(也称Golang)是一个由Google主导研发的编程语言,于2009年推出。它的语法清晰明了,设计精良,拥有一些先进的特性,还有一个庞大的标准库。Go的基本设计理念是:编译效率、运行效率和开发效率要三者兼顾。使用Go开发,既可以得到很多灵活的语法支持,又可以拥有C/C++的运行和编译效率。此外,Go提供了轻量级的协程,支持大规模并发的场景。

14.5 Go - 图1

14.5.1 搭建并运行Go容器

1.使用官方镜像

运行Go语言环境的最简方法是使用官方golang镜像。可以使用docker run指令直接启动Go语言的交互环境:


  1. $ docker run -it golang /bin/bash
  2. root@79afc2b64b06:/go# go versiongo version go1.7 linux/amd64

还可以将Go编译指令写入Dockerfile中,基于此Dockerfile构建自定义镜像。具体步骤如下。

第一步,新建项目文件夹,并在根目录新建Dockerfile:


  1. FROM golang:1.6-onbuild # 显示声明基础镜像版本,利于后期维护。
  2. onbuild版本Dockerfile的具体内容如下:
  3. FROM golang:1.6
  4. RUN mkdir -p /go/src/app
  5. WORKDIR /go/src/app
  6. CMD ["go-wrapper", "run"] # 通过`go-wrapper`程序执行当前目录下的主函数
  7. ONBUILD COPY . /go/src/app # 拷贝当前项目代码至运行目录
  8. ONBUILD RUN go-wrapper download # 下载依赖,具体实现参考`go-wrapper`源码
  9. ONBUILD RUN go-wrapper install # 安装依赖,具体实现参考`go-wrapper`源码
  10. # `go-wrapper`源码地址:`https://github.com/docker-library/golang/blob/master/go-
  11. wrapper`
  12. # Dockerfile源码地址: `https://github.com/docker-library/golang/blob/master/1.6/
  13. onbuild/Dockerfile`

第二步,新建自定义go程序go-sample.go:


  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("Hello,世界")
  5. }

第三步,使用docker build指令构建镜像:


  1. $ docker build -t golang-image .

最后,使用docker run指令运行Go容器:


  1. $ docker run -it --rm --name golang-container golang-image
  2. + exec app
  3. Hello,世界

至此成功运行了Go语言的实例容器。如果需要在容器中编译Go代码,但是不需要在容器中运行它,那么可以执行如下命令:


  1. $ docker run --rm -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp golang go build -v
  2. _/usr/src/myapp

这会将Go项目文件夹作为Docker数据卷挂载起来并作为运行目录。然后,Docker会在工作目录中编译代码,执行go build命令并输出可执行文件至myapp。

2.Go项目容器化

首先,下载Golang官方提供的outyet示例项目:


  1. $ mkdir outyet
  2. $ cd outyet
  3. # 使用go get下载:
  4. $ go get github.com/golang/example/outyet
  5. # 或者直接使用wget下载:
  6. $ wget https://github.com/golang/example/archive/master.zip
  7. $ unzip master.zip
  8. $ cd example-master/outyet
  9. $ ls
  10. Dockerfile containers.yaml main.go main_test.go

示例项目搭建成功后,可以按照以下模板去自定义项目的Dockerfile:


  1. # 使用golang基础镜像。基于Debian系统,安装最新版本的golang环境。工作空间(GOPATH)
  2. 配置是"/go"
  3. FROM golang
  4. # 将本地的包文件拷贝至容器工作目录。
  5. ADD . /go/src/github.com/golang/example/my-go
  6. # 在容器中构建my-go。可以在这里手动或者自动(godep)管理依赖关系。
  7. RUN go install github.com/golang/example/my-go
  8. # 设定容器自动运行my-go。
  9. ENTRYPOINT /go/bin/my-go-app
  10. # 监听8080端口。
  11. EXPOSE 8080

如果使用onbuild版本的基础镜像,那么源文件拷贝、构建与配置等过程就会自动完成,无需在Dockerfile中逐一配置,如下所示:


  1. FROM golang:onbuild
  2. EXPOSE 8080

下面开始构建与运行此Golang项目。在outyet项目根目录执行docker build指令,使用本地目录下的Dockerfile:


  1. $ docker build -t outyet .

构建过程中,Docker会从Docker Hub中获取golang基础镜像,拷贝本地包文件,构建项目并给镜像打上outyet标签。下面,使用docker run指令运行此镜像:


  1. $ docker run -p 6060:8080 --name test --rm outyet

此时,实例项目的容器已经在运行状态。打开浏览器访问http://localhost:6060/即可看到运行界面。

14.5.2 Beego

Beego是一个使用Go的思维来帮助开发者构建并开发Go应用程序的开源框架。Beego使用Go开发,思路来自于Tornado,路由设计来源于Sinatra。使用方法如下。

14.5 Go - 图2

第一步,下载安装:


  1. go get github.com/astaxie/beego

第二步,创建文件hello.go:


  1. package main
  2. import "github.com/astaxie/beego"
  3. func main() {
  4. beego.Run()
  5. }

第三步,编译运行:


  1. go build -o hello hello.go
  2. ./hello

第四步,打开浏览器并访问http://localhost:8080

至此,一个Beego项目成功构建了。

14.5.3 Gogs:基于Go的Git服务

Gogs的目标是打造一个最简单、轻松的方式搭建自助Git服务。使用Go语言开发使得Gogs能够通过独立的二进制分发,并且支持Go语言支持的所有平台,包括Linux、Mac OS X、Windows以及ARM平台。

14.5 Go - 图3

可以使用docker run直接创建并运行镜像:


  1. $ docker run --rm --name gogs gogs/gogs

如果需要停止此镜像,可以使用docker stop与docker rm指令:


  1. $ docker stop gogs; docker rm gogs

如果需要将数据持久化,可以先新建数据文件夹,然后将其作为数据卷挂载至gogs容器中:


  1. $ mkdir -p /srv/lxc/gogs/data
  2. $ docker run -d --name gogs \ -p 8300:3000 -p 8322:22 -v /srv/lxc/gogs/data:
  3. /data gogs/gogs