基于gin的golang web开发:docker
Golang天生适合运行在docker
容器中,这得益于:Golang
的静态编译,当在编译的时候关闭cgo
的时候,可以完全不依赖系统环境。
一些基础
测试容器时我们经常需要进入容器查看运行情况,以下命令启动一个centos容器并进入bash交互环境。
docker run -it --rm centos bash
-it 组合参数-i: 以交互模式运行容器,-t: 为容器重新分配一个伪输入终端。
--rm 在容器退出时就能够自动清理容器。
alpine镜像中没有bash,启动容器并进入终端的命令为
docker run -it --rm alpine sh
启动一个golang编译环境并进入bash
docker run -it -p 8081:8081 -v ./project:/app --env --env GO111MODULE=on --env GOPROXY=https://goproxy.cn,direct --rm --privileged golang:1.15 bash
-v ./project:/app 绑定本机项目的路径映射到容器中/app
--env 设置环境变量,由于我们网络环境的问题直接使用golang容器会很慢所以设置了GOPROXY=https://goproxy.cn,direct。
--privileged 容器内的root拥有真正的root权限,否则容器内root只是外部的一个普通用户。
-p 8081:8001 将本机的8081端口映射到容器的8001端口
docker打包项目
为了方便演示docker,我们准备一个简单Gin项目。要注意r.Run
不能绑定127.0.0.1。
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run("0.0.0.0:9999")
}
启动golang容器,在容器中尝试编译并运行程序。
docker run -it -p 9999:9999 -v ./project:/app --env --env GO111MODULE=on --env GOPROXY=https://goproxy.cn,direct --rm --privileged golang:1.15 bash
Alpine和其他通用Linux发行版对于Golang编译出来的可执行文件要求有所不同,Alpine要求可执行文件必须是静态链接的可执行文件。所以在编译Golang时需要添加 -tags netgo ,来生成静态链接的可执行文件。
go build -tags netgo -o app .
把编译出来的二进制文件和所有依赖项拷贝到发布目录
mkdir publish && cp app publish && \
cp -r docs publish
golang镜像的1.15版本有839M,再加上下载依赖编译项目等各种文件的话最终镜像可能会超过1G,大部分文件是在运行时不需要的。我们编写Dockerfile的时候可以把编译和运行两个阶段分开。编译时使用golang镜像,运行时使用alpine镜像。alpine镜像初始大小只有5M左右,非常适合作为基础镜像。最终Dockerfile如下
FROM golang:1.15 as builder
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct
WORKDIR /app
COPY . .
RUN GOOS=linux GOARCH=amd64 go build -tags netgo -o app .
RUN mkdir publish && cp app publish && \
cp -r docs publish
FROM alpine
WORKDIR /app
COPY --from=builder /app/publish .
ENV GIN_MODE=release \
PORT=8081
EXPOSE 8081
ENTRYPOINT ["./app"]
构建docker镜像,大功告成。
docker build -t test:0.1 .
文章出处:基于gin的golang web开发:docker
基于gin的golang web开发:docker的更多相关文章
- 基于gin的golang web开发:路由
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...
- 基于gin的golang web开发:路由二
在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...
- 基于gin的golang web开发:模型绑定
在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...
- 基于gin的golang web开发:模型验证
Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...
- 基于gin的golang web开发:访问mysql数据库
web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...
- 基于gin的golang web开发:使用数据库事务
在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- 基于gin的golang web开发:中间件
gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...
- 基于gin的golang web开发:集成swagger
在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...
随机推荐
- Redis学习笔记(七)——数据结构之有序集合(sorted set)
一.介绍 Redis有序集合和集合一样都是string类型元素的机会,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.Redis正是通过分数来为集合中的成员进行从小到放大的排 ...
- JDK---00Linux上编译openjdk8
Centos 7 编译自定义jdk8 1. 安装所需的依赖 yum install alsa-lib-devel cups-devel libX* gcc gcc-c++ freetype-devel ...
- 专题四:redis的数据类型之list
一.基本介绍 对于list,它的存储需求是什么呢?对于string,讲究单个,hash也不讲究大量:当我们需要存储多个数据的时候,前面的数据类型就不大合适了. 数据存储需求:存储多个数据,并对数据进入 ...
- python创建Django项目
创建Django项目 关注公众号"轻松学编程"了解更多. 创建一个HelloDjango项目 GitHub地址:https://github.com/liangdongchang/ ...
- 【快速因数分解】Pollard's Rho 算法
Pollard-Rho 是一个很神奇的算法,用于在 $O(n^{\frac{1}4}) $的期望时间复杂度内计算合数 n 的某个非平凡因子(除了1和它本身以外能整除它的数).事书上给出的复杂度是 \( ...
- 关于红黑树,在HashMap中是怎么应用的?
关于红黑树,在HashMap中是怎么应用的? 前言 在阅读HashMap源码时,会发现在HashMap中使用了红黑树,所以需要先了解什么是红黑树,以及其原理.从而再进一步阅读HashMap中的链表到红 ...
- XJOI 夏令营501-511NOIP训练18 高三楼
参观完各种饭堂,学校还有什么著名的景点呢?当然是教室了,此时此刻我 们来到了高三楼.你会发现高三楼门口会有以身份认证系统,这东西还有着一段疼人的历史.每年的九月到来,高三的童鞋大多不习惯学校的作息时间 ...
- C/C++四种取整函数floor,ceil,trunc,round
处理浮点数操作常用到取整函数,C/C++提供了四种取整函数 floor函数 floor函数:向下取整函数,或称为向负无穷取整 double floor(double x); floor(-5.5) = ...
- 交换机基于接口划分VLAN(汇聚层设备作为网关)
组网图形 简介 划分VLAN的方式有:基于接口.基于MAC地址.基于IP子网.基于协议.基于策略(MAC地址.IP地址.接口).其中基于接口划分VLAN,是最简单,最常见的划分方式,如接入层设备作为网 ...
- 面试题:你有没有搞混查询缓存和Buffer Pool
一. 关注送书!<Netty实战> 文章公号号首发!连载中!关注微信公号回复:"抽奖" 可参加抽活动 首发地址:点击跳转阅读原文,有更好的阅读体验 使用推荐阅读,有更好 ...