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的更多相关文章

  1. 基于gin的golang web开发:路由

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...

  2. 基于gin的golang web开发:路由二

    在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...

  3. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  4. 基于gin的golang web开发:模型验证

    Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...

  5. 基于gin的golang web开发:访问mysql数据库

    web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...

  6. 基于gin的golang web开发:使用数据库事务

    在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go ...

  7. 基于gin的golang web开发:mysql增删改查

    Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...

  8. 基于gin的golang web开发:中间件

    gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...

  9. 基于gin的golang web开发:集成swagger

    在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...

随机推荐

  1. 《JavaScript高级程序设计》——第四章 变量、作用域和内存管理

    JavaScript变量可以用保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下基本类型数据:Undefined.Null.Boolean.Number和String. 从一个变量向另一个 ...

  2. 【转载】HPL与HPCG测试(一)

    来源:HPL与HPCG测试 (一) 一.HPL与HPCG 简介 1.HPL HPL 即 High Performance Linpack,它是针对现代并行计算集群的测试工具.用户不修改测试程序,通过调 ...

  3. 【译】Rust中的array、vector和slice

    原文链接:https://hashrust.com/blog/arrays-vectors-and-slices-in-rust/ 原文标题:Arrays, vectors and slices in ...

  4. 共线性分析-MCscan - python (jcvi)

    本来是不会再写这个文档的,但是由于长时间没有用这个模块,这个模块不知道是我自己弄掉了,还是别的同学误删了,于是我重新安装一下. 首先下载conda,并下载好python which pip 直接安装 ...

  5. uniApp打卡日历

    功能 滑动切换时间,打点功能,支持月周切换日历组件    这是一款支持滑动切换以及周模式和月模式切换功能的日历组件,可以设置打卡信息,自定义样式. 组件样式使用了sass所有需要项目中先安装node- ...

  6. 解决nginx中js修改不生效的问题

    最近在做商城项目,使用nginx实现动静分离.结果在修改nginx文件夹下的js文件,浏览器访问网址现实的还是原来的旧的js文件.清理浏览器缓存,重启nginx均无效,最后在网上找到解决方案

  7. 【转载】Apriori

    通过这个博客学习:数据挖掘十大算法(四):Apriori(关联分析算法) 代码也是摘自上面博客,对照代码理解理论部分可能更加有助于对该算法的理解 from numpy import * # 构造数据 ...

  8. C++ 设计模式 1:概述

    1 设计模式概述 1.1 定义 设计模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案. 1.2 设计模式的种类 GoF 提出的设计模式有 23 个,包括: 创建型模式:如何创建对象 ...

  9. CentOS修改镜像源头

    CentOS6改为阿里镜像源: 1. cd /etc/yum.repos.d 2. mv CentOS-Base.repo CenOS-Base.repo.bak 3. wget http://mir ...

  10. [MIT6.006] 5. Binary Search Trees, BST Sort 二分搜索树,BST排序

    第5节课主要讲述了二分搜索树概念和BST排序.讲师提出一个关于"跑道预订系统"的问题,假设飞机场只有一个跑道,飞机需要为未来降落时间t进行预订,如果时间集合R中,在t时间前后k分钟 ...