如何利用 Docker 在 Ubuntu 上打包 Golang 应用

青禾
青禾
发布时间:2026-08-22| 115人浏览过
原创

前言

很多人第一次把 Go 项目容器化时,卡住的不是命令本身,而是不清楚 Dockerfile 该写到什么程度、端口映射又该怎么和程序类型对应。本文用一个最小可运行示例,把 Ubuntu 上从安装 Docker、准备 Go 程序到构建镜像、启动容器和验证结果的整套流程串起来,方便你快速跑通一次,并判断哪些参数需要按自己的项目调整。

在 Ubuntu 上把 Golang 应用交给 Docker 打包,核心并不复杂,难点通常在于第一次接触时不知道先做什么、哪些配置可以照抄、哪些地方必须按项目改。下面按“环境准备、示例程序、Dockerfile、构建运行、结果验证”这条线展开,保留最基础的命令和示例,方便你直接上手,也方便你对照自己的服务类型判断端口、基础镜像版本等细节是否需要调整。

先在 Ubuntu 上准备 Docker 环境

开始之前,先确认 Ubuntu 已经安装 Docker。没有安装的话,直接在终端执行下面两条命令:

sudo apt update
sudo apt install docker.io

安装完成后,可以用下面的命令确认 Docker 是否可用:

docker --version

如果终端能正常返回版本信息,就说明基础环境已经就绪,可以继续后面的打包流程。

准备一个可打包的 Go 示例程序

如果你已经有现成的 Go 项目,可以直接在项目根目录继续操作;如果只是想先验证流程,先准备一个最简单的 main.go 即可:

// main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, Docker!")
}

这个示例足够用来验证镜像构建和容器启动是否正常。文章后面的 Dockerfile 也默认以项目根目录中存在这个入口文件为前提。

编写 Dockerfile:基础镜像、构建命令和启动方式

在项目目录中新建 Dockerfile 文件,文件名区分大小写,且没有扩展名。示例内容如下:

展示 Dockerfile 中基础镜像、工作目录、复制源码、编译、端口与启动命令之间关系的信息图
Dockerfile 关键指令拆解把 Dockerfile 拆成几个关键指令后,首次打包时最容易理解哪些配置是固定流程。
# 使用官方的Golang镜像作为基础镜像
FROM golang:1.17

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到工作目录中
COPY . .

# 构建Golang应用
RUN go build -o main .

# 暴露端口(如果需要)
EXPOSE 8080

# 运行应用
CMD ["./main"]

这个 Dockerfile 对应的是最直接的一种做法,含义也比较清晰:

  • FROM golang:1.17:使用官方 Go 1.17 镜像作为基础环境。
  • WORKDIR /app:把容器内工作目录设为 /app。
  • COPY . .:将当前项目文件复制到容器工作目录。
  • RUN go build -o main .:在镜像构建阶段编译 Go 程序,输出可执行文件 main。
  • EXPOSE 8080:声明容器会使用 8080 端口,适合 HTTP 服务场景。
  • CMD ["./main"]:容器启动后默认执行编译产物。

这里保留的是 golang:1.17,如果你的项目依赖其他 Go 版本,直接替换版本号即可。至于 EXPOSE 8080,如果你的程序并不监听端口,这一行可以删除;如果是 Web 服务,则应按实际监听端口修改。

构建镜像:把代码和依赖一起封装

确认 Dockerfile 已经放在项目根目录后,在当前目录执行镜像构建命令:

docker build -t my-golang-app .

这里的 my-golang-app 是镜像名称,可以按你的项目习惯替换。执行后,Docker 会完成几件事:拉取基础镜像、复制项目文件、执行 go build -o main .,最后生成一个可运行镜像。

如果这一步没有报错,说明至少当前这份 Go 代码已经能在容器环境中顺利编译。

运行容器时要看端口映射是否一致

镜像构建完成后,就可以直接启动容器:

展示构建镜像、运行容器和访问服务之间顺序关系与端口映射逻辑的信息图
镜像构建到端口映射流程构建成功不等于访问一定正常,镜像、容器和端口映射是排查问题时最常见的三个检查点。
docker run -p 8080:8080 my-golang-app

-p 8080:8080 表示将宿主机的 8080 端口映射到容器内的 8080 端口。前一个端口是你在 Ubuntu 主机上访问的端口,后一个端口则要和应用在容器内实际监听的端口保持一致。

如果你的服务监听的不是 8080,比如 3000、8000 或其他端口,这里就要同步修改;否则容器虽然启动了,但外部访问会找不到服务。

如何验证应用是否真的跑起来了

启动完成后,可以访问下面的地址进行验证:

http://localhost:8080

这里需要根据程序类型判断结果是否正常:

  • 如果你的程序是一个 HTTP 服务,浏览器通常会直接显示返回内容。
  • 如果只是像示例中这样执行 fmt.Println("Hello, Docker!") 的命令行程序,那么输出更可能出现在终端,而不是浏览器页面。

换句话说,http://localhost:8080 这一步更适合验证 Web 应用;如果你打包的是一次性命令行程序,重点应该看容器启动后的终端输出是否符合预期。

这套最小流程适合哪些场景

按照上面的步骤,你已经完成了一次标准的 Ubuntu + Docker + Golang 打包流程:先安装 Docker,再准备 Go 程序,接着编写 Dockerfile,完成镜像构建,最后运行容器并验证结果。

这套写法更适合入门、验证环境或快速容器化已有小项目。后续如果你要继续优化,常见方向包括多阶段构建、缩小镜像体积以及接入数据库等,但它们都是在这条基础链路上继续扩展,核心思路并不会变化:把应用及其运行所需环境一起封装进镜像里,确保部署位置变化时,运行方式仍然保持一致。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。