从 scratch开始构建一个最小化的 Hello World Docker 镜像-docker的镜像源头

在这篇文章中,我们将学习如何从零开始构建一个最小化的 Docker 镜像,基于 scratch 镜像,并在其中运行一个简单的 "Hello World" 程序。

Scratch 是一个空白的基础镜像,适用于构建轻量化、独立的容器。由于 scratch 不包含任何系统工具或库,程序必须是静态编译的,且不依赖于任何外部环境。

步骤概述

  1. 编写一个简单的 "Hello World" 程序
  2. 静态编译程序
  3. 创建 Dockerfile
  4. 构建镜像
  5. 运行镜像
  6. 验证镜像大小

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=linuxGOARCH=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 创意工具,这里应有尽有。无需下载安装,随时随地提升您的工作效率。

相关推荐
云和数据.ChenGuang4 分钟前
运维面试题之oracle和mysql单表最大容量
运维·mysql·oracle
酷柚易汛智推官17 分钟前
Fastlane赋能移动研发:从全流程自动化到工程效能升级
运维·自动化·酷柚易汛
落798.23 分钟前
Genlogin × Bright Data,一键解锁自动化采集的高成功率方案
运维·自动化·数据采集·亮数据
羑悻的小杀马特33 分钟前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
L***86531 小时前
Failed to restart nginx.service Unit nginx.service not found
运维·nginx
十六年开源服务商2 小时前
WordPress运维服务怎样提供客户服务支持
运维
chxii2 小时前
PHP 配置全解析:Apache vs Nginx 的线程安全差异与 Windows 实战指南
运维·php
想唱rap3 小时前
C++ map和set
linux·运维·服务器·开发语言·c++·算法
fruge3 小时前
前端文档自动化:用 VitePress 搭建团队技术文档(含自动部署)
运维·前端·自动化
z***56564 小时前
Nginx实现接口复制
运维·nginx·junit