Docker 学習3日目

Dockerの学習を始めて3日目。
まだ全体の流れがイメージできていない、メモのような内容です。
間違っているところがあるかもしれませんし、
読みづらい記事になっているかと思います。。。
理解が深まり次第、その都度、更新・訂正します！
(間違いのご指摘や、アドバイスいただければとても嬉しいです！)


# 《目的》
1. Dockerの理解
1. docker-composeの理解
1. コンテナオーケストレーションツール（AWS ECS）の理解

### 1-4 ビルドしてみる　続き
昨日は、アルパインLinuxをベースにして、
bushとGit、curlをインストールしたテストステージのDockerimage(名前：dockerimage2)を作成しました。
![スクリーンショット 2024-01-25 12.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/9b0611a7-8cb8-4bcb-c76f-f0d4e6b7c301.png)

使用コマンド
```Docker
#履歴を見る
docker history Dockerimageの名前
```
![スクリーンショット 2024-01-25 12.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/b6d7d744-fc89-0877-7d3f-5fdeee355391.png)
ここで、オレンジの線の部分に関して。アルパインLinuxのインストールに関するとこは、Dockerimage2もDockerimage1と同じ設定なので、新たにインストールせずにキャッシュを使っている。

### 1-5 Dockerimageを削除する
一旦ここもで作成してきたDockerimageを全て削除。
下記のように`myimage1` `myimage2` `myimage3`を作成する。
#### Dockerimageの削除
```Dockerfile
#Dockerimageの削除
docker rmi -f DockerimageのID
#現在保管されているDockerimageの一覧表示
docker images -q
#docker images -qで表示されたDockerimageを全部削除する
docker rmi -f `docker images -q`
```

### `myimage1` `myimage2`を作成する
![スクリーンショット 2024-01-25 16.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/84563fb6-0fd9-399b-33de-965761548ca5.png)

以下、Dockerfile9行目と10行めの解説(アプリケーションを動かすためのパッケージをインストールをしている）
```docker
#アルパインLinuxベースでインストール
RUN apk add --no-cache gcc python3-dev py3-pip libffi-dev musl-dev linux-headers mariadb-dev
#パイソンがパッケージを取り扱うためのファイルをアーカイブする機能
RUN pip3 install wheel -U
```

#### `myimage3`を作成する
![スクリーンショット 2024-01-25 16.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/3ca4b296-f501-6b32-19a6-f59aa8d4fa97.png)
```docker
#COPY コピー元　コピー先　今回の場合、requirementsの文字が入ってる/src配下の全てを、Docker imageの/build/にコピーする
COPY /src/requirements* /build/

#Linuxコマンドのcdと同じで、WORKDIR 作業場所指定
WORKDIR /build
```
現状を`docker images`コマンドで確認。myimage1〜3作成できている。
![スクリーンショット 2024-01-25 16.32.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/567fdd18-8018-7adc-d871-562aa3cddc07.png)


### 1-6 スナップショット的な機能
DockerimageのIDを指定すれば仮想マシンのスナップショットのようにその時点のDockerコンテナにログインできる。


使用コマンド
```docker
docker run -it DockerimageID /bin/bash
```
1. `myimage2`にログインしまだ`build`がないことを確認。
![スクリーンショット 2024-01-25 19.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/94211e00-082a-e8b0-2e02-a089bf508736.png)

1. `myimage3`にログインし`build`内にequirementsという文字列が含まれたファイルが2つあることを確認。
![スクリーンショット 2024-01-25 19.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/005bbe21-b78f-ba9d-8e1a-9ac127268387.png)

 まるで指定の時点のコンテナにSSH接続しているみたいに操作できる。`exit`コマンドで抜ける。

### 1-7 ビルド負荷軽減の工夫
同じ`COPY /src/以下省略`が出てきた。1回で済まさずになぜ2回に分けるのか？
![スクリーンショット 2024-01-25 22.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/4509be8c-d402-4156-c271-84ed4cd2368a.png)

myimage2でソースコードのコピーを一括で行ってしまうと、もしソースコードの改修があった場合、myimage2内にある、時間がかかるパッケージのインストールももう一度行わなければいけなくなり余分な時間がかかる。そのため、あまり**変更がなさそうなパッケージインストールだけでレイヤーを固めておく。** 今回のように、**頻繁に変更が行われそうなアプリケーションのソースコードなどは後ろに持ってくる。**
![スクリーンショット 2024-01-25 22.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/abbd21d8-9dc1-421c-6fdf-78d46bcb0292.png)
これは**ビルドにかかる時間をできるだけ短縮するための工夫**となる。

### 1-8 `CMD`と`RUN`の使い分け
(Dockerfile内で使用される命令や指示を "ディレクティブ" と呼びます。)
```docker
# Test entrypoint
CMD ["python3", "manage.py", "test", "--noinput", "--settings=todobackend.settings_test"].
```
CMD
1行のコマンドとして考える。あらゆる種類のプロンプトの入力を求める指示を表示しないというコマンド。

《Dockerfile》
↓Dockerfileを元に `docker build`でDockerimageを作成するが、その時に同時に行いたい処理、例えばパッケージインストールなどの処理は`RUN`で指定する。
↓
《Dockerimage》が出来る
↓Dockerimageを元に`docker run`でコンテナを起動させるが、その時に行いたい処理は、`CMD`で指定する。
↓
《Dockerコンテナ》起動

### 1-9 `docker run`コンテナ起動
```docker
docker run -it --rm dockerimageの名前
```
オプションの`--rm`は、コンテナが一度`exit`したら、その時点で起動したコンテナを削除する。
![スクリーンショット 2024-01-26 9.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/8072db85-14d0-745e-7c2a-8658a3c4cf53.png)
テスト完了。

### 1-10 テストステージ終了　まとめ
使用したコマンド
```docker
■コマンドメモ
sudo systemctl status docker.service

sudo systemctl start docker.service

docker build -t イメージの名前 .

docker images

docker history イメージの名前

docker build -t イメージの名前 .

docker inspect xxxxxx

docker rmi -f xxxxxx

docker images -q

docker rmi -f `docker images -q`

docker run -it イメージの名前 /bin/bash

docker run -it --rm イメージの名前
```