在 Debian 上做 Go 应用容器化,最容易卡住的通常不是语法,而是步骤顺序:先准备运行环境,还是先编译程序,Dockerfile 又该怎么写。这篇文章按实际操作链路把最小可运行流程拆开,从本地编译到镜像构建再到容器启动,帮助你快速判断每一步该看到什么结果,以及这个基础方案适合扩展到哪些场景。
先在 Debian 上准备 Docker 环境
开始之前,先确认 Debian 已经安装 Docker。原文给出的做法很直接,执行下面两条命令即可:
sudo apt update
sudo apt install docker.io
安装完成后,就具备了后续构建和运行容器镜像的基础环境。
编写一个最小 Go 示例程序
为了先把容器化链路跑通,可以从最经典的 Hello, World! 开始。在当前工作目录新建 hello.go,内容如下:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
这个示例足够简单,但已经能覆盖 Go 程序编译、镜像封装和容器执行的完整过程。
先把 Go 代码编译为可执行文件
容器里最终运行的不是源码,而是编译后的二进制文件。因此,先在 hello.go 所在目录执行构建命令:
go build -o hello hello.go
命令执行完成后,当前目录会生成一个名为 hello 的可执行文件。后面的 Dockerfile 会直接把这个文件复制进镜像中。
编写 Dockerfile 封装 Go 二进制
在同一目录下新建 Dockerfile,写入以下内容:

# 使用官方的Golang镜像作为基础镜像
FROM golang:latest
# 设置工作目录
WORKDIR /app
# 将构建好的二进制文件复制到容器中
COPY hello /app/hello
# 暴露端口(如果需要)
EXPOSE 8080
# 运行二进制文件
CMD ["./hello"]
这份 Dockerfile 做了几件事:指定基础镜像为 golang:latest,把工作目录设为 /app,复制已经编译好的 hello 文件,并在容器启动时执行它。
其中 EXPOSE 8080 这一行属于“按需保留”的配置。当前示例程序只是向标准输出打印一行文本,并没有实际监听端口,所以这行不是运行示例所必需;但如果你后续替换成 Web 服务程序,这种写法就可以直接沿用。
构建 hello-go 镜像
确认 Dockerfile 和编译产物 hello 位于同一目录后,执行镜像构建命令:

docker build -t hello-go .
这里的 -t hello-go 用来为镜像指定名称,末尾的 . 表示当前目录就是构建上下文。构建成功后,你会得到一个名为 hello-go 的镜像。
运行容器并验证输出
镜像构建完成后,可以直接启动容器验证结果:
docker run --rm hello-go
如果前面的步骤没有问题,终端会输出:
Hello, World!
其中 --rm 参数表示容器退出后自动删除,适合这种一次性验证场景,能避免本机残留过多临时容器。
这个最小方案能解决什么,下一步该补什么
到这里,一个简单的 Go 应用已经在 Debian 下完成了基础容器化。这个方法的核心价值,在于先把“源码 -> 二进制 -> 镜像 -> 容器运行”这条链路完整打通。
对于真实项目,后续通常还会继续补上几类能力:例如依赖处理、环境变量注入,以及多阶段构建等。原始示例没有展开这些部分,但作为入门模板,它已经足够说明容器化的基本结构和执行顺序。







