如何将Go Web服务部署到Docker容器

前言

Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,现在越来越多的公司开始学习和使用,不过我相信在以后关于这些运维相关部署的东西可能都会有专门的平台去做和维护,然后小公司或个人就去购买它们的定制服务,公司只要专注创新做产品,这样应该更能提高工作效率和成果,不过在这之前我们先学会这个部署的流程也没坏处。

操作步聚

一、Win10下编写一个简单的go web程序

1、打开goland创建一个go工程项目。

2、在工程目录创建一个src文件夹,然后再创建一个名为main的go文件。

3、通过 go get github.com/gin-gonic/gin 命令安装gin包

4、编写代码如下:

package main

import "github.com/gin-gonic/gin"

func main() {

r := gin.Default()

r.GET("/test", func(c *gin.Context) {

c.String(200, "hello,world")

})

r.Run(":8082")

}

5、启动程序,然后浏览器输入http://127.0.0.1:8082/test进行测试,如果有信息返回说明没问题。

二、Ubuntu下编译可执行程序

1、把win10下的go web程序复制到ubuntu下(通过访问/mnt目录即可获取到)

2、cd进入到该项目src的目录下,然后执行编译命令:CGO_ENABLED=0 go build -o main,编译的时候之所以带上参数CGO_ENABLED=0,是为了防止下文使用alpine镜像在部署时动态编译可能会出现bug,这个时候可能会出现执行不成功的情况,会提示没装gin包之类的,然后我们就先通过 go get github.com/gin-gonic/gin 命令安装gin包,再次执行编译命令,又会提示没有unix包之类的,此时我们可能没法直接安装了,先通过 echo $GOPATH 找到go系统包路径(如:/home/ubuntu/golib),然后在该目录下创建一个目录golang.org/x,然后在该目录下执行 git clone https://github.com/golang/sys.git,此时就会发现sys下面有unix包了,然后再次执行编译命令成功,此时就会在当前目录下生成可执行程序main文件。

三、创建dockfile文件

在当前目录下创建名为dockfile的文件,内容如下:

FROM alpine:latest #使用了镜像大小体积只有5MB的alpine镜像,因为golang镜像有点大

MAINTAINER Garbin "gonggaobin@qq.com" #维护者信息(非必须)

WORKDIR / #设置当前工作路径

ADD main / #把上文编译好的可执行文件添加到镜像里

EXPOSE 8082 #暴露容器内部端口

ENTRYPOINT ["./main"] #可执行程序入口

四、构建镜像

#在当前目录下构建名为main,标签为v1的镜像

docker build -t main:v1 .

#查看镜像

docker images
如何将Go Web服务部署到Docker容器

五、创建容器并运行

docker run --rm -it -d -p 8082:8082 main

–rm 容器停止时,自动销毁

-i 以交互模式运行容器,通常与 -t 同时使用

-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用

-d 后台运行容器,并返回容器ID

-p 指定端口映射,格式为:主机(宿主)端口:容器端口

#查看正在运行的容器

docker ps
如何将Go Web服务部署到Docker容器

#停止容器

docker stop 容器ID 或 docker kill 容器ID

其中容器ID可以通过docker ps查看到,另外关于这两种停止方法的区别:

stop:系统先发送停止信号,有充分的时间(默认10s)完成清理后再发送kill信号让容器退出

kill:系统直接发送退出信号,让容器强制退出

六、验证

浏览器打开http://127.0.0.1:8082/test进行访问,如果有返回说明部署成功。

如何将Go Web服务部署到Docker容器

标签:   |    |    |    |    |    |    |    |    |    |