Skip to content

Docker Build, Docker Images, and Reducing Size Like CRAZY!

Published: at 11:09 AM

Introduction

Seperti pada judul kita akan mencoba minimize file size dari docker images, yang paling berpengaruh dan krusial terdapat pada konfigurasi Dockerfile kita

Pastikan teman-teman sudah pernah menggunakan docker terlebih dulu dan pernah build image docker

Sebelum masuk ke implementasinya, ga seru kalau belum bahas cara kerjanya, mari kita cek gambar berikut

src: iximiuz.com

Setelah membaca artikel pada gambar tersebut, terdapat beberapa poin penting dalam pembuatan image dan container pada docker, seperti:

  1. Container sebenarnya bisa dibuat tanpa image (terletak pada saat proses build image)
  2. Minimal untuk membuat container hanya folder yang berisikan executed file
  3. Dasar dari docker image merupakan overlay filesystem

Overlay Filesystem

Setelah membaca referensi overlay filesystem pada artikel tersebut, terdapat cara membuat union (gabungan) dari beberapa direktori, dengan menggunakan mount overlay. Kita ambil contoh dari referensi artikel tersebut disini.

Disini kita coba untuk membuat directory dengan nama ‘overlay-example’ yang akan digunakan untuk melakukan overlay filesystem. Direktori akan berisikan folder layer 1 - 4, mount, dan workdir, dengan kegunaan berikut:

  • layer 1 - 3 : digunakan sebagai lowerdir
  • layer 4 : digunakan sebagai upperdir
  • workdir : sebagai workdir
  • mount : sebagai dir untuk mounting
> cd /latihan && mkdir overlay-example && cd overlay-example

/latihan/overlay-example
> mkdir mount layer-1 layer-2 layer-3 layer-4 workdir

/latihan/overlay-example
> ls
layer-1  layer-2  layer-3  layer-4 mount  workdir

Kita akan coba isikan layer 1-3 dengan file dump

/latihan/overlay-example
> echo "Layer-1 file" > ./layer-1/some-file-in-layer-1

/latihan/overlay-example
> echo "Layer-2 file" > ./layer-2/some-file-in-layer-2

/latihan/overlay-example
> echo "Layer-3 file" > ./layer-3/some-file-in-layer-3

Melakukan mounting

sudo mount -t overlay overlay-example \
-o lowerdir=/latihan/overlay-example/layer-1:/latihan/overlay-example/layer-2:/latihan/overlay-example/layer-3,upperdir=/latihan/overlay-example/layer-4,workdir=/latihan/overlay-example/workdir \
/latihan/overlay-example/mount

Mengecek isi dari dir mount, dan setelah di mount overlay isi dari lowerdir (layer 1-3) sudah ada pada dir mount

/latihan/overlay-example
> cd mount/

/latihan/overlay-example/mount
> ls -la
total 20
drwxr-xr-x 1 user domain^users 4096 Apr 19 16:07 .
drwxr-xr-x 8 user domain^users 4096 Apr 19 16:07 ..
-rw-r--r-- 1 user domain^users   13 Apr 19 16:03 some-file-in-layer-1
-rw-r--r-- 1 user domain^users   13 Apr 19 16:03 some-file-in-layer-2
-rw-r--r-- 1 user domain^users   13 Apr 19 16:03 some-file-in-layer-3

Mencoba menambahkan file pada dir mount

/latihan/overlay-example/mount
 > echo "new content" > new-file

/latihan/overlay-example/mount
> ls
new-file  some-file-in-layer-1  some-file-in-layer-2  some-file-in-layer-3

Saat menambahkan atau menghapus file maka pada upperdir akan ikut bertambah, jika kondisinya menghapus file, pada upperdir akan berisikan character file (whiteout) dan merepresentasikan filenya sudah di delete.

/latihan/overlay-example
> tree
.
├── layer-1
   └── some-file-in-layer-1
├── layer-2
   └── some-file-in-layer-2
├── layer-3
   └── some-file-in-layer-3
├── layer-4
   └── new-file
├── mount
   ├── new-file
   ├── some-file-in-layer-1
   ├── some-file-in-layer-2
   └── some-file-in-layer-3
└── workdir
    └── work [error opening dir]

7 directories, 8 files
/latihan/overlay-example/mount
> rm some-file-in-layer-2

/latihan/overlay-example/mount
> ls
new-file  some-file-in-layer-1  some-file-in-layer-3
/latihan/overlay-example
> tree
.
├── layer-1
   └── some-file-in-layer-1
├── layer-2
   └── some-file-in-layer-2
├── layer-3
   └── some-file-in-layer-3
├── layer-4
   ├── new-file
   └── some-file-in-layer-2
├── mount
   ├── new-file
   ├── some-file-in-layer-1
   └── some-file-in-layer-3
└── workdir
    └── work [error opening dir]

7 directories, 8 files
/latihan/overlay-example/layer-4
> ls -la4
total 12
drwxr-xr-x 2 user domain^users 4096 Apr 19 16:28 .
drwxr-xr-x 8 user domain^users 4096 Apr 19 16:07 ..
-rw-r--r-- 1 user domain^users   12 Apr 19 16:23 new-file
c--------- 1 root     root         0, 0 Apr 19 16:28 some-file-in-layer-2
/latihan/overlay-example
> sudo umount /latihan/overlay-example/mount && rm -rf /latihan/overlay-example

Kesimpulan

Saat melakukan mounting overlay, kuncinya terdapat pada upperdir, upperdir akan tetap bertambah atau berkurang meskipun menghapus atau menambahkan file pada dir mount.

How Docker Images Build?

Pada Dockerfile tiap baris akan dihitung satu layer(konsep yang sama dengan mount overlay) layer tersebut akan dimuat dalam bentuk tar file termasuk juga root filesystem dan metadatanya. Sebagai contoh

FROM ubuntu:22.04
RUN apt-get update && \ apt-get install -y helloworld && \ apt-get clean
ADD /app
COPY . .
CMD ["/app"]

Jika Dockerfile ini dijalankan dengan perintah docker build -t <nama-image> . maka saat proses building docker image sistem akan membuat 4 layer yang akan disimpan didalam imagenya, docker akan mengunduh image ubuntu 22.04 image tersebut dipecah untuk digabungkan dengan overlay filesystem.

Resizing Docker Images Naturally

Jadi terdapat beberapa acara agar ukuran image docker menjadi lebih hemat, antara lain

  1. Menggunakan image alpine-based atau slim
  2. Menerapkan multi stage build
  3. Menghemat line
  4. Membersihkan instalasi
  5. Gunakan .dockerignore

Mari kita langsung terapkan pada contoh berikut :

  1. Menggunakan image alpine-based atau slim
# menggunakan alpine-based image
FROM golang:1.23-alpine AS build
RUN apk --no-cache add gcc g++ make git
WORKDIR /go/src/app
COPY . .
RUN go mod init webserver
RUN go mod tidy
RUN G00S=linux go build -ldflags="-s -w" -o ./bin/web-app ./main.go

FROM alpine:3.21
RUN apk --no-cache add ca-certificates
WORKDIR /usr/bin
# menggunakan multi stage build
COPY --from=build /go/src/app/bin /go/bin
EXPOSE 8080
ENTRYPOINT /go/bin/web-app --port 8080

Resizing Docker Images Using Slim

Diakhir terdapat tools untuk membantu kalian lebih menghemat ukuran image docker yang dibuat yaitu dengan menggunakan slim, bagaimana cara slim bekerja, cara instalasi dan contoh singkat bisa langsung di cek disini

Contoh singkat kita akan coba lebih memperkecil ukuran image sebelumnya menggunakan slim docker-images

Kesimpulan

Baiklah, singkatnya konsep docker images itu seperti overlay file system, yaitu dengan menggabungkan beberapa folder didalamnya menjadi satu folder sentral yang sifatnya dependen dengan folder lainnya.

Referensi