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 prune
và docker 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