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

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

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

一.使用docker部署go项目

创建go项目

//终端创建go项目
mkdir test_docker
cd test_docker
code .

//手动创建go项目
//这个就不在演示了,相信大家都会
  • 这里就是正常的创建一个go项目,推荐直接在编辑器中手动完成,注意代理

初始化一下项目

//终端创建go项目
go mod init test_docker

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

创建一个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
	}
}
  • 跑一遍本地的这个项目。看自己的项目是否又问题,如果本地就有问题,那么部署之后依旧是访问不到的。

创建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"]
FROM golang:1.17-alpineFROM golang:1.17-alpineENVWORKDIRCOPY go.* ./go.mod & go.sumRUN go mod dowmloadgo modules COPY . .RUN go build -o /project/docker_first/build/myapp .project/docker_first/build/myappEXPOSE 8080ENTRYPOINT ["/project/docker_first/build/myapp"]

上传自己的项目

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

运行docker命令

docker version
docker build -f Dockerfile -t test-go-docker:latest .

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

查看docker镜像

docker images

运行镜像

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

测试

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

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

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

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

创建go项目

//终端创建go项目
mkdir test_docker
cd test_docker
code .

//手动创建go项目
//这个就不在演示了,相信大家都会
  • 这里就是正常的创建一个go项目,推荐直接在编辑器中手动完成,注意代理

初始化一下项目

//终端创建go项目
go mod init test_docker

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

创建一个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
	}
}
  • 跑一遍本地的这个项目。看自己的项目是否又问题,如果本地就有问题,那么部署之后依旧是访问不到的。

项目打包

GOOS=linux GOARCH=amd go build main.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"
//修改linux
go env -w GOOS="linux"
//修改处理器
go env -w GOHOSTARCH="arm64"

上传文件

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

赋予权限

//在main的同级目录下执行这条语句,赋予main权限
chmod +x main

运行项目

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

问题:

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

解决问题

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

终止程序

ps -ef|grep main    
//或者
netstat -lntep   
//查看main的进程
kill -9 进程编号
ps -ef|grep main    
//或者
netstat -lntep   
//查看main的进程是否还在,不在即为程序终止

结语

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

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

拜拜👋,下篇博客见