Docker 基础镜像构建

发布时间: 更新时间: 总字数:1044 阅读时间:3m 作者: IP上海 分享 网址

构建 Docker 镜像时,我们都是通过 FROM 指定一个已有镜像进行构建,该镜像一般称为基础镜像,它并不是凭空出现的,也是基于 Dockerfile 构建的,那如何创建一个基础镜像呢,本文将通过示例构建 busybox 基础镜像。

基础镜像的构建方法

  • 基于 debootstrap 构建 ubuntu 基础镜像
  • 基于 moby 构建,参考
  • 使用 FROM scratch 构建
  • buildah 一个构建 OCI镜像 的工具

构建过程

下面开始构建 busybox 基础镜像

busybox 编译

参考:从源码编译内核 linux-5.15.16 并制作基于 KVM 的 busybox 镜像buysbox 编译 章节编译 busybox,完成后通过如下命令制作 rootfs.tar.gz

cd busybox-1.35.0/_install
tar -zcvf rootfs.tar.gz .

准备 Dockerfile

$ cat << EOF >> Dockerfile
FROM scratch
ADD rootfs.tar.gz /
CMD ["bash"]
EOF

Dockerfile 说明:

  • FROM scratch 翻译为:白手起家;从头做起,在 docker hub 也要该镜像的说明:an explicitly empty image, especially for building images "FROM scratch",就是一个空的镜像。且从 docker 1.5 版本开始,在 DockerfileFROM scratch 指令并不进行任何操作
As of Docker 1.5.0 (specifically, docker/docker#8827), FROM scratch is a no-op in the Dockerfile, and will not create an extra layer in your image (so a previously 2-layer image will be a 1-layer image instead).
  • ADD rootfs.tar.gz / 将 buxybox 编译后的包解压到 / 根目录
  • CMD ["bash"] 指定基于该镜像在启动容器时的程序

编译基础镜像

$ docker build -t busybox:1 .
Sending build context to Docker daemon  1.445MB
Step 1/3 : FROM scratch
 --->
Step 2/3 : ADD rootfs.tar.gz /
 ---> Using cache
 ---> 96b7db3a783d
Step 3/3 : CMD ["bash"]
 ---> Using cache
 ---> 6338ef04865f
Successfully built 6338ef04865f
Successfully tagged busybox:1
$ docker images
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
busybox                1         6338ef04865f   1 hours ago     2.71MB

查看镜像

使用 dive 查看镜像,可以看到该镜像只有一个层,如下:

$ dive busybox:1
 ┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├─────────────────────────────────
Cmp   Size  Command                                         Permission     UID:GID       Size  Filetree
    2.7 MB  FROM 6f5345b50167158                            drwxr-xr-x         0:0     2.7 MB  ├── bin
                                                            -rwxrwxrwx         0:0        0 B  │   ├── arch → busybox
│ Layer Details ├────────────────────────────────────────── -rwxrwxrwx         0:0        0 B  │   ├── ash → busybox
                                                            -rwxrwxrwx         0:0        0 B  │   ├── base32 → busybox
Tags:   (unavailable)                                       -rwxrwxrwx         0:0        0 B  │   ├── base64 → busybox
Id:     6f5345b501671581ef9fe69c1900e698d13436a6de4c66caddd -rwxr-xr-x         0:0     2.7 MB  │   ├── busybox
92d5ac6e83686                                               -rwxrwxrwx         0:0        0 B  │   ├── cat → busybox
Digest: sha256:188a3a00b503e171b022a32f8ef922ce7d34990ba04c -rwxrwxrwx         0:0        0 B  │   ├── chattr → busybox
2b2348e914a910a2235d                                        -rwxrwxrwx         0:0        0 B  │   ├── chgrp → busybox
Command:                                                    -rwxrwxrwx         0:0        0 B  │   ├── chmod → busybox
#(nop) ADD file:24d85fcdccf5f9791509a63964fc4ea2f2518d7445f -rwxrwxrwx         0:0        0 B  │   ├── chown → busybox
22b3c6cc81e9fa45345ba in /                                  -rwxrwxrwx         0:0        0 B  │   ├── conspy → busybox
                                                            -rwxrwxrwx         0:0        0 B  │   ├── cp → busybox
│ Image Details ├────────────────────────────────────────── -rwxrwxrwx         0:0        0 B  │   ├── cpio → busybox
                                                            -rwxrwxrwx         0:0        0 B  │   ├── cttyhack → busyb
                                                            -rwxrwxrwx         0:0        0 B  │   ├── date → busybox
Total Image size: 2.7 MB                                    -rwxrwxrwx         0:0        0 B  │   ├── dd → busybox
Potential wasted space: 0 B                                 -rwxrwxrwx         0:0        0 B  │   ├── df → busybox
Image efficiency score: 100 %                               -rwxrwxrwx         0:0        0 B  │   ├── dmesg → busybox
                                                            -rwxrwxrwx         0:0        0 B  │   ├── dnsdomainname →
Count   Total Space  Path

运行

基于刚才编译好的镜像运行一个容器:

$ docker run -it busybox:1 sh
/ # ls
bin      dev      etc      linuxrc  mnt      proc     sbin     sys      tmp      usr
/ #

其他

  • debian 基础镜像构建,可以参考:https://github.com/debuerreotype/docker-debian-artifacts
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数