你是否想写一个使用 Docker 容器化的 Golang 应用程序?本文的目的就是帮助你快速将你的 Golang 应用程序容器化,以用于 开发 (带热加载)和 生产 目的。

开始之前
请先安装 Docker Desktop ,然后再继续。安装后,启动桌面应用程序,如果它运行成功,你就可以开始了。

此外,我假设你有一个 $GOPATH 目录,你可以在里面放置你正在处理的 Golang 源代码。比如我的是: ~/go/src/github.com/bartmika 。

… 但我不熟悉 Docker 怎么办?
别担心!Docker 是一个成熟的工具集,它已经存在了足够长的时间,可以提供大量优秀的教学资源来帮助你学习。

将Golang 和 Docker 用于热加载的开发环境
在本节中,你将学习如何在你的机器上设置你的 Golang 应用程序进行本地开发。开发容器的目的是保存所有依赖项(例如:第三方包,如 GORM )、基础设施(例如:数据库、内存缓存等)以及帮助和提升你开发的代码。

创建我们应用程序的仓库

   mkdir mullberry-backendcd mullberry-backendgo mod init github.com/bartmika/mullberry-backen

每次你想要增加依赖,你都可以关闭当前运行的容器并安装依赖项。按照如下方式安装我们的依赖项:

   go get github.com/labstack/echo/v4go get github.com/labstack/echo/v4/middleware@v4.7.2

等等,你需要在本地安装 Golang 吗?那么容器的意义何在?这个 Stackoverflow 用户在讨论为开发目的设置 Dockerfile 时解释得最好:
当你想要把应用打包到容器中以准备部署时, Dockerfile 是非常棒的。对于希望将源代码放在容器外部的开发和希望正在运行的容器对源代码的改变作出反应的开发来说,就不是很合适了。

所以从本质上讲,如果你对这个限制没意见,那就继续吧!

在你的项目的根目录创建 main.go 文件,并复制粘贴下面代码:

     package mainimport ("net/http""os""github.com/labstack/echo/v4""github.com/labstack/echo/v4/middleware")func main() {e := echo.New()e.Use(middleware.Logger())e.Use(middleware.Recover())e.GET("/", func(c echo.Context) error {return c.HTML(http.StatusOK, "Hello, Docker! <3")})e.GET("/ping", func(c echo.Context) error {return c.JSON(http.StatusOK, struct{ Status string }{Status: "OK"})})httpPort := os.Getenv("HTTP_PORT")if httpPort == "" {httpPort = "8080"}e.Logger.Fatal(e.Start(":" + httpPort))}

注意,上面的代码是从 Docker 文档构建你的 Go 镜像 复制而来。

在创建任何与 docker 相关的内容之前,请创建一个 .dockerignore 文件 并复制并粘贴以下内容:

       bin.dockerignoreDockerfiledocker-compose.ymldev.Dockerfiledev.docker-compose.yml.env

什么是 .dockerignore 文件?本质上,它类似于 .gitignore 其中某些文件/文件夹不会保存到 docker 容器和镜像中。

创建 dev.Dockerfile 文件并将以下内容复制并粘贴到其中。

      FROM golang:1.18# Copy application data into imageCOPY . /go/src/bartmika/mullberry-backendWORKDIR /go/src/bartmika/mullberry-backendCOPY go.mod ./COPY go.sum ./RUN go mod download# Copy only `.go` files, if you want all files to be copied then replace `with `COPY . .` for the code below.COPY *.go .# Install our third-party application for hot-reloading capability.RUN ["go", "get", "github.com/githubnemo/CompileDaemon"]RUN ["go", "install", "github.com/githubnemo/CompileDaemon"]ENTRYPOINT CompileDaemon -polling -log-prefix=false -build="go build ." -command="./mullberry-backend" -directory="./"
  如果你阅读上面的注释,你会注意到 `CompileDaemon` (https://github.com/githubnemo/CompileDaemon) 的用法。那是什么?本质上它是你的热加载器!它在一个目录中监视你的 .go 文件,如果文件发生变化,它会调用 `go build`。 例如,你在 `Atom` IDE 中打开这个项目,修改 `main.go` 文件并点击 _Save_,然后 [`CompileDaemon`]
(https://github.com/githubnemo/CompileDaemon) 将重建你容器中的 Go 应用程序,所以你可以看到最新的构建!

创建我们的 dev.docker-compose.yml 文件:

   version: '3.6'services:api:container_name: mullberry-backendimage: mullberry-backendports:- 8000:8080volumes:- ./:/go/src/bartmika/mullberry-backendbuild:dockerfile: dev.Dockerfile

等等,为什么我对这些 Docker 文件名使用 dev. 前缀?原因是因为我想区分用于 生产 和 开发 目的的 Docker 文件。

在你的终端中,使用以下命令启动开发环境:

   $ docker-compose -f dev.docker-compose.yml up

确认我们可以访问它。

    $ curl localhost:8000/

你将在你的终端中看到以下输出:

Hello, Docker! <3

如果你看到这个,恭喜你已经准备好开始开发了!如果你想了解更多信息,请随时通过他们的 Docker 文档查看构建你的 Go 映像 一文。

将 Golang 和 Docker 用于生产环境
本节的目的是让你的 Golang 应用程序容器化并准备好在生产环境中运行。

选项 1:单阶段
最简单的设置就是单阶段构建。这样构建的问题就是你的 Docker 镜像将非常大。首先,在你的项目根文件夹中创建一个 Dockerfile 并将以下内容复制并粘贴到其中:

FROM golang:1.18
# Copy application data into image
COPY . /go/src/bartmika/mullberry-backend
WORKDIR /go/src/bartmika/mullberry-backend
COPY go.mod ./
COPY go.sum ./
RUN go mod download
# Copy only `.go` files, if you want all files to be copied then replace `with `COPY . .` for the code below.
COPY *.go .
# Build our application.
RUN go build -o ./bin/mullberry-backend
EXPOSE 8080
# Run the application.
CMD ["./bin/mullberry-backend"]

然后运行 up 命令,你将会看到它工作:

$ docker-compose up

选项 2:多阶段
一个更复杂的设置被称为_多阶段构建_可以节省磁盘空间。主要思路是你在一个容器中构建你的 Golang 应用程序,然后将它移动到另一个更小的容器中,从而丢弃了磁盘空间沉重的容器。

如果你想尝试一下,请在项目根文件夹中创建一个 Dockerfile ,然后将以下内容复制并粘贴到其中:

##
## Build
##
FROM golang:1.18-alpine as dev-env# Copy application data into image
COPY . /go/src/bartmika/mullberry-backend
WORKDIR /go/src/bartmika/mullberry-backendCOPY go.mod ./
COPY go.sum ./
RUN go mod download# Copy only `.go` files, if you want all files to be copied then replace `with `COPY . .` for the code below.
COPY *.go .# Build our application.
# RUN go build -o /go/src/bartmika/mullberry-backend/bin/mullberry-backend
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -gcflags "all=-N -l" -o /server##
## Deploy
##
FROM alpine:latest
RUN mkdir /dataCOPY --from=dev-env /server ./
CMD ["./server"]

然后运行 up 命令,你将会看到它工作:

$ docker-compose up

如何在开发和生产环境中使用 Docker 容器化 Golang 应用相关推荐

  1. git(gitlab)子模块功能在团队协同开发和生产环境中的应用(git,gitlab,TortoiseGit,CI/CD,Jenkins,docker-compose,分支合并,开发环境,测试环境)

    git(gitlab)子模块功能在团队协同开发和生产环境中的应用 目录 git(gitlab)子模块功能在团队协同开发和生产环境中的应用 一.前言 二.先决条件 三.创建gitlab项目(项目管理员操 ...

  2. ionic app 开发和生产环境的配置

    前言 像 Angular2 一样,希望 ionic 可以提供 2 个文件 ( environment.dev.ts 和 environment.prod.ts ),其中包含与开发和生产环境相对应的不同 ...

  3. 【转】在生产环境中部署前端代码

    在生产环境中部署前端代码 本文章前端代码是基于vue+webpack开发的 Nginx是一款轻量级的Web 服务器/反向代理服务器 首先,webpack配置如下 在开发过程中,我们是通过npm run ...

  4. php微服务架构设计模式,《微服务架构设计模式》读书笔记---第十一章:开发面向生产环境的微服务应用...

    为了部署到生产环境中,需要考虑三个关键的质量属性:安全性,可配置性和可观测性. 开发安全的服务 需要实现安全性的四个方面: 身份验证. 访问授权.验证是否允许访问主体对指定数据完成请求的操作. 审计. ...

  5. 在生产环境中调试 Angular 应用程序而不显示源映射

    当我们的 Angular 应用程序部署到生产环境时,我们经常会遇到与我们在开发过程中编辑的不同的代码.我们的代码在构建过程中会以各种方式进行修改和优化. TypeScript 被 transpiled ...

  6. 开发测试服务器配置信息,node服务端中台实现及开发测试生产环境配置

    本人node服务端新人一枚,网上找了不少资料,看了很多别人的配置信息,感觉都不是很合适,看的多了自己也明白配置的具体思路跟实现方式了,以下为我的实现方式.通过package.json里面的script ...

  7. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是"借力开源. ...

  8. 一文教你如何在生产环境中在Kubernetes上部署Jaeger

    作者 |  Dotan Horovit 翻译 | 火火酱~ 责编 | 晋兆雨 出品 | CSDN云计算 日志.指标和跟踪是"可观察性"领域的三大支柱.最近几个月,随着OpenTel ...

  9. webpack上线版(生产环境中推荐使用)

    配置上线版(生产环境)webpack: 实际中将开发环境中和生产环境中打包配置是分开的,两者本质没太大区别,只是生产环境中的webpack打包配置要更加优化合理,下面将具体介绍一下生产环境中webpa ...

最新文章

  1. JSOUP 打开url的方式
  2. java 调用url_java程序中访问url接口
  3. python【Matlibplot绘图库】绘制用于学术论文投稿的黑白图片
  4. 操作系统第二章 进程管理
  5. 反序列化(先序)——split : string--vectorstring
  6. 删除远程桌面登陆痕迹
  7. 相信什么,生命就走向什么
  8. Python 多线程总结
  9. 非极大值抑制(non-maximum suppression)的理解与实现
  10. 巧用ASP.NET预编译Web应用程序规避调用延迟,徐汇区网站设计
  11. mysql 聚集函数 count 使用详解
  12. Atitit 微服务之道 attilax著 1. 什么是微服务架构? 1 1.1. 、微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现 2 1.2. 微服务与康威定律 2 1
  13. php学生管理系统整理
  14. Java字符串排序设计(升序排列)
  15. 计算机启动项在什么地方找,如何查看电脑开机启动项_系统开机启动项快捷键 - 学无忧...
  16. ubuntu16.04连接android手机蓝牙共享网络热点
  17. macOS_Catalina_10.15.7_19H15可引导可虚拟机安装的纯净版苹果OS系统ISO镜像安装包免费下载
  18. redis crackit入侵事件总结
  19. 散列表查找——线性探测法
  20. 西部数码 php 伪静态,西部数码虚拟主机伪静态如何设置

热门文章

  1. 图解Python语法
  2. 实战6:基于OpenCV的人脸口罩识别检测详细教程
  3. linux shell 获取环境变量,bash shell中的环境变量
  4. 大数据应用---之---互联网金融---客户风险控制
  5. mysql建表时错误1075_navicat出现错误1075怎么办
  6. Ripple Labs和R3联盟在XRP代币诉讼中达成和解
  7. 最小二乘法拟合圆公式推导及vc实现
  8. 论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=>翻译及理解(持续更新中)
  9. 快消品企业为什么要上专业的费用管理系统
  10. mac下PostgreSQL远程连接服务出错SSL off