Dockerの学習を始めて2日目。
まだ全体の流れがイメージできていない、メモのような内容です。
間違っているところがあるかもしれませんし、
読みづらい記事になっているかと思います。。。
理解が深まり次第、その都度、更新・訂正します!
(間違いのご指摘や、アドバイスいただければとても嬉しいです!)
《目的》
- Dockerの理解
- docker-composeの理解
- コンテナオーケストレーションツール(AWS ECS)の理解
1-3 マルチステージビルド
ステージとは大きな処理をキリのいいところで区切ったもの
例えば、下記のように分ける。
- テストステージではアプリをコンパイルし動作に異常がないチェック
- リリースステージでは動作チェック済みのアプリを本番ように作成する
このようなビルドの仕方をマルチステージビルドという。
1-4 ビルドしてみる
まずは下記の3行だけのDockerfileからDockerimage1
というDuckerimageを作成します。
使用コマンドの説明
FROM alpine:3.13.5 AS test
# test ベースイメージはアルパインLinux 3.13.5を使う,`AS`で今記述しているのはテストステージだよと定義
LABEL application=todobackend
# applicationというキーに対してtodobackendという値を設定、タグをつけてる。
RUN apk add --no-cache bash git
# RUN以降のコマンドを実行してください。apkはアルパインLinuxのパッケージ管理コマンド、addで追加。
# --no-cacheはパッケージを保存しないで=Dockerimageのサイズ削減のためにキャッシュは必要ない。
# bashはトラブルシューティングのために使う。gitはリリースステージ作成のためにインストールする
Dockerfileを読み込んで(ビルドして)Dockerimageを作成していく。
まず、cd Dockerfile
でDockerfile作成ディレクトリと同じ場所に移動する。
ビルドログの解説。
ここで理解すべき大切なことはDockerFileが1行1行指示通り読み込まれているか確認すること。
※初回読み込み時のビルドログをスクショし忘れてしまった為、初回と同じ設定を読み込ませているところはキャッシュしてくれています。Dockerが早い理由の1つはここ。
-
[internal] load build definition from Dockerfile
ーDockerfileのビルド定義を読み込んでいます。 - **[internal] load .dockerignore.dockerignore **
ーファイルを読み込んでいます。 -
[internal] load metadata for docker.io/library/alpine:3.13.5
ーDocker HubからAlpine Linuxの3.13.5イメージのメタデータを読み込んでいます。 -
[1/2] FROM docker.io/library/alpine:3.13.5@sha256:1d30d1ba3cb9096206
ーAlpine Linuxの3.13.5のイメージを取得しています。 -
CACHED [2/2] RUN apk add --no-cache bash git
ーキャッシュを使用して、Alpine Linuxイメージに bash と git をインストールしています。(以前に読み込んだものをキャッシュしてくれている。) -
exporting to image, naming to docker.io/library/myimage1
ー最終的なイメージを作成し、名前を myimage1 に付けています。
docker images
で作成したDockerimegeの参照をし、docker history 《Dockerimage名》
で履歴を見れる
下から古い順に履歴が表示される。
-
青枠
ーアルパインLinuxをベースイメジで使用していますよの表示 -
みどり枠
ーLABELコマンドを実行して、タグつけしたよの表示 -
赤枠
ーRUNから始まるコマンドを実行して、Dockeriamgeを作成したよの表示。この行為のIDはfdd51c4b69da
で作成したDockerimages1のIDと一致するはず。 -
オレンジ枠
ーRUNコマンド実行して15.2MB、アルパインLinuxをベースにして5.6MB、トータルでこのDockerimage1は20.8MBある
大切なのはDckerimageはレイヤーが重なってできている事。それらレイヤーを全てまとめてDckerimageになっていることを理解する。
下記の図のことを実際に行っていた。
(図ではDocker image2になっているが1だと思ってください)