在搜索引擎中,搜索了一下如何部署一个 go 的程序, 发现都是基于 golang 的镜像部署 go 源码的方案

而基于 golang 源码部署 docker image 的大小有 700MB, 有时候并不需要这么大,我们生成二进制文件后 只需要基于 centos 来制作 image 就可以了, 当然如果对于 go 源码有持续部署的需求,那还是只能使用 golang 镜像


目录结构

图片

完整的目录结构就这么简单, main 是二进制运行文件

main.go

package main

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

func main() {
    g := gin.Default()

    g.LoadHTMLGlob("static/*")

    g.GET("/index", func(c *gin.Context) {
        c.HTML(200, "index.html", gin.H{
            "title": "标题",
        })
    })

    g.Run(":80")
}

打包 go 二进制运行文件

这里因为我是 mac 系统,所以我需要交叉编译,具体的交叉编译可以查看我的另一篇交叉文章

cd main

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

制作镜像

Dockerfile

FROM centos:latest

LABEL cjl "cjl_spy@163.com"

WORKDIR /root

ADD ./main ./main
ADD ./static/ ./static/

EXPOSE 80

ENTRYPOINT  ["./main"]

FROM 基于 centos

LABEL 随便写

WORKDIR 工作目录, 在 docker 中的目录, 直接使用/root 就行了 当然你也可以自己指定

ADD [源文件] [目标文件]

EXPOSE 80 端口号是多少,这里设置 80 ,因为我的程序中写的是 80

ENTRYPOINT [“./main”] 这个是在运行容器时会执行的命令, 因为假设我在 centos 中 我开启这服务只需要./main 就够了

打包镜像

在 main 目录下执行

 docker build -t dockertest .

接着就会根据 Dockerfile 的内容进行打包,看到 sucessful 就说明成功了

图片

测试镜像运行

docker run --name dtest -d -p 8888:80 dockertest

图片

接着访问浏览器

http://localhost:8888/index

图片 图片

通过 docker-compose 部署

这里需要先移除掉上一个容器,即使不移除也需要先停止运行

docker container rm -f dtest

配置 docker-compose.yml

version: "3"
services:
  go-web:
    image: dockertest
    ports:
      - "8888:80"

这里就完成了配置

然后执行 docker-compose up -d

接着在浏览器输入 http://localhost:8888/index 还是和上一步一样,这样就完成了带静态资源的服务器完整部署

结语

越学习 docker 就越觉得 docker 的部署方案真的太方便了,即使只是自己使用云服务器搭设一个博客也应该好好学习