• go项目部署:docker部署go项目&直接运行二进制文件部署(两种方式,步骤详细)


    go项目部署:docker部署go项目&直接运行二进制文件部署

    引言:之前断断续续的接触到项目部署,一直没有详细的了解部署,于是最近就好好的专研一下项目的部署,前期准备:一个自己或者别人的具有公网IP的服务器,会docker的基本命令,已经学习过go基础+框架知识(这个没有也行),废话不多说,上才艺。

    推荐工具:FinalShell,十分强大的一个工具。

    一.使用docker部署go项目

    创建go项目

    //终端创建go项目
    mkdir test_docker
    cd test_docker
    code .
    
    //手动创建go项目
    //这个就不在演示了,相信大家都会
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 这里就是正常的创建一个go项目,推荐直接在编辑器中手动完成,注意代理

    初始化一下项目

    //终端创建go项目
    go mod init test_docker
    
    //手动创建之后自动初始化,看是否有go.mod,有的话就初始化了,没有的话,终端运行go mod init test_docker
    
    • 1
    • 2
    • 3
    • 4

    创建一个gin项目

    • 创建一个gin项目,这里以gin为例。其他项目亦可
    package main
    
    import "github.com/gin-gonic/gin"
    
    func main() {
    	r := gin.Default()
    	r.GET("/ping", func(c *gin.Context) {
    		c.JSON(200, gin.H{
    			"code":    200,
    			"message": "Hello,My First Project Deployment",
    		})
    	})
    	err := r.Run(":8080")
    	if err != nil {
    		return
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 跑一遍本地的这个项目。看自己的项目是否又问题,如果本地就有问题,那么部署之后依旧是访问不到的。

    创建Dockerfile

    FROM golang:1.17-alpine //对应自己的go版本, -alpine:指代镜像比较小
    
    #为我们的镜像设置必要的环境变量
    ENV GO111MODULE=on \
        GOPROXY=https://goproxy.cn,direct \
        CGO_ENABLED=0 \
        GOOS=linux \
        GOARCH=amd64
    
    WORKDIR /project/docker_first/
    
    #COPY go.mod , go.sum and download the dependencied
    COPY go.* ./
    RUN go mod download
    
    #COPY All things inside the project and build
    COPY . .
    RUN go build -o /project/docker_first/build/myapp .
    
    EXPOSE 8080
    ENTRYPOINT ["/project/docker_first/build/myapp"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • FROM golang:1.17-alpine :将FROM golang:1.17-alpine用作此Docker构建的基础镜像,和自己使用的go版本进行统一。不知道的,可以查看go.mod看看自己使用的版本。
    • ENV :环境配置,配置代理,编译环境。
    • WORKDIR:工作目录路径。
    • COPY go.* ./ :从项目复制go.mod & go.sum文件到工作目录。
    • RUN go mod dowmload:从go modules 下载项目依赖。
    • COPY . .:将我们项目中的所有内容复制到工作目录中。
    • RUN go build -o /project/docker_first/build/myapp . : 在工作目录中构建我们的项目并将其project/docker_first/build/myapp作为二进制文件输出。
    • EXPOSE 8080 : 告诉docker我们的代码将暴露端口8080
    • ENTRYPOINT ["/project/docker_first/build/myapp"] :当我们运行这个镜像的容器时,它将从我们的构建可执行文件开始执行

    上传自己的项目

    • 完成上面的步骤之后,上传自己的项目至自己的服务器之上,具体的安装在哪里,自己决定。
      • 压缩自己的项目
      • 将压缩好的项目上传到自己服务器的某一文件中(我在根目录下创建一个project,专门的存放自己的项目)
      • 上传之后解压缩:unzip XXX
      • 解压完成之后,进入到项目文件中

    运行docker命令

    • 先使用docker 命令 docker version 查看是否安装了docker

      image-20220721090725701

    docker build -f Dockerfile -t test-go-docker:latest .
    
    //每一步骤都要正常进行,如果某一步骤失败,删除已经安装的镜像,再次安装
    //是否安装成功:最后一行是否有  Successfully  
    
    • 1
    • 2
    • 3
    • 4
    • -f flag 是我们的Dockerfile。
    • -t tag 时镜像标签。
    • test-go-docker :自己起的容器名。
    • . 命令是当前文件夹下的Dockerfile。

    查看docker镜像

    docker images
    
    • 1

    image-20220721091230552

    运行镜像

    docker run -d -p 8080:8080 test-go-docker:latest
    //此时镜像就跑起来了,
    docker ps
    //查看容器是否在运行
    
    • 1
    • 2
    • 3
    • 4

    测试

    http://82.157.8.54:8080/ping
    //82.157.8.54 :这是我的服务器IP地址,记得改成自己的
    
    • 1
    • 2
    • 输入上面网址,网页会出现下面内容,及部署成功image-20220721091547583

    • 注意:此时如果访问不了,查看自己服务器中安全组相关端口是否开启。

    二.直接运行二进制文件部署

    • go语言写的程序非常的牛批,有人就问为什么牛批呢?它的部署不需要任何的依赖,直接把打包好的二进制文件丢到服务器上就可以跑起来。是不是真的这么牛批呢,下面我们就小试一下。

    创建go项目

    //终端创建go项目
    mkdir test_docker
    cd test_docker
    code .
    
    //手动创建go项目
    //这个就不在演示了,相信大家都会
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 这里就是正常的创建一个go项目,推荐直接在编辑器中手动完成,注意代理

    初始化一下项目

    //终端创建go项目
    go mod init test_docker
    
    //手动创建之后自动初始化,看是否有go.mod,有的话就初始化了,没有的话,终端运行go mod init test_docker
    
    • 1
    • 2
    • 3
    • 4

    创建一个gin项目

    • 创建一个gin项目,这里以gin为例。其他项目亦可
    package main
    
    import "github.com/gin-gonic/gin"
    
    func main() {
    	r := gin.Default()
    	r.GET("/ping", func(c *gin.Context) {
    		c.JSON(200, gin.H{
    			"code":    200,
    			"message": "Hello,My First Project Deployment",
    		})
    	})
    	err := r.Run(":8080")
    	if err != nil {
    		return
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 跑一遍本地的这个项目。看自己的项目是否又问题,如果本地就有问题,那么部署之后依旧是访问不到的。

    项目打包

    • 我的另一篇博客如何在windows平台将golang应用交叉编译后运行在linux平台中有对交叉编译的详解,不了解的可以先去看看交叉编译。

    • 在打包我们的Go语言项目的时候,我们需要用到Go语言的交叉编译功能,不管我们使用的是mac环境还是windows环境,我们要打包出在linux上运行的程序,我们只需要在编译的时候指定我们的系统为linux以及他的处理器是amd64,这样就可以打包出在linux上运行的二进制文件。

      GOOS=linux GOARCH=amd go build main.go
      
      • 1
      • 或则大家查看自己的go 环境,然后直接修改相关配置,这样就阔以不用每次打包都要交叉编译了。

        go env
        
        相关环境,我的已经配置好了。
        GO111MODULE="on"
        GOARCH="amd64"
        GOBIN="/usr/local/go/bin"
        GOCACHE="/Users/apple/Library/Caches/go-build"
        GOENV="/Users/apple/Library/Application Support/go/env"
        GOEXE=""
        GOEXPERIMENT=""
        GOFLAGS=""
        GOHOSTARCH="arm64"
        GOHOSTOS="darwin"
        GOINSECURE=""
        GOMODCACHE="/Users/apple/Documents/go项目/docker部署/pkg/mod"
        GONOPROXY=""
        GONOSUMDB=""
        GOOS="linux"
        GOPATH="/Users/apple/Documents/go项目/docker部署:/Users/apple/Documents/go项目/The project of actual combat"
        GOPRIVATE=""
        GOPROXY="https://goproxy.cn,direct"
        GOROOT="/usr/local/go"
        GOSUMDB="sum.golang.org"
        GOTMPDIR=""
        GOTOOLDIR="/usr/local/go/pkg/tool/darwin_arm64"
        GOVCS=""
        GOVERSION="go1.17.9"
        GCCGO="gccgo"
        AR="ar"
        CC="clang"
        CXX="clang++"
        CGO_ENABLED="0"
        GOMOD="/Users/apple/Documents/go项目/docker部署/docker_test/docker_first/go.mod"
        CGO_CFLAGS="-g -O2"
        CGO_CPPFLAGS=""
        CGO_CXXFLAGS="-g -O2"
        CGO_FFLAGS="-g -O2"
        CGO_LDFLAGS="-g -O2"
        PKG_CONFIG="pkg-config"
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
      • 修改环境配置

        //修改linux
        go env -w GOOS="linux"
        //修改处理器
        go env -w GOHOSTARCH="arm64"
        
        • 1
        • 2
        • 3
        • 4
        • 使用go env查看是否修改成功
        • 以后还有其他的环境变量想要修改,使用go env -w 修改即可。
    • 打包成功之后,会编译出来一个相关的二进制文件

      image-20220721095116966

    上传文件

    • 将我们编译好的二进制文件上传进自己的服务器里面去
    • 在自己上传的文件夹下,可以看到自己上传的main这个文件

    赋予权限

    • 我们要给mian一个可执行的权限

      //在main的同级目录下执行这条语句,赋予main权限
      chmod +x main
      
      • 1
      • 2
    • 原本的main变成绿色及赋予权限成功

    运行项目

    • 此时我们就可以运行项目了

      ./main
      
      • 1

      注意:此时如果访问不了,查看自己服务器中安全组相关端口是否开启。

      //成功访问网页后出现下面结果
      {"code":200,"message":"Hello,My First Project Deployment"}
      
      • 1
      • 2

    问题:

    • 我们这样直接运行二进制文件,会出现一个问题,程序一直在运行,做不了其他的操作,要想做其他的操作,只能ctrl+c停止这个二进制可执行文件。停止之后的结果就是:我们的外网访问不到我们的页面。

    解决问题

    • 让我们的程序在后台运行

      nohup ./main &
      
      • 1
    • 此时程序就在后台默默的运行了,可以通过 netstat -lntep查看程序运行的进程

    image-20220721101141576

    • 这样程序就可以在后台默默的运行了,我们也可以做其他的操作,外网也可以访问相关的网页。

    终止程序

    • 查看当前的进程编号

      ps -ef|grep main    
      //或者
      netstat -lntep   
      //查看main的进程
      
      • 1
      • 2
      • 3
      • 4
    • kill掉进程

      kill -9 进程编号
      
      • 1
    • 查看是否终止程序

      ps -ef|grep main    
      //或者
      netstat -lntep   
      //查看main的进程是否还在,不在即为程序终止
      
      • 1
      • 2
      • 3
      • 4

    结语

    go项目的部署十分简单,不需要太多的依赖,直接可以通过main二进制文件直接运行或者是起一个容器运行,通过学习,我暂时了解到上面两种部署方法。通过自己的实践都可以完成项目的部署,中间也是猜了很多的坑。从无从下手,到慢慢的部署自己的第一个项目,自己还是十分开心的。我知道刚接触一个新的知识点的茫然,所以我希望自己的总结可以给大家带来一下帮助,如果有问题欢迎大家私信。

    又学习完一个新的技术,心中甚是开心,如果不是在减肥,我一定奖励自己一个大鸡腿。

    拜拜👋,下篇博客见

  • 相关阅读:
    Actipro Windows Forms Controls 22.1.3 注册版
    springboot闲置衣物捐赠系统毕业设计源码021009
    电脑内存不足怎么办
    python/pygame 挑战魂斗罗 笔记(三)
    Java反射--师承韩顺平
    【开发心得】Java xsd文件转JavaBean
    PCIE电路设计
    【MyBatis-Plus】简介 | 入门案例
    气象科普丨气象站的分类与应用
    腾讯云2核4G轻量服务器5M带宽支持多少人同时在线?
  • 原文地址:https://blog.csdn.net/weixin_51261234/article/details/125906988