いまさらdockerを始めてみる④

# 前回まで
getting startedを終わり(一部スキップ)次はwhat is nextのpageから基礎を固めることに。dockerとimageの概要、起動、確認方法とかを学んだ

# what is Docker Compose
One best practice for containers that each container should do one thing and do it well. 
やはり一つのコンテナは一つのことに集中するのがいいらしい。

With Docker Compose, you can define all of your containers and their configurations in a single YAML file
YAMLファイルなるものを使うとcontainersをまとめることができますと。

try it out
dockersamples/todo-list-appをダウンロード。解答。中身はこんな感じ![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/caa8d4bd-0c3a-714e-3aa6-65ad7033094f.png)

yamlファイルの中身はこんな感じ![1.5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/3d21d3e5-8437-470d-0ae1-3f1866c951b5.png)
imageとそれに付随するコマンドを上から書いていく感じかな。volumesはよくわかんないけど

```docker compose up -d --buil```
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/84f89d7c-dc5e-ed41-5aae-077be9cb22ad.png)
怒られる。windowsにおけるdokcer daemonはdocker desktopが起動していること？

docker desktopを実行し、コマンドを再実行→成功。
GUI上でtodo-list-app-mainだけ色が変わっている
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/6b16f0fd-1e9c-60c3-0861-0d5e9b762599.png)

この一覧の流れで、二つのimageがdocker hubからダウンロードされる→ネットワークが構築される→databaseをpersistするためのvolumeが作られる→二つのコンテナが適切なコンフィグで起動される ということをしたらしい

ぶっ壊す(tear it down)
```docker compose down```
todo-list-app-mainそのものが消えた![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/09c63747-2800-9619-7e56-da0b349e9c91.png)
ただしvolumeは残っているらしい。volumeってなんだ？と進めばわかるか

# Understanding the image layers
container iamges are composed of layers
イメージはレイヤーで構成される。OSを構築するレイヤー。pythonをインストールするレイヤー。requirementsをinstallするレイヤーなど。こうすることで使いまわせるから便利だぞと。

tyr it out
create a base image
1. コンテナの作成＆起動　```docker run -name=base-container -ti ubuntu```
1. nodeのinstall　```apt update && apt install -y nodejs```
1. nodeの動作確認 ```node -e 'console.log("Hello world!")'```
1. ここまでの変更をlayerとして保存する ```docker container commit -m 'add node' base-container node-base```
dockerないよと怒られる![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/d4668b6c-7fd4-30c4-0784-0f85a0c0fec6.png)
コマンドプロンプトをもう一つ立ち上げて実行。成功![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/c2db98e4-9ed6-1cea-2836-8ffd6a536b6a.png)
1. nodeが入っていることを証明する ```docker run node-base node -e "console.log('hello world again')"```
1. base-containerを削除する ```docker rm -f base-container```
1. 最終形。なぜかnode-baseがふたつある![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/68f0b797-16dc-34c4-ebb7-de6071ede0a7.png)

build an app image
1. 作成したイメージをベースに新たなコンテナを定義？する ```docker run --name=app-container -ti node-base```
1. コンテナでアプリを作る ```echo 'console log("hello from an app")' > app.js```
1. 変更を新しいイメージとして保存する ```docker container commit -c "CMD node app.js" -m "Add app" app-container sample-app``` コンテナ起動時にapp.jsを実行する内容となっているらしい
1. 動作確認 ```docker run sample-app ```
1. docker desktopを確認。![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/2d14b167-ef6b-efa1-e1ff-4ef7f5367c4f.png)
imageがnode-baseのままなのがよくわかんない
1. 消す ```docker rm -f app-container``` 消してもsample-appは残っている。現状があまり理解できない
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/e3537994-7cec-cc54-c7fb-cc60a064f7ea.png)

とりあえず今日はここまで