在这篇文章中,我们将学习如何从零开始构建一个最小化的 Docker 镜像,基于 scratch 镜像,并在其中运行一个简单的 "Hello World" 程序。
Scratch 是一个空白的基础镜像,适用于构建轻量化、独立的容器。由于 scratch 不包含任何系统工具或库,程序必须是静态编译的,且不依赖于任何外部环境。

步骤概述
- 编写一个简单的 "Hello World" 程序
- 静态编译程序
- 创建 Dockerfile
- 构建镜像
- 运行镜像
- 验证镜像大小
1. 编写一个简单的 "Hello World" 程序
我们首先需要编写一个简单的 "Hello World" 程序,这里我们使用 Go 语言 编写,因为 Go 语言自带静态编译功能,适合在 scratch 镜像中使用。
创建一个名为 hello.go 的文件,内容如下:
go
// hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
2. 静态编译程序
为了确保程序能够在 scratch 镜像中运行,我们需要将其静态编译成不依赖外部库的二进制文件。
使用 Go 的静态编译命令:
bash
# 编译 Go 程序
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o hello hello.go
说明:
CGO_ENABLED=0:禁用 cgo,确保编译生成的程序是静态链接的。GOOS=linux和GOARCH=amd64:指定目标平台为 Linux 和 x86_64 架构。-o hello:指定输出文件名为hello。
3. 创建 Dockerfile
接下来,我们需要创建一个 Dockerfile,从 scratch 镜像开始,并将我们编译好的 hello 程序复制到镜像中。
创建 Dockerfile 文件,内容如下:
dockerfile
# Dockerfile
FROM scratch
COPY hello /hello
CMD ["/hello"]
说明:
FROM scratch:表示从空白镜像scratch开始构建。COPY hello /hello:将本地编译好的hello程序复制到容器的根目录。CMD ["/hello"]:指定容器启动时执行/hello程序。
4. 构建镜像
运行以下命令构建 Docker 镜像:
bash
docker build -t helloworld-scratch .
说明:
-t helloworld-scratch:指定镜像的名称为helloworld-scratch。.:表示当前目录是 Dockerfile 所在的目录。
5. 运行镜像
构建完成后,我们可以运行容器来测试它:
bash
docker run --rm helloworld-scratch
说明:
--rm:容器退出后自动删除容器。helloworld-scratch:指定要运行的镜像名称。
运行后,您应该能看到以下输出:
Hello, World!
6. 验证镜像大小
使用 docker images 查看构建的镜像大小。由于 scratch 是一个非常精简的镜像,最终的镜像大小应该非常小。
bash
docker images helloworld-scratch
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld-scratch latest abcdef123456 10 seconds ago 1.2MB
总结
通过这几个简单的步骤,我们从 scratch 开始,成功构建了一个最小化的 Docker 镜像,并运行了一个 "Hello World" 程序。这个过程展示了如何使用 静态编译 和 最小化镜像 来构建一个高效、轻量的 Docker 容器。
- 静态编译:确保程序不依赖于宿主机的库或系统工具。
scratch镜像:作为一个空白镜像,极大地减小了镜像的体积。- 最小化镜像:我们的镜像只有不到 2MB,适合部署高性能、低资源消耗的应用。
这种方式不仅适用于简单的程序,还可以扩展到更复杂的容器应用,特别是在需要严格控制容器体积和资源消耗的场景中。
📌 推荐工具: 寻找免费好用的在线开发工具?试试 Tool.tushuoit.com!从 App 开发到图像处理,再到 AI 创意工具,这里应有尽有。无需下载安装,随时随地提升您的工作效率。