CentOS7 Dockerコマンドの検証してみた

# はじめに
Dockerコマンドの復習のため、記事にまとめてみました。

## 前提条件
VirtualBoxを使用
ゲストOS CentOS7で検証しました。

# 実行したコマンド

以下のURLを参考しました。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/docker/

## docker images

最近生成したイメージの一覧
以下は実行例です
```
[root@localhost overlay2]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED        SIZE
debian               latest    291bf168077c   2 weeks ago    124MB
jasonrivers/nagios   latest    0c33dd4f2c3e   3 months ago   794MB
```
Dockerのイメージの格納場所を調べました。
以下のQiita記事が参考になりました。
https://qiita.com/tifa2chan/items/b9607d80fb58476e4ef5

以下は実行例です
コンテナ(debian)とコンテナ(jasonrivers/nagios)のイメージ情報が記載されています。
```
[root@localhost overlay2]# cat /var/lib/docker/image/overlay2/repositories.json | python -mjson.tool
{
    "Repositories": {
        "debian": {
            "debian:latest": "sha256:291bf168077c554abde831d52178c76aa8d7dad0e55a2e37a68c2b55a5d92e64",
            "debian@sha256:a288aa7ad0e4d443e86843972c25a02f99e9ad6ee589dd764895b2c3f5a8340b": "sha256:291bf168077c554abde831d52178c76aa8d7dad0e55a2e37a68c2b55a5d92e64"
        },
        "jasonrivers/nagios": {
            "jasonrivers/nagios:latest": "sha256:0c33dd4f2c3e98dceada3974cffb2333c4fe4c5a6d53742f7aa1078e3451a7eb",
            "jasonrivers/nagios@sha256:d7696a34ac0508268ddd104a9ddc102c198c9ce567531ad6e876e9572c0a64fb": "sha256:0c33dd4f2c3e98dceada3974cffb2333c4fe4c5a6d53742f7aa1078e3451a7eb"
        }
    }
}
```
## docker ps
以下のURLを参考しました。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/ps/

実行中のコンテナを表示
以下は例です。実行中のコンテナがないため、表示されていません。
```
[root@localhost overlay2]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost overlay2]#
```

コンテナが停止中も含めてコンテナーすべてを表示します

 コンテナ名(debian)はExited 5days agoになっているため、5日前にコンテナを停止しています。
```
[root@localhost overlay2]# docker ps -a
CONTAINER ID   IMAGE                       COMMAND                  CREATED        STATUS                    PORTS                            NAMES
c10cd2800f5a   debian                      "bash"                   5 days ago     Exited (0) 5 days ago                                      debian
fb470a7a23a7   jasonrivers/nagios:latest   "/usr/local/bin/star…"   2 months ago   Exited (255) 4 days ago   5667/tcp, 0.0.0.0:8888->80/tcp   nagios4
```
## docker start
以下のURLを参考しました。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/start/

jasonrivers/nagios:latestの様なコンテナの名前の場合は、このまま実行するとエラーになります。
```
docker start　＜コンテナ名＞

[root@localhost overlay2]# docker start jasonrivers/nagios:latest
Error response from daemon: No such container: jasonrivers/nagios:latest
Error: failed to start containers: jasonrivers/nagios:latest
```

上記の場合は、コンテナIDを指定してコンテナを起動します
```
[root@localhost overlay2]# docker start fb470a7a23a7
fb470a7a23a7
[root@localhost overlay2]#
```

コンテナ名を指定してコンテナを起動した例です。
```
[root@localhost overlay2]# docker start debian
debian
[root@localhost overlay2]#
```

コンテナが2台起動しました。
```
[root@localhost overlay2]# docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED        STATUS          PORTS                            NAMES
c10cd2800f5a   debian                      "bash"                   5 days ago     Up 42 seconds                                    debian
fb470a7a23a7   jasonrivers/nagios:latest   "/usr/local/bin/star…"   2 months ago   Up 6 seconds    5667/tcp, 0.0.0.0:8888->80/tcp   nagios4
[root@localhost overlay2]#
```
## docker attach

「docker attach を使えば、ターミナルの標準入力、標準出力、標準エラー出力（あるいはその組み合わせ）を実行中のコンテナーにアタッチすることができます。」と記載されていますが、
コンテナ内のシェルの中に入っている様に見えます。

参考にしたサイト
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/attach/


Docker attach と execの違いが参考になりました。
「どちらも稼働中コンテナへ接続するコマンドである。」だそうです。
https://qiita.com/leomaro7/items/649732faf2f632419f11

コンテナ「debian」へ接続しました。
```
[root@localhost overlay2]# docker attach  c10cd2800f5a
root@c10cd2800f5a:/#
root@c10cd2800f5a:/# cat /etc/debian_version
11.5
root@c10cd2800f5a:/#
```

**注意点**
コンテナを接続中にexitを実行するとコンテナが停止してしまいます。
本番環境では気を付けたい操作です。!!
https://www.tohoho-web.com/docker/docker_exec.html
```
コンテナ「debian」が一つ実行中
[root@localhost overlay2]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED      STATUS          PORTS     NAMES
c10cd2800f5a   debian    "bash"    5 days ago   Up 23 seconds             debian

コンテナ「debian」へ接続する
[root@localhost overlay2]# docker attach  c10cd2800f5a
root@c10cd2800f5a:/#
root@c10cd2800f5a:/# cat /etc/debian_version
11.5
root@c10cd2800f5a:/# exit
exit

コンテナ「debian」が停止したため、何も表示されていません
[root@localhost overlay2]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost overlay2]#
```

### docker execコマンド
Docker attach同じで指定したコンテナへ接続するコマンドです。
docker execは以下で検証した結果、コンテナに接続後exitコマンドを実行しても
コンテナ自体は停止しないため、安全です。

個人的には「docker exec」の利用をお勧めします。

```
docker exec -it <コンテナID指定> /bin/bash

コンテナ「debian」が一つ実行中
[root@localhost overlay2]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED      STATUS         PORTS     NAMES
c10cd2800f5a   debian    "bash"    5 days ago   Up 2 minutes             debian

コンテナ「debian」へ接続する
[root@localhost overlay2]# docker exec -it c10cd2800f5a /bin/bash
root@c10cd2800f5a:/#
root@c10cd2800f5a:/# exit
exit

コンテナ「debian」が一つ実行中
[root@localhost overlay2]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED      STATUS         PORTS     NAMES
c10cd2800f5a   debian    "bash"    5 days ago   Up 2 minutes             debian
```

## docker run
「docker runはコンテナを起動状態で作成します。」そうです。
以下のサイトが参考になりました。
https://www.tohoho-web.com/docker/docker_run.html

以下はnginxのイメージから
ローカルホストがアクセスするときに使用するポート番号(8080)とコンテナ内では80ポートを指定して、コンテナを起動状態にして作成しています。
```
[root@localhost overlay2]# docker run --name nginx -d -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
3f4ca61aafcd: Pull complete
50c68654b16f: Pull complete
3ed295c083ec: Pull complete
40b838968eea: Pull complete
88d3ab68332d: Pull complete
5f63362a3fa3: Pull complete
Digest: sha256:0047b729188a15da49380d9506d65959cce6d40291ccfb4e039f5dc7efd33286
Status: Downloaded newer image for nginx:latest
e820c2036ef0a12e62fe1c5823af802722066f9d6e81d427ad92a1cbed80306e
[root@localhost overlay2]#


#作成したnginxのコンテナが起動しました
[root@localhost overlay2]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
e820c2036ef0   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 6 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx
c10cd2800f5a   debian    "bash"                   5 days ago      Up 8 minutes                                           debian
```
ローカルな端末からブラウザで8080ポートを指定してnginxにアクセス出来ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/881d8aee-7945-2c99-908b-67d6523bbcd3.png)


# まとめ
コンテナのコマンドの動作は事前に検証して知っていた方が良いです。
コンテナへ接続コマンドではexitすると、コンテナ自体が停止するものもあるため、注意が必要です。

本記事に一通り必要なコンテナコマンドを記載しました。