起動中のコンテナ情報をシェルスクリプトで取得する方法

# 動機

稼働中の複数のコンテナのコンテナ名などの情報をシェルスクリプトで取得したいということがあり検証しました。

# 環境

- Ubuntu 20.04
- Docker version 20.10.14
- Docker Compose version v2.4.1


# スクリプト

稼働中のコンテナごとにコンテナIDとコンテナ名を表示させます。

```bash:contanier-list.sh
#!/bin/bash
for contanier in `docker ps -q --format '{{.ID}},{{.Names}}'`; do

  # カンマ区切りをリスト化
  list=(${contanier//,/ })

  # リストの表示
  # echo ${list[@]}

  # コンテナIDと名前を取得
  contanier_id=${list[0]}
  contanier_name=${list[1]}

  echo ${contanier_id} ${contanier_name}

done
```

# テストコンテナの構築
適当にNginxコンテナを10台構築します。
```bash
#!/bin/bash
# 構築するコンテナの数
num=10
# 指定した数だけコンテナを構築
for i in `seq 1 ${num}`
do
contanier_name=nginx_${i}
docker run --name ${contanier_name} -d nginx
done
```
構築したコンテナを確認する。
```
docker ps -a
```

```
CONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS              PORTS                                   NAMES
b92f31fca31f   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_10
7e7d46aed8f5   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_9
54ae367b6c9c   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_8
d0881a7a8f5b   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_7
1ad4fe86c8e7   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_6
bccf446ebe9e   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_5
de1638f5ed11   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_4
e550e98095f7   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_3
1462f40996bf   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_2
d9659cce21fb   nginx                      "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp                                  nginx_1
```

# スクリプト実行

```
./contanier-list.sh
```

コンテナIDとコンテナ名を確認することができました。

```
b92f31fca31f nginx_10
7e7d46aed8f5 nginx_9
54ae367b6c9c nginx_8
d0881a7a8f5b nginx_7
1ad4fe86c8e7 nginx_6
bccf446ebe9e nginx_5
de1638f5ed11 nginx_4
e550e98095f7 nginx_3
1462f40996bf nginx_2
d9659cce21fb nginx_1
```

# 掃除

以下のスクリプトで先ほど構築したNginxコンテナを削除できます。`--filter` オプションでフィルターをかけてみました。

```bash:remove.sh
#!/bin/bash
for contanier in `docker ps -q --filter "name=nginx" --format '{{.ID}}'`; do

  # カンマ区切りをリスト化
  list=(${contanier//,/ })

  # リストの表示
  # echo ${list[@]}

  # コンテナIDと名前を取得
  contanier_id=${list[0]}
 
  docker stop ${contanier_id}
  docker rm ${contanier_id}

done
```

削除されているか確認します。

```
docker ps -a
```

削除できていますね。

```bash
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
# まとめ

稼働中の複数のコンテナの情報をシェルスクリプトで表示させることができました。
`docker ps`コマンドの`--format`オプションで色々な情報が取れるのでもう少し詳細な情報も確認することができます。