LoginSignup
2
0

More than 1 year has passed since last update.

【Docker】DockerfileからImageをbuildする時なにが起こっているのか? no.7

Last updated at Posted at 2021-06-01

パンプキン カフェ (2).png

こんにちは、まゆみです。

Dockerについての記事をシリーズで書いています

前回の記事ではDockerfile を一から作る方法の解説をさせていただきました。

下のイラストのように、まず、新しいディレクトリーを作り(Dockerfileが存在するディレクトリ―のことを、build context(ビルドコンテキスト)とも呼びます)その中に『Dockerfile』と呼ばれるものを作りました。

my_first_image (2).png

Dockerfileを書き上げた後、『docker build .』でDockerfile からDocker Image を作るというところまでは前回の記事で解説しました。

今回の記事では、

Dockerfile からImage を build する時に、水面下ではどのような事が起こっているのか

に焦点を置いて書いていこうと思います。

ではさっそく始めていきますね。

最新バージョンのDocker Desktopについて(オプション)

本題に入る前に少し、Docker Desktop の最新バージョンの特徴について書かせてください。

ほとんどの方は、Docker Desktop の最新バージョンを使われていると思います。

最新バージョンでは、デフォルトで『Buildkit』が有効になっています。

2021-06-01_9-23-22.png

このことによって、Docker Image がbuild している時、水面下でどのような事が起こっているのか見えにくくなっています。(下のスクショはデフォルトの『Buildkit:true』のまま実行した結果)

2021-06-01_9-24-39.png

ただbuildkitを『fault』に設定すると、同じ『docker build .』のコマンドでも結果は下のようになります

2021-06-01_9-58-22.png

もし、この記事と同じような実行結果にしたい方は

①Docker Desktop を開いて

②上のメニューバーの歯車のアイコンをクリックして

③『Docker Engine』と書いてあるところをクリックしてください。

2021-06-01_9-22-21.png

④JSONファイル
"buildkit": true

"buildkit": false

に変更してください。

2021-06-01_9-23-22.png

では、準備が整ったところでさっそく本題に入っていきましょう

docker build .をすると起こっていること

今回は、『redis-server』をContainer化してみましょう

今回は、build について詳しく書く記事なので、Dockerfileに書かれている一つづつのコードについての説明は割愛させていただきます

Dockerfile は下記のように書きました。

2021-06-01_10-17-13.png

まず、自分がdocker context(Dockerfileが存在するディレクトリー)内にいることを確かめてから、

docker build .

でDockerfile からDocker Image を作ります

すると、

step 1/3 :
step 2/3 :
step 3/3 : ....

と、ターミナルに表示された結果から、Dockerfileの一行づつを実行しているのが分かると思います

2021-06-01_10-19-54.png

上のスクショで ①と振られているところでは『FROM alpine』が実行されているところです。

初めてalpineを使う時は、あなたのパソコン内にまだalpineイメージはありませんから、Docker hub からそのイメージを引っ張ってくるところから始まります。

Pulling from library/alpine

はalpine を引っ張ってきていますよ。ということを示しています

注目は②と番号が振られているところです。

②は『RUN apk add --update redis』を実行しているわけですが、

Removing intermediate container xxxxxxx
(中間生成物であるContinerID xxxxxxxを削除しています)

と書かれ、step2プロセスの最初の段階で作られたのと同じContainer が、step2の終わりでは削除されているのです。

それはどういうことかというと

step 1 で引っ張ってきたalpineイメージに

step 2 でAlpine Packeage Manager がredis をインストールして実行したものが一時的なContainerとなる

1.png

step 2によって、Container は『一時的に』上のイラストのようになります。

上記のようなプロセスを踏むことによって、alpine イメージをベースにし、かつredis がインストールされたファイルシステムを持つ中間生成物であるContainer が出来上がるわけです。

同様にして、step 3では、step 2で作られた一時的なContainer に対して、Dockerfileの『CMD ["redis-server"]』が実行されます。

step ごとに一時的なイメージが作られることによって分かること

また、このように、Dockerfile のコードを一行実行するごとに一時的なContainer が作られることによって、例えばstep3でなにかエラーが起きた時も、step2までのイメージはできているわけですから、再度buildする時は、キャッシュを活用する事ができます。

もしくは、何か違うパッケージをさらに追加したい時も、すでにパッケージしているものはインストールされずに、既存の物を活用する事ができ、時間短縮につながります

初めてbuild する時以外は、下のスクショを見ていただくと分かるように、キャッシュが活用されています。

2021-06-01_11-11-06.png

最終的に出来上がるImage

以上のようなステップを踏んでDockerfile からDocker Image が出来上がります

最終的なDocker Image ID は下のスクショの赤線で囲まれた部分になります

2021-06-01_11-15-01.png

ちなみに、Buildkit:true のまま、最新バージョンのDucker Desktop を使われている方は、下のスクショの赤線で囲まれている部分が、最終的なDocker Image のIDになります

2021-06-01_11-16-51.png

まとめ

今回の記事はここら辺で締めくくらせていただきます。

お役に立てれば幸いです。<(_ _)>

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0