【Docker】入門：pythonが実行できるコンテナを起動（docker-compose使用）

# はじめに
UdemyでDockerの学習を進めている最中で、途中経過をアウトプットしたいと考えています。
今回は、

pythonが実行できるコンテナをdocker-composeを使って起動したいと思います。
また、ファイルシステムを共有して、pythonファイルやcsvデータをホストPCでも管理出来るようにします。

# 環境
- Windows10
- Docker version 24.0.6

# 各ファイル
以下の３つのファイルを同じフォルダ階層に作成します。
### Dockerfile
今回はpythonのベースイメージを使用し、requirements.txtから必要なライブラリをインストールします。
```Dockerfile:Dockerfile
FROM python:3

RUN apt-get update

WORKDIR /work
COPY requirements.txt ./
RUN pip install -r requirements.txt

CMD ["/bin/bash"]
```
### requirements.txt
とりあえずnumpyとpandasをインストール
```txt:requirements.txt
numpy
pandas
```
### docker-compose.yml
docker-compose.ymlは以下のときに使います。
- docker runコマンドが長くなるとき
- 複数のコンテナをまとめて起動するとき

構成は以下の通りです

---
- 今からDocker composeを書きます宣言
  - service1
      - service1のパラメータ
      - service2のパラメータ
  - service2
      - service2のパラメータ
      - service2のパラメータ
---
以下のdockerコマンドをdocker-compose.ymlに書きます。
```docker build .```
```docker run -it -v .:/work [イメージ] ```
```yml:docker-compose.yml
version: '3'

services:
  work-python:
    build: .
    volumes:
      - '.:/work'
    tty: true
    stdin_open: true
```
ファイルシステムの共有
```yml
volumes:
  - '.:/work'
```
```docker run -it ```の```-it```の部分がこれ↓
```
tty: true
stdin_open: true
```

### main.py

```python:main.py
import pandas as pd

df = pd.read_csv('train.csv')
print(df)
```
### train.csv


# Docker composeを使ってコンテナを起動
作業フォルダには以下のようになっています。
>root/
>	├Dockerfile
>	├requirements.txt
>	├docker-compose.yml
>	├train.csv
>	└main.py

rootディレクトリに移動し、```docker-compose up -d```を実行します。
今回はバックグラウンドで動かしておきたいため、デタッチドモード```-d```を引数に指定します。
```terminal
docker-compose up -d
```
```docker-compse exec [service] bash```でコンテナに入る
```terminal
docker-compose exec work-python bash
```
lsコマンドの結果でファイルシステムが共有されていることを確認できました。
```terminal
root@626584394f9f:/work# ls
Dockerfile  docker-compose.yml  main.py  requirements.txt  train.csv
```
main.pyを実行できることも確認します。
```terminal
root@626584394f9f:/work# python main.py
      id  Age  Gender  T_Bil  D_Bil    ALP  ALT_GPT  AST_GOT   TP  Alb  AG_ratio  disease
0      0   60    Male    2.9    1.3  170.9     42.1     37.1  5.5  2.9      1.01        1
1      1   28  Female    0.7    0.1  158.8     26.0     23.9  6.4  3.7      1.36        0
2      2   60    Male   23.1   12.5  962.0     53.0     40.9  6.8  3.3      0.96        1
3      3   20    Male    1.0    0.5  415.9     33.9     39.0  7.0  3.8      1.31        0
4      4   44  Female    0.6    0.3  152.9     40.9     42.0  4.5  2.1      1.04        0
..   ...  ...     ...    ...    ...    ...      ...      ...  ...  ...       ...      ...
886  886   31    Male    0.7    0.3  164.2     30.0     29.0  6.2  3.0      1.07        0
887  887   57  Female    1.0    0.3  130.1     23.9     25.0  6.9  4.1      1.28        1
888  888   54  Female   23.5   12.7  574.0     43.1     47.0  7.2  3.4      0.84        1
889  889   24    Male    1.2    0.4  130.0     23.2     42.0  8.1  3.9      0.87        1
890  890   57    Male    1.9    0.8  270.8     40.8     50.0  6.0  2.8      0.94        0

[891 rows x 12 columns]
```

### dockerコマンドとdocker-composeコマンド
| dockerコマンド | docker-composeコマンド |
| ------------ | ------------ |
| docker build [build context]  | docker-compose build  |
| docker run [image]  | docker-compose up  |
| docker ps  | docker-compose ps  |
| docker exec [container]  | docker-compose exec [service]  |

### 便利コマンド
buildしてrun
```terminal
docker-compose up --build
```
stopしてrm
```terminal
docker-compose down
```

---
これだけだとコマンドからしかpythonが実行できないのですが、pycharmやvscodeから実行出来るように出来るともっと便利です。