编写 Go 项目的 Dockerfile 文件及生成 Docker 镜像

在实际项目开发中,我们通常会将应用程序容器化,以便在不同环境下统一部署、运行和测试。对于 Go 项目,Docker 提供了简洁而高效的容器化解决方案。本篇文章将详细介绍如何为 Go 项目编写 Dockerfile 文件,并生成 Docker 镜像。

1. Go 项目的准备

假设你已经有一个 Go 项目,并且这个项目可以正常运行。为了示范,我们假设你的 Go 项目结构如下:

go 复制代码
my-go-app/
├── main.go
├── go.mod
└── go.sum

main.go 是你的 Go 项目的入口文件,go.mod 是 Go 的模块管理文件,go.sum 用于记录模块的校验信息。 2. 在项目根目录下面创建 Dockfile 文件 3. 编辑Dockfile文件

ini 复制代码
FROM golang:1.19

ENV GO111MODULE=on \
TZ=Asia/Shanghai \
CGO_ENABLE=0 \
GOOS=linux \
GOARCH=amd64 \
GOPROXY="https://goproxy.cn,direct"

WORKDIR /APP

ADD . /APP

RUN go build -o main ./main.go

EXPOSE 9999

CMD ["/APP/main"]

FROM : 使用到的golang的镜像版本,建议和项目中使用的版本一致

ENV:golang使用到的环境变量,为了解决下载依赖慢或者失败的问题

WORKDIR:是将项目的放到容器中的位置

ADD:将项目中的所有文件放入容器的位置下

RUN:编译项目生成二进制文件

EXPOSE:运行的端口

CMD 执行项目的命令

  1. 将项目上传到服务器上

  2. 生成docker镜像

    docker build . -t 镜像名

  3. 启动容器

yaml 复制代码
docker run -d -p 8888:8888 镜像名
# 别忘了服务器的安全组

解释

  • docker run -d:以守护进程模式运行容器。
  • -p 8080:8080:将容器的 8080 端口映射到宿主机的 8080 端口,使得你可以通过浏览器访问应用。
  • --name my-go-app-container:为容器指定一个名字 my-go-app-container
  • my-go-app:运行时使用的镜像名称。

运行后,你可以通过访问 http://localhost:8080 来测试你的应用。如果一切顺利,你将看到 Go 应用的输出。

6. 其他优化和注意事项

  • 多阶段构建:通过多阶段构建,可以将构建工具和运行环境分离,减少最终镜像的体积。
  • 镜像大小:使用 Alpine 镜像作为基础镜像,可以大大减小镜像的体积。
  • 缓存:通过合理利用 Docker 缓存机制,可以加速镜像的构建过程,尤其是在依赖没有变化的情况下。

总结

本文介绍了如何为 Go 项目编写 Dockerfile 文件,并通过 Docker 构建镜像和运行容器。通过容器化技术,我们能够更轻松地管理和部署 Go 应用程序。通过 Dockerfile 的多阶段构建方式,我们可以在保证镜像体积小的同时,确保应用程序的正常运行。这种方式在开发和生产环境中都具有很大的优势。

希望这篇文章能帮助你快速掌握使用 Docker 部署 Go 项目的技巧!

相关推荐
80530单词突击赢31 分钟前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法1 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy1 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇1 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long3161 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
Serene_Dream2 小时前
JVM 并发 GC - 三色标记
jvm·面试
rannn_1112 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日2 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu3 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人3 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python