在 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 文件,文件名区分大小写,且没有扩展名。示例内容如下:

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









