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

相关推荐
惊起白鸽45012 分钟前
LVS负载均衡
运维·负载均衡·lvs
伤不起bb2 小时前
NoSQL 之 Redis 配置与优化
linux·运维·数据库·redis·nosql
广东数字化转型2 小时前
nginx怎么使用nginx-rtmp-module模块实现直播间功能
linux·运维·nginx
love530love2 小时前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
啵啵学习2 小时前
Linux 里 su 和 sudo 命令这两个有什么不一样?
linux·运维·服务器·单片机·ubuntu·centos·嵌入式
Hoking2 小时前
Kafka集群部署(docker容器方式)SASL认证(zookeeper)
docker·zookeeper·kafka
数字芯片实验室3 小时前
寄存器模型生成:从手工到自动化
运维·自动化
云道轩4 小时前
llm-d:面向Kubernetes的高性能分布式LLM推理框架
分布式·容器·kubernetes
冰橙子id4 小时前
linux——磁盘和文件系统管理
linux·运维·服务器
咕噜企业签名分发-淼淼4 小时前
应用app的服务器如何增加高并发
运维·服务器