[小ネタ] コンテナにしたチャットアプリのDockerイメージ軽量化
こんにちは!コンサル部のinomaso(@inomasosan)です。
今回は前回コンテナにしたチャットアプリのDockerイメージを軽量化していきます。
軽量化前のチャットアプリのイメージサイズ
node:16.14
を元にDockerイメージを作成したのですが、イメージのサイズが914MBもありました。
% docker images REPOSITORY TAG IMAGE ID CREATED SIZE socket-chat-example 0.0.1 75bf138a922a 12 days ago 914MB
原因はなんなのか?
Dockerfile
前回作成したDockerfileから、もう一度確認していきます。
FROM node:16.14 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD [ "node", "index.js" ]
RUN
コマンドは一つで、npm install
もpackage.json
の依存関係にあるパッケージしかインストールしていないので、こちらが原因ではなさそうです。
ベースのイメージサイズ
そもそもベースのイメージサイズがどれくらいだっけと確認したところ、なんと906MBありました。。。
% docker pull node:16.14 16.14: Pulling from library/node a024302f8a01: Already exists 289773030fdc: Already exists 81bb8b3399fe: Already exists 9c63da771697: Already exists bcf1b23b1e4b: Already exists 53a5e10666cb: Already exists c9872a0dc1d7: Already exists e8b67599ff06: Already exists dd019e527248: Already exists Digest: sha256:fd86131ddf8e0faa8ba7a3e49b6bf571745946e663e4065f3bff0a07204c1dde Status: Downloaded newer image for node:16.14 docker.io/library/node:16.14 % docker images node REPOSITORY TAG IMAGE ID CREATED SIZE node 16.14 1e151315aa91 2 weeks ago 906MB
というわけで、もっと軽量なベースイメージを探す必要があるとわかりました。
別のベースイメージを探す
DockerHubのnodeを確認していくと、デフォルトイメージ以外だとnode:-alpineかnode:-slimがありました。
ただ、alpineに以下の説明があり、libcの要件や前提条件によっては、ソフトウェアで問題が発生するとのことでした。
The main caveat to note is that it does use musl libc instead of glibc and friends, so software will often run into issues depending on the depth of their libc requirements/assumptions.
一方、slimに以下の説明がありましたが、動作の不具合が発生するような記述がなかったのでこちらを使用してみます。
This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run node. Unless you are working in an environment where only the node image will be deployed and you have space constraints, we highly recommend using the default image of this repository.
slimでDockerイメージ作成
まずはnode:16.14-slim
のサイズを確認していくと175MBと大分小さくなりました!
% docker pull node:16.14-slim 16.14-slim: Pulling from library/node 6552179c3509: Pull complete d4debff14640: Pull complete 3602b62b4939: Pull complete 2e9deffe3445: Pull complete 3dcfed3bb34d: Pull complete Digest: sha256:64dc41bcf5e9048aa1b9a6efe3af68631720e6b76e98f281a77d305e898d3610 Status: Downloaded newer image for node:16.14-slim docker.io/library/node:16.14-slim % docker images node:16.14-slim REPOSITORY TAG IMAGE ID CREATED SIZE node 16.14-slim cecb3f1a7417 2 weeks ago 175MB
DockerfileのFROM
のベースイメージを修正します。
FROM node:16.14-slim WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD [ "node", "index.js" ]
さっそくイメージを作成していきます。 イメージ名のタグは0.0.2に修正しました。
% docker build -t socket-chat-example:0.0.2 .
最終的なイメージのサイズを確認したところ183MBと大分小さくなりました!!
% docker images socket-chat-example:0.0.2 REPOSITORY TAG IMAGE ID CREATED SIZE socket-chat-example 0.0.2 caf3208f422b 2 minutes ago 183MB
動作確認
試しにローカル環境で、作成したDockerイメージからコンテナ起動していきます。
% docker run -p 3000:3000 -d socket-chat-example:0.0.2
前回と同様に、ブラウザのURLにhttp://localhost:3000
入力し、チャットアプリが正常に動作することを確認できました!
参考URL
まとめ
DockerfileのFROM
を修正するだけで、Dockerイメージを軽量化することができました。
この記事が、どなたかのお役に立てば幸いです。それでは!