引言:之前断断续续的接触到项目部署,一直没有详细的了解部署,于是最近就好好的专研一下项目的部署,前期准备:一个自己或者别人的具有公网IP的服务器,会docker的基本命令,已经学习过go基础+框架知识(这个没有也行),废话不多说,上才艺。
推荐工具:FinalShell,十分强大的一个工具。
//终端创建go项目
mkdir test_docker
cd test_docker
code .
//手动创建go项目
//这个就不在演示了,相信大家都会
//终端创建go项目
go mod init test_docker
//手动创建之后自动初始化,看是否有go.mod,有的话就初始化了,没有的话,终端运行go mod init test_docker
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
}
}
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-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我们的代码将暴露端口8080ENTRYPOINT ["/project/docker_first/build/myapp"]
:当我们运行这个镜像的容器时,它将从我们的构建可执行文件开始执行先使用docker 命令 docker version
查看是否安装了docker
docker build -f Dockerfile -t test-go-docker:latest .
//每一步骤都要正常进行,如果某一步骤失败,删除已经安装的镜像,再次安装
//是否安装成功:最后一行是否有 Successfully
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项目
mkdir test_docker
cd test_docker
code .
//手动创建go项目
//这个就不在演示了,相信大家都会
//终端创建go项目
go mod init test_docker
//手动创建之后自动初始化,看是否有go.mod,有的话就初始化了,没有的话,终端运行go mod init test_docker
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
}
}
我的另一篇博客如何在windows平台将golang应用交叉编译后运行在linux平台中有对交叉编译的详解,不了解的可以先去看看交叉编译。
在打包我们的Go语言项目的时候,我们需要用到Go语言的交叉编译功能,不管我们使用的是mac环境还是windows环境,我们要打包出在linux上运行的程序,我们只需要在编译的时候指定我们的系统为linux以及他的处理器是amd64,这样就可以打包出在linux上运行的二进制文件。
GOOS=linux GOARCH=amd go build main.go
或则大家查看自己的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"
go env
查看是否修改成功go env -w
修改即可。打包成功之后,会编译出来一个相关的二进制文件
我们要给mian一个可执行的权限
//在main的同级目录下执行这条语句,赋予main权限
chmod +x main
原本的main变成绿色及赋予权限成功
此时我们就可以运行项目了
./main
注意:此时如果访问不了,查看自己服务器中安全组相关端口是否开启。
//成功访问网页后出现下面结果
{"code":200,"message":"Hello,My First Project Deployment"}
让我们的程序在后台运行
nohup ./main &
此时程序就在后台默默的运行了,可以通过 netstat -lntep
查看程序运行的进程
查看当前的进程编号
ps -ef|grep main
//或者
netstat -lntep
//查看main的进程
kill掉进程
kill -9 进程编号
查看是否终止程序
ps -ef|grep main
//或者
netstat -lntep
//查看main的进程是否还在,不在即为程序终止
go项目的部署十分简单,不需要太多的依赖,直接可以通过main二进制文件直接运行或者是起一个容器运行,通过学习,我暂时了解到上面两种部署方法。通过自己的实践都可以完成项目的部署,中间也是猜了很多的坑。从无从下手,到慢慢的部署自己的第一个项目,自己还是十分开心的。我知道刚接触一个新的知识点的茫然,所以我希望自己的总结可以给大家带来一下帮助,如果有问题欢迎大家私信。
又学习完一个新的技术,心中甚是开心,如果不是在减肥,我一定奖励自己一个大鸡腿。
拜拜👋,下篇博客见