July 06, 2022

Distroless, Alpine, Slim - Ai là người tí hon ?

docker

Nhớ thời gian đầu khi mới học docker tôi chẳng quan tâm gì đến các loại base image cứ full official image mà sài, vừa an toàn vừa ổn định. Cho đến 1 ngày cái ổ cứng SSD 150GB của tôi nó bị full, check docker images thì ối dồi ôi ơi toàn image 1GB trở lên, mau mải docker container prunedocker image prune để chữa cháy tạm thời. Lên google search thì google bảo mày hãy sài alpine, đây là base image nhẹ nhất rồi. Đến hôm qua đi uống bia với thằng cu em nó giới thiệu distroless còn nhẹ hơn cả alpine ????

Trăm nghe không bằng một thấy, trăm thấy không bằng tự mình build image. Mình sẽ build một nodejs express app dựa trên 4 base image và so sánh size giữa các docker image xem ai là người ti hon (source code tại đây nhé):

Full official image

1
2
3
4
5
6
FROM node:18
ADD . /app
WORKDIR /app
RUN npm install --omit=dev
EXPOSE 3000
CMD ["index.js"]

Build normal-app image:

1
docker build -f Dockerfile -t normal-app .

Slim image

1
2
3
4
5
6
7
8
9
10
FROM node:18 AS build-env
ADD . /app
WORKDIR /app
RUN npm install --omit=dev

FROM node:18-buster-slim
COPY --from=build-env /app /app
WORKDIR /app
EXPOSE 3000
CMD ["index.js"]

Build slim-app image:

1
docker build -f Dockerfile.buster-slim -t slim-app .

Alpine image

1
2
3
4
5
6
7
8
9
10
FROM node:18 AS build-env
ADD . /app
WORKDIR /app
RUN npm install --omit=dev

FROM node:18-alpine
COPY --from=build-env /app /app
WORKDIR /app
EXPOSE 3000
CMD ["index.js"]

Build alpine-app image:

1
docker build -f Dockerfile.alpine -t alpine-app .

Distroless image

1
2
3
4
5
6
7
8
9
10
FROM node:18 AS build-env
ADD . /app
WORKDIR /app
RUN npm install --omit=dev

FROM gcr.io/distroless/nodejs:18
COPY --from=build-env /app /app
WORKDIR /app
EXPOSE 3000
CMD ["index.js"]
1
docker build -f Dockerfile.distroless -t distroless-app .

Ai là người tí hon ?

1
2
3
4
5
6
7
docker images *app
=>
REPOSITORY       TAG       IMAGE ID       CREATED       SIZE
distroless-app   latest    168a0525bf63   4 hours ago   169MB
alpine-app       latest    f8ec86502d70   4 hours ago   176MB
slim-app         latest    7a6d14a968c8   4 hours ago   238MB
normal-app       latest    0e5b38441fd0   4 hours ago   1GB

Òa ! Như lời đồn ! distroless-app dẫn đầu với chỉ 169MB, sau đó là alpine-app, slim-app, normal-app. Vì sao nhẹ vậy như được giới thiệu ở đây thì “Distroless” images chỉ bao gồm ứng dụng và runtime dependencies kèm theo, lược bỏ các gói quản lý, shell và một số service khác.

Chú ý !

Bài viết này chỉ mang tính chất so sánh vui vẻ chứ không đi sâu vào phân tích công nghệ của distroless hay của alpine.

Comments