DockerとPythonで環境構築

## はじめに
今回はDockerを使ってPythonの環境を作っていきます。
以前現場でGo言語をDockerで使ったことがあるのですが、その時凄い便利だなと思ったので
今回はPythonの環境をDockerで作っていきます。

## 環境
```
macOS Ventura 13.0.1
Docker Desktop for Mac
Docker version 20.10.21
Docker Compose version v2.13.0
VS code
```

## ゴール
今回のゴールはdockerコンテナをbuildして"Hello World"を出力することです。

## 構成
ディレクトリ構成です。
```
.
├── Dockerfile
├── docker-compose.yml
├── .env
└── backend
    └── app.py
```

## Docker Desktopのインストール

ご自身の環境に合ったものをインストールして下さい。

https://www.docker.com/products/docker-desktop/

![スクリーンショット 2022-12-09 23.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741139/13c914a6-7df5-8aab-eed2-242a605465e2.png)

## 作業ディレクトリの作成
Dockerfileやdocker-compose.ymlを作成する作業ディレクトリを作成します。

```
mkdir docker_python && cd docker_python
```
次に作業ディレクトリでPythonのコードを配置するディレクトリを作成します。
今回はbackendという名前で作成します。
```
mkdir backend
```
これでディレクトリの準備は完了しましたのでコードを書いていきます。

## Dockerfileの作成
dockerコンテナをbuildするDockerfileを作成します。

```Dockerfile:Dockerfile
FROM python:3.9.10

RUN mkdir -p /root/backend
WORKDIR /root/backend

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
```

1行目でPythonのバージョンを指定しています。
WORKDIRはpythonのコードを置く作業場としてコンテナ上に/root/backendディレクトリを作成し、指定します。
これによって以降のRUNはWORKDIRで実行されます。

## 環境変数の設定
pythonのコードを配置するパスの環境変数を設定します。
 .envファイルを作成し、下記のコードを入力します。
```
BACKEND_PATH=./backend
```

.envファイルは特殊なファイルで、設定した環境変数はDockerfileや、これから作成するdocker-compose.ymlなどから参照することができます。
パスを環境変数として外出しにすることによって汎用性を持たせています。

## docker-compose.ymlの作成
docker-composeコマンドを使う時の設定ファイルです。

```yml:docker-compose.yml
version: '3.9'
services:
  python3:
    restart: always
    build: .
    container_name: 'python'
    working_dir: '/root/backend'
    tty: true
    volumes:
      - ${BACKEND_PATH}:/root/backend
```
* build
 buildでDockerfileの場所を指定しています。今回はカレントディレクトリを表しています。

* container_name
 container_name には任意のコンテナ名を指定してください。
後ほど使用するコンテナ実行コマンド docker -exec -it {コンテナ名} のコンテナ名となります。

* working_dir
 working_dirはDockerfileのWORKDIRと同じ階層を指定します。コンテナ内のコマンドを実行した時のデフォルト階層になります。

* volumes
 volumesにはローカルのbackendディレクトリを/root/backendにマウントする記述を書いています。マウントするとローカルのbackend配下のファイルがコンテナから参照されるようになります。

## コンテナをビルドします
コンテナをビルドする時は下記のコマンドです。
```
docker-compose build
```

```terminal
docker_python % docker-compose build
[+] Building 7.4s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                        0.0s
 => => transferring dockerfile: 32B                                                                         0.0s
 => [internal] load .dockerignore                                                                           0.0s
 => => transferring context: 2B                                                                             0.0s
 => [internal] load metadata for docker.io/library/python:3.9.10                                            7.2s
 => [auth] library/python:pull token for registry-1.docker.io                                               0.0s
 => [1/5] FROM docker.io/library/python:3.9.10@sha256:3aae21920963df3205fba69826cc07fcf2fad91f9e062add9217  0.0s
 => CACHED [2/5] RUN mkdir -p /root/backend                                                                 0.0s
 => CACHED [3/5] WORKDIR /root/backend                                                                      0.0s
 => CACHED [4/5] RUN pip install --upgrade pip                                                              0.0s
 => CACHED [5/5] RUN pip install --upgrade setuptools                                                       0.0s
 => exporting to image                                                                                      0.0s
 => => exporting layers                                                                                     0.0s
 => => writing image sha256:f7bcfd7c1350206351a0fa429539f2b8a50dc5464e89f35b1bed222d46e06d1b                0.0s
 => => naming to docker.io/library/docker_python-python3                                                    0.0s
```
上記のようなログが出力されれば、docker-compose build 完了です。

## コンテナの起動
コンテナの起動は下記コマンドです。

```
docker-compose up -d
```

docker-compose upでコンテナを起動します。
後ろの-dオプションはバックグラウンドで起動するという意味です。

```terminal
docker_python % docker-compose up -d
[+] Running 2/2
 ⠿ Network docker_python_default  Created                                                                   0.1s
 ⠿ Container python3              Started                                                                   0.4s
```

## Pythonの実行
コンテナでpythonのプログラムを実行しましょう。
backendディレクトリにapp.pyというファイルを作成します。
今回は"Hello World"と出力します。

```python:app.py
print("Hello World")
```

下記コマンドでプログラムを実行します。
```terminal
docker exec -it python3 python app.py
```
実行結果がこちら
```terminal
docker_python % docker exec -it python3 python app.py
Hello World
```
"Hello World"と出力されていますね。

## コンテナの終了
下記のコマンドでコンテナを終了します。
```
docker-compose down
```

## 最後に
今回はDockerでPythonの環境構築を行いました。
AWS Lambdaでdockerコンテナが利用できるので、ローカルのコンテナをそのままAWS Lambdaにのせれますし使いこなせた方がいいかなって個人的に思っています。
今後はフロント部分の追加もしながら、DockerとPythonを使ってCRUDアプリだったり色々機能を増やしていきたいと思います。