Docker イメージのpullからrunまで操作してみる

## はじめにイメージのpull
まずはubuntuの20.04を指定してダウンロード。
実行したのは以下コマンド。
```
$ docker image pull {イメージ名}
```

今回はイメージ名をubuntu、TAGは20.04で指定して実行しました。

```
$ docker image pull ubuntu:20.04
```

イメージのダウンロードが完了したら一応確認。
```
$ docker container ls

CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
b11d1690bdee   ubuntu:20.04   "/bin/bash"   4 minutes ago    Up 4 minutes                          charming_lalande

```
無事インストールできてますね。



## イメージのデフォルトコマンド確認

一度runコマンドでイメージからコンテナを新規作成しましょう。

```
$ docker run -it ubuntu:20.04

# 以下の入力待機状態になればOK
root@b11d1690bdee:/#
```

※使用しているターミナルはzshなのですが、本来ubuntuのデフォルトコマンドはbashです。そのため、execでコンテナ内の操作を行うのはbashになります。

ちなみにイメージのデフォルトコマンドはコマンドで確認出来ます。
```json
$ docker image inspect ubuntu:20.04

[
    {
        "Id": "sha256:3048ba0785953b689215053519eb1c34853e2e3af512eed001be59fec1f32e42",
        "RepoTags": [
            "ubuntu:20.04"
        ],
        "RepoDigests": [
            "ubuntu@sha256:80ef4a44043dec4490506e6cc4289eeda2d106a70148b74b5ae91ee670e9c35d"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2024-02-16T19:15:06.976721553Z",
        "Container": "4c09466e6436f94abdaca4c6b043aece8fa092607605a6ec1101ae8a76b232c5",
        "ContainerConfig": {
            "Hostname": "4c09466e6436",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:e42cca45a0f6cde8d8ee41b6120f1193421ecc3d60a9c61aa75848795baca6b9",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.opencontainers.image.ref.name": "ubuntu",
                "org.opencontainers.image.version": "20.04"
            }
        },
        "DockerVersion": "24.0.5",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:e42cca45a0f6cde8d8ee41b6120f1193421ecc3d60a9c61aa75848795baca6b9",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.opencontainers.image.ref.name": "ubuntu",
                "org.opencontainers.image.version": "20.04"
            }
        },
        "Architecture": "arm64",
        "Variant": "v8",
        "Os": "linux",
        "Size": 65653973,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/d728b002d6cc325a5edc10e0dfd014862c2d1cc02f5958d41898494a4146bf30/merged",
                "UpperDir": "/var/lib/docker/overlay2/d728b002d6cc325a5edc10e0dfd014862c2d1cc02f5958d41898494a4146bf30/diff",
                "WorkDir": "/var/lib/docker/overlay2/d728b002d6cc325a5edc10e0dfd014862c2d1cc02f5958d41898494a4146bf30/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:346e7b163cb7be905cf1201cbcbe474e96c1ceb2d102520cc15bf34ece763dbf"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]
```
上記のようにjson形式で出力してくれるので、色んなイメージで試してみるのも面白いかもしれません。
"Cmd"を確認すると、"/bin/bash"の記述がありますね。
Dockerコンテナ起動時に実行されるコマンドがここで指定されています。

```json
"Cmd": [
                "/bin/bash",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
```


### dockerコマンド　run と　execの違い


```
# イメージからコンテナを新規作成し、コマンドを実行する
docker container run
```
```
# 既存のコンテナでコマンドを実行する
docker container exec
```
### -itオプションについて
-itオプション・・・2種類のオプション「-i」「-t」を同時に実行したのと同じ。

-iオプション・・・ターミナルからコンテナへの標準入力をOpenにするため
（interactiveのi）

-tオプション・・・コマンドの実行結果を整列して表示させるため
(teletypewriterのt)

## bashでコンテナを軽く操作してみる

```bash
#lsコマンド

$ docker container run -it {IMAGE ID}
root@e6993d1144e9:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e6993d1144e9:/# touch hello.txt
root@e6993d1144e9:/# ls
bin  boot  dev  etc  hello.txt  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e6993d1144e9:/# echo "hello docker" > hello.txt
root@e6993d1144e9:/# cat hello.txt
hello docker
root@e6993d1144e9:/#
```

hello.txtファイル作成 ⇨ echoコマンドで"hello docker"という文字列を挿入。
⇨ catコマンドで確認

という至極単純な操作だけですが(^^;;


## 終わり
ここまで読んでいただきありがとうございました。
runとexecの違いなど初見時はこんがらがりやすいので注意していきたいところです。