ただただ初心者がDocker Composeを使ってみるだけ

Dockerのコマンドを使ってコンテナを立てることもできるが、composeを使うことで
docker操作をコード化し、加えて複数のコンテナをまとめて管理することができるみたいなので、どんなものなのか使ってみた

# Docker Compseをインストール
いろんな記事を参考にしてインストールする
[公式github](https://github.com/docker/compose/releases)でバージョンの確認は忘れずに
```
# curl -L "https://github.com/docker/compose/releases/download/2.15.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

実行権限を与える
```
# chmod +x /usr/local/bin/docker-compose
```

インストールされたことを確認した
と思ったらcomposeが反応してない
```
[root@docker bin]# docker compose --version
Docker version 20.10.22, build 3a2c30b
```

`docker-compose`は古いバージョン(V1)
2023年4月以降は`docker compose`に変わるらしい(V2）
なのに`-`が無いと「そんなコマンド無いよ！」って言われてしまう状態
　　※V1とV2の詳細は[こちら](https://qiita.com/zembutsu/items/d82b2ae1a511ebd6a350)のQiita記事を参照

```
[opc@docker ~]$ docker compose version
docker: 'compose' is not a docker command.
See 'docker --help'

[opc@docker ~]$ docker-compose version
Docker Compose version v2.15.1
```

「cli-plugins」ディレクトリにdocker-compose実行ファイルを置くと良いみたい。
動作確認成功！
```
[root@docker cli-plugins]# pwd
/usr/libexec/docker/cli-plugins

[root@docker cli-plugins]# ll
合計 122308
-rwxr-xr-x 1 root root 29865304 12月 16 07:31 docker-app
-rwxr-xr-x 1 root root 51857264 12月 16 07:31 docker-buildx
-rwxr-xr-x 1 root root 43515904  1月 12 17:46 docker-compose

[root@docker cli-plugins]# docker compose version
Docker Compose version v2.15.1
```

# composeを試す
Dockerで実行していたことをyaml形式で書くことで管理することができる
コンテナ用ディレクトリを作成し「compose.yaml」という名前で管理することが良いらしい
ということで、`apache`ディレクトリの中にcompose.yamlファイルを作成して試してみる
```
/home/
└── opc
    ├── Dockerfile
    └── apache
        └── compose.yaml
```

## コンテナを立ち上げる
動作確認として、簡単にyaml形式で書いてみた。
下記コマンドを実行したと同義になるはず。
* docker pull nephken/world-is-mine-1
* docker run --name web-test -i -t -d -p 8083:80 nephken/world-is-mine-1
```
services:
  web:
    image: nephken/world-is-mine-1
    container_name: web-test
    ports:
      - "8083:80"
```

yamlファイルを格納したカレントディレクトリで実行
※`-d` バックグラウンドで実行
だけど、「Exited (0)」というエラーで起動されず。
```
[root@docker apache]# docker compose up -d
[+] Running 2/2
 ⠿ Network apache_default  Created   0.1s 
 ⠿ Container apache-web-1  Started 　0.6s

[opc@docker apache]$ docker ps -a
CONTAINER ID   IMAGE                     COMMAND   CREATED         STATUS                     PORTS     NAMES
618f2914f883   nephken/world-is-mine-1   "bash"    8 seconds ago   Exited (0) 7 seconds ago             web-test

```

### エラー調査
`docker run`で直接立ち上げると、なぜか起動する。
```
[opc@docker ~]$ docker run --name web-test -i -t -d -p 8083:80 nephken/world-is-mine-1
eb4772b1ff424058570de486a6eedfef6a9d22133983d3a1fd7a777c511b6b95
[opc@docker ~]$ docker ps 
CONTAINER ID   IMAGE                     COMMAND   CREATED         STATUS         PORTS                                   NAMES
eb4772b1ff42   nephken/world-is-mine-1   "bash"    5 seconds ago   Up 5 seconds   0.0.0.0:8080->80/tcp, :::8083->80/tcp   web-test
```

ログは何も出てこない。。
```
[opc@docker apache]$ docker compose logs
[opc@docker apache]$
```

削除の仕方が悪かったのかと思い、いろいろな削除を試したが
何も改善されない。。
```
### 停止済みのコンテナを強制的に削除
[opc@docker apache]$ docker compose rm --force

### イメージを構築しながらコンテナを作成して開始する
[opc@docker apache]$ docker compose up -d --build
[+] Running 2/2
 ⠿ Network apache_default  Created                                                                                                                                0.1s
 ⠿ Container web-test      Started                                                                                                                                0.4s

### コンテナのボリュームもあわせて削除
[opc@docker apache]$ docker compose down -v
[+] Running 2/0
 ⠿ Container web-test      Removed                                                                                                                                0.0s
 ⠿ Network apache_default  Removed 

```

### エラー調査の結果
結果、servicesに書くべき項目が少なかったことが原因でした。
　　※`tty: true`を加えることで、正常に起動を確認

`docker run`のときはオプションで`-t`を付けてたのに、`docker compose`で付けてなかったということ　　
　　※[こちらの記事](https://inamuu.com/docker-compose%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84/)を参考にしました。
　　※でも、imageを「httpd:2.4」に変えると動くんだよなぁ。。。不思議。。。
```
services:
  web:
    image: nephken/world-is-mine-1
    container_name: web-test
    ports:
      - "8083:80"
    tty: true
```
立ち上がったことを確認
止める場合は`docker compose stop`
立ち上げる場合は`docker compose start`
```
[opc@docker apache]$ docker compose ls
NAME                STATUS              CONFIG FILES
apache              running(1)          /home/opc/apache/compose.yaml
```


## 立てたコンテナを停止/削除する
`docker compose down`が一般的みたい。
コンテナ、コンテナ用に作られたネットワーク、ボリュームを一度に削除するコマンド
* これらを個別にやらずに済む
docker stop 【コンテナID】
docker rm　【コンテナID】
docker volume rm (docker volume prune)
docker network rm (docker volume prune)
docker rmi　【イメージID】


```
[opc@docker apache]$ docker compose ls
NAME                STATUS              CONFIG FILES
apache              running(1)          /home/opc/apache/compose.yaml

[opc@docker apache]$ docker compose down
[+] Running 2/2
 ⠿ Container web-test      Removed      10.2s
 ⠿ Network apache_default  Removed      0.1s
 
[opc@docker apache]$ docker compose ls
NAME                STATUS              CONFIG FILES
[opc@docker apache]$ 
```

#### よく使うオプション
`-rmi` 使用したイメージごと削除,`-rmi all`にすると全部
`-v` composeファイルで指定したボリュームごと削除（本記事の場合は意味ない）
`--remove-orphans` composeファイルで定義していないコンテナも削除（ちょっとよくわからない）


#### 備忘 rmとdownについて
* `docker compose rm`もあるけど、これはコンテナだけを削除するコマンド
コンテナに紐づくネットワークは削除されないし、コンテナが停止している必要がある　　
　　※`-s`オプションをつけることで起動中でも削除可能
 
### よく使うコマンドにおける名称指定の違い
他にもコマンドはあるけど、`cp`と`exec`で指定する名称が違うので気を付ける。
　　※参考にした本にはどっちも【コンテナ名】って書いてあって迷いました。

* `$ docker compose cp　<ファイル名> 【サービス名】:ディレクトリ`
ホスト⇄コンテナ間でファイルをやり取りする際に使用する
サービス名を指定する必要がある
　　※SERVICEに表示されている名称
　　※composeファイルのservicesで指定

* `$ docker compose exec 【コンテナ名】 　<コマンド>`  
ホスト上からコンテナ内でコマンドを実行するときに使用する
コンテナ名を指定する必要がある
　　※NAMEに表示されている名称
　　※composeファイルのcontainer_nameで指定
```
NAME                IMAGE                     COMMAND             SERVICE             CREATED             STATUS              PORTS
web-test            nephken/world-is-mine-1   "bash"              web                 9 minutes ago       Up 9 minutes        0.0.0.0:8083->80/tcp, :::8083->80/tcp
```

# まとめ
dockerコマンドでもコンテナを立ち上げて構築することはできるけど
composeファイルに書き込むことで
`docker compose up -d`だけで済むようになるというのがdocker composeの機能
（めちゃくちゃざっくり）

次は２つのコンテナを使ったサービスとか立ち上げて
ボリュームの永続化みたいなことをやってみたい