Golang项目部署3,容器部署

文章来源:https://goframe.org/deployment/container

容器部署

容器部署即使用docker化部署golang应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。

在以下我们的示例中,统一使用 main 作为项目名称。

1. 编译程序

跨平台交叉编译是golang的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常容易地解决了运行依赖问题。

使用以下指令可以静态编译Linux平台amd64架构的可执行文件:

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

生成的main便是我们静态编译的,可部署于Linux amd64上的可执行文件。

2. 编译镜像

我们需要将该可执行文件main编译生成docker镜像,以便于分发及部署。Golang的运行环境推荐使用alpine基础系统镜像,编译出的容器镜像约为20MB左右。

一个参考的Dockerfile文件如下:

1FROM loads/alpine:3.8 2 3LABEL maintainer="john@johng.cn" 4 5############################################################################### 6# INSTALLATION 7############################################################################### 8 9# 设置固定的项目路径 10ENV WORKDIR /var/www/main 11 12# 添加应用可执行文件,并设置执行权限 13ADD ./main $WORKDIR/main 14RUN chmod +x $WORKDIR/main 15 16# 添加静态文件、配置文件、模板文件 17ADD public $WORKDIR/public 18ADD config $WORKDIR/config 19ADD template $WORKDIR/template 20 21############################################################################### 22# START 23############################################################################### 24WORKDIR $WORKDIR 25CMD ./main

其中,我们的基础镜像使用了loads/alpine:3.8,中国国内的用户推荐使用该基础镜像,基础镜像的Dockerfile地址:https://github.com/johngcn/dockerfiles ,仓库地址:https://hub.docker.com/u/loads

随后使用 "docker build -t main ." 指令编译生成名为maindocker镜像。

注意事项

需要注意的是,在某些项目的架构设计中,静态文件配置文件可能不会随着镜像进行编译发布,而是分开进行管理和发布。

例如,使用MVVM模式的项目中(例如使用vue框架),往往是前后端非常独立的,因此在镜像中往往并不会包含public目录。而使用了配置管理中心(例如使用consul/etcd/zookeeper)的项目中,也往往并不需要config目录。

因此对于以上示例的Dockerfile的使用,仅作参考,根据实际情况请进行必要的调整。

3. 运行镜像

使用以下指令可直接运行刚才编译成的镜像:

docker run main

4. 镜像分发

容器的分发可以使用docker官方的平台:https://hub.docker.com/ ,国内也可以考虑使用阿里云:https://www.aliyun.com/product/acr

5. 容器编排

在企业级生产环境中,docker容器往往需要结合kubernetes或者docker swarm容器编排工具一起使用。 容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )