编写 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 项目的技巧!

相关推荐
chenyuhao20243 小时前
Linux网络编程:HTTP协议
linux·服务器·网络·c++·后端·http·https
Java中文社群3 小时前
避坑指南!别再被N8N循环节点“调戏”了!为什么你的Done分支执行了多次?
人工智能·后端
superman超哥3 小时前
仓颉元编程进阶:编译期计算能力的原理与深度实践
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉元编程·编译器计算能力
凌览4 小时前
2025年,我和AI合伙开发了四款小工具
前端·javascript·后端
乘风破浪酱524364 小时前
记一次微信小程序登录异常排查:从UnknownHostException到DNS解析失败
后端
-拟墨画扇-4 小时前
Git | 标签操作
git·gitee·github·gitcode
先跑起来再说4 小时前
Go 语言的 Mutex 底层实现详解:状态位、CAS、自旋、饥饿模式与信号量
服务器·后端·golang
晴虹4 小时前
lecen:一个更好的开源可视化系统搭建项目--介绍、搭建、访问与基本配置--全低代码|所见即所得|利用可视化设计器构建你的应用系统-做一个懂你的人
前端·后端·低代码
苏叶新城4 小时前
SpringBoot 3.5 JPA投影
java·spring boot·后端