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 mainimport "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=amd64WORKDIR /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我们的代码将暴露端口8080
  • ENTRYPOINT ["/project/docker_first/build/myapp"] :当我们运行这个镜像的容器时,它将从我们的构建可执行文件开始执行

上传自己的项目

  • 完成上面的步骤之后,上传自己的项目至自己的服务器之上,具体的安装在哪里,自己决定。

    • 压缩自己的项目
    • 将压缩好的项目上传到自己服务器的某一文件中(我在根目录下创建一个project,专门的存放自己的项目)
    • 上传之后解压缩:unzip XXX
    • 解压完成之后,进入到项目文件中

运行docker命令

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

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 mainimport "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 修改即可。
  • 打包成功之后,会编译出来一个相关的二进制文件

上传文件

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

赋予权限

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

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

运行项目

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

    ./main
    

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

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

问题:

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

解决问题

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

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

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

终止程序

  • 查看当前的进程编号

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

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

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

结语

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

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

拜拜

go项目部署:docker部署go项目直接运行二进制文件部署(两种方式进行部署)相关推荐

  1. vue项目在浏览器嵌入wps进行操作,这里记录两种方式,本地载入这个能匹配内网使用

    先整几个参考文档: wps开放平台 开发文档: https://www.kdocs.cn/l/cmd0fQ9SjcsS https://www.kdocs.cn/l/cvItn7DFoX99 http ...

  2. Nginx部署静态页面及引用图片有效访问的两种方式

    nginx安装百度一下有很多,直接正题: 静态文件目录结构 file#文件位置 /home/service/file/ css js images html fonts 配置nginx.conf核心代 ...

  3. 【SpringBoot】项目实现热部署的两种方式

    前言 spring boot : 2.0.0.RELEASE maven eclipse 另外还需清楚什么是热部署,以及为什么要热部署. SpringBoot项目中实现热部署的两种方式,使得部署变得异 ...

  4. 宝塔Linux部署JavaWeb项目两种方式,图文并茂

    目录 1.进入宝塔Linux面板宝塔linux面板,一键安装LAMP/LNMP/SSL/Tomcat (bt.cn) 2.安装宝塔面板​ 然后:因为我们用的java,这里的环境不适合,选择仅宝塔面板​ ...

  5. 使用IntelliJ IDEA 集成阿里提供的 Alibaba Cloud Toolkit插件,实现自动化远程部署Java项目(jar包,war包两种方式)

    打开IntelliJ IDEA编译器,点击文件==>点击设置(setting) 在设置页面点击插件(英文应该是 Plugins ,对IntelliJ IDEA汉化感兴趣的同学可以在这个页面搜索 ...

  6. java 不重启部署_编译Java类后不重启Tomcat有两种方式:热部署、热加载

    不重启Tomcat有两种方式:热部署.热加载 热部署:容器状况在运行时重新部署整个项目.这类环境下一般整个内存会清空,重新加载,这类方式 有可能会造成sessin丢失等环境.tomcat 6确实可以热 ...

  7. 快速搭建Springboot项目的两种方式!!

    大家好,我是雄雄,欢迎关注微信公众号[雄雄的小课堂]. 前言 Springboot的特点就是简单.快速和方便,使用idea不到一分钟就可以快速搭建springboot项目,并且,在这里,你不用写spr ...

  8. Spring boot项目(问答网站)之timeline的推拉两种模式

    Timeline介绍 所谓timeline就是当用户打开主页看到的随着时间轴发生的一系列时间的整合,主要包含: 关注用户的最新动态 热门推荐 广告推荐整合等等. 推.拉模式 推模式: 当一个用户关注了 ...

  9. Rust创建项目的两种方式

    Time: 20190919 这两种方式分别是: 手动创建项目,用rustc编译 使用包管理器cargo 手动创建 在文件夹内添加main.rs,代码内容如下: fn main() {println! ...

最新文章

  1. 2021-2027全球与中国跨临界二氧化碳系统市场现状及未来发展趋势报告
  2. Java对多线程的支持
  3. bash的常见命令及文章查看命令
  4. 5月以来的学习,软件工程+设计模式+J2EE开发+portal开发,以及SOA技术
  5. Jsp (Java Server Pages)相关知识九大内置对象和四大作用域
  6. 2018-06-13(日常运维三)
  7. 存储过程实现无限级分类(3)
  8. 腾讯安全Blade团队亮相CanSecWest峰会
  9. 图解分布式系统架构演进之路
  10. 1091 N-自守数 (15 分)
  11. typescript + react 项目开发体验之起手式
  12. 如何开启outlook邮箱的pop3和smtp_怎么在电子邮件客户端上登录腾讯邮箱(QQ邮箱 )?
  13. ecshop mysql 标题表_ecshop商品分类列表页如何自定义title标题
  14. css-3d旋转相册
  15. Quartz配置文件
  16. 计算机的音频管理器在哪里打开,Realtek高清晰音频管理器怎么找不到打开教程...
  17. 使用TEXT函数处理日期时间
  18. 关于python3.9安装Airtest跑脚本“jinja2”报错的问题说明
  19. 修改Win7硬盘分区盘符出现“虚拟磁盘管理器-参数错误”
  20. js算某天是今年的第几天

热门文章

  1. 2019中国物联网产业全景图谱报告|迎接物联网技术方案落地验证(转)
  2. Hiredis源码阅读(一)
  3. hud抬头显示器哪个好_手机导航秒变车载HUD抬头显示,真那么好用吗?
  4. 深度解析老年产业投资的底层逻辑
  5. java短信验证码功能发送的验证码如何校验_Java实现发送短信验证码功能
  6. 操作系统实验五·xv6系统内存布局修改·栈空间位置变更与栈不足时扩充
  7. PMP证书在面试项目经理时有加持吗?解惑
  8. Fusker - A NodeJS Security Framework
  9. 前端面试题个人汇总(精简知识要点 总结话术) / 前端小知识 保持学习 (年终奖年终奖 心心念念年终奖)
  10. 柯马机器人型号_柯马机器人的六大常见问题大盘点!——柯马机器人