Docker の実験（その１３：イメージの移設・ビルド（レイヤ）キャッシュ）

[その１２：イメージのクリーンアップ・検索](https://qiita.com/intrajp/items/9fc1565e723a31fd3cbc)のつづき。

ファイルに落として、それを移設、それを取り込む方法。
save サブコマンド、load サブコマンドが使える。

Dockerfile を作成する。

```bash
$ mkdir demo_save_load
$ cd demo_save_load
$ vim Dockerfile
FROM busybox
RUN touch test.txt
CMD ["/bin/sh"]
```

イメージをビルドする。

```bash
$ docker build -t testapp .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
latest: Pulling from library/busybox
205dae5015e7: Pull complete
Digest: sha256:7b3ccabffc97de872a30dfd234fd972a66d247c8cfc69b0550f276481852627c
Status: Downloaded newer image for busybox:latest
 ---> 66ba00ad3de8
Step 2/3 : RUN touch test.txt
 ---> Running in e6bb2e057e51
Removing intermediate container e6bb2e057e51
 ---> 12a57073a54f
Step 3/3 : CMD ["/bin/sh"]
 ---> Running in d1ffd528eccd
Removing intermediate container d1ffd528eccd
 ---> 6a2179d8bb73
Successfully built 6a2179d8bb73
Successfully tagged testapp:latest
```

イメージが作成されたか確認する。

```bash
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
testapp      latest    6a2179d8bb73   About a minute ago   4.87MB
my_ubuntu    latest    cf29e08b3975   3 hours ago          77.8MB
<none>       <none>    5e443cc82858   39 hours ago         175MB
<none>       <none>    ede4075dc036   40 hours ago         175MB
nginx        latest    3f8a00f137a0   10 days ago          142MB
mysql        latest    57da161f45ac   11 days ago          517MB
ubuntu       latest    58db3edaf2be   3 weeks ago          77.8MB
busybox      latest    66ba00ad3de8   6 weeks ago          4.87MB
```

作成したイメージをファイルに書き出す。

```bash
$ docker save testapp > testapp.tar
$ ls -l testapp.tar
-rw-r--r-- 1 xxx xxx 5110784 Feb 19 22:32 testapp.tar
```

vm インスタンスから exit して、project にもどり（cloud shell にもどり）、scp コマンドで、vm インスタンスからデータをコピーする。

```bash
$ gcloud compute scp --project <project-id> --zone asia-northeast1-b docker-test:/home/<username>/demo_save_load/testapp.tar .
```

Cloud Storage にアップロードする。

```bash
$ gsutil cp testapp.tar gs://<storage name>
Copying gs://<storage name>/testapp.tar...
- [1 files][  4.9 MiB/  4.9 MiB]                                                
Operation completed over 1 objects/4.9 MiB.
```

これを、手元の Docker がインストールされているマシンにダウンロードする。
testapp.tar を移設する。移設先（ホストマシン）での作業。

```bash
$ docker load < testapp.tar
$ docker load < testapp.tar
b64792c17e4a: Loading layer [==================================================>]  5.096MB/5.096MB
90b9248c90cc: Loading layer [==================================================>]  1.536kB/1.536kB
Loaded image: testapp:latest
```

イメージが出来たか確認する。
移設先（ホストマシン）での作業。

```bash
$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
testapp           latest    6a2179d8bb73   16 minutes ago   4.87MB
nginx             latest    3f8a00f137a0   10 days ago      142MB
bitnami/mariadb   10.6      b71bec10debb   2 months ago     339MB
bitnami/moodle    4         e1dfb360afb8   2 months ago     618MB
```

Google Cloud の Container Optimized-os 上で作成したイメージを、ホストマシンに移設することができた。

ビルドキャッシュ
以下、vm の Docker マシンにもどる。

```bash
$ mkdir demo_buildcache
$ cd demo_buildcache
$ vim Dockerfile
FROM python:3.7-slim-buster
COPY . .
RUN pip install --quiet -r requirements.txt
ENTRYPOINT ["python", "server.py"]
```

```bash
$ vim requirements.txt
certifi==2022.12.07
chardet==3.0.4
Click==7.0
cycler==0.10.0
decorator==4.3.0
defusedxml==0.5.0
```

スクラッチからビルド

```bash
$ docker build -t without-cache .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM python:3.7-slim-buster
3.7-slim-buster: Pulling from library/python
29cd48154c03: Pull complete
2c59e55cfd71: Pull complete
6238b0f1f415: Pull complete
4f0b0ef0a468: Pull complete
b62a1b99a09f: Pull complete
Digest: sha256:1a88815950a79b39c3b9e8e8d310cbc7d52fe0bf77505a2765f43d7e397f70b3
Status: Downloaded newer image for python:3.7-slim-buster
 ---> 13b871171c6e
Step 2/4 : COPY . .
 ---> e7b5ebfc3742
Step 3/4 : RUN pip install --quiet -r requirements.txt
 ---> Running in 88164192d9d6
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 22.0.4; however, version 23.0.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Removing intermediate container 88164192d9d6
 ---> b72c2e698fe2
Step 4/4 : ENTRYPOINT ["python", "server.py"]
 ---> Running in c104ab157c97
Removing intermediate container c104ab157c97
 ---> 544b0330e592
Successfully built 544b0330e592
Successfully tagged without-cache:latest
```

ビルドできたか確認する。

```bash
$ docker images
REPOSITORY      TAG               IMAGE ID       CREATED              SIZE
without-cache   latest            544b0330e592   About a minute ago   124MB
testapp         latest            6a2179d8bb73   29 minutes ago       4.87MB
my_ubuntu       latest            cf29e08b3975   3 hours ago          77.8MB
<none>          <none>            5e443cc82858   40 hours ago         175MB
<none>          <none>            ede4075dc036   40 hours ago         175MB
python          3.7-slim-buster   13b871171c6e   10 days ago          115MB
nginx           latest            3f8a00f137a0   10 days ago          142MB
mysql           latest            57da161f45ac   11 days ago          517MB
ubuntu          latest            58db3edaf2be   3 weeks ago          77.8MB
busybox         latest            66ba00ad3de8   6 weeks ago          4.87MB
```

ビルドキャッシュを活用してイメージを作成する。

```bash
$ docker build -t wit-cache .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM python:3.7-slim-buster
 ---> 13b871171c6e
Step 2/4 : COPY . .
 ---> Using cache
 ---> e7b5ebfc3742
Step 3/4 : RUN pip install --quiet -r requirements.txt
 ---> Using cache
 ---> b72c2e698fe2
Step 4/4 : ENTRYPOINT ["python", "server.py"]
 ---> Using cache
 ---> 544b0330e592
Successfully built 544b0330e592
Successfully tagged wit-cache:latest
```

ビルドのスピードが速かった。

```bash
$ docker images
REPOSITORY      TAG               IMAGE ID       CREATED          SIZE
wit-cache       latest            544b0330e592   2 minutes ago    124MB
without-cache   latest            544b0330e592   2 minutes ago    124MB
testapp         latest            6a2179d8bb73   30 minutes ago   4.87MB
my_ubuntu       latest            cf29e08b3975   3 hours ago      77.8MB
<none>          <none>            5e443cc82858   40 hours ago     175MB
<none>          <none>            ede4075dc036   40 hours ago     175MB
python          3.7-slim-buster   13b871171c6e   10 days ago      115MB
nginx           latest            3f8a00f137a0   10 days ago      142MB
mysql           latest            57da161f45ac   11 days ago      517MB
ubuntu          latest            58db3edaf2be   3 weeks ago      77.8MB
busybox         latest            66ba00ad3de8   6 weeks ago      4.87MB
```

with-cache のつもりが、typo してしまった。。

[その１４：ネットワークの概要](https://qiita.com/intrajp/items/7f4ef9ae4b8c369d5400)につづく。