Dockerを導入したPython開発環境の構築

## 1.1 経緯
　複数台のPCで作業するときに、効率的に環境を共有できるようにDockerを導入します。素人の学習備忘録であるため、不備がある場合はコメントしていただけますと幸いです。
 ※参考にした資料はページ下にまとめて記載しています

## 1.2 Dockerとは
 仮想化の実装方式はハイパーバイザー型（タイプ１ハイパーバイザー）・ホスト型（タイプ２ハイパーバイザー）・コンテナ型の３種類存在します。Dockerが属するコンテナ型は、他の２つ方式とは異なり、OS機能をホストOSが担うことでゲストOSが不要であるという特徴があります。これにより、使用するリソース（CPUやメモリ、ストレージなど）を軽減し、動作が軽くなります。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936853/eeb4160a-9e48-6a35-0168-fe0a98976cf6.png)
>https://it-infomation.com/virtualization-differences-hosted-hypervisor-container/

## 2.1 Dockerのインストール
　Windows PCにDockerをインストールする方法として、Windows上にDocker Desktop for Windowsをインストールする方法と、WSL Ubuntu上にDocker Community Edition (Docker-CE)をインストールする方法があるが、今回は個人利用かつ簡単のために前者を使用します。
 ※詳しくはこちらの動画を参照（https://www.youtube.com/watch?v=6kCZJLZBVpQ）

　Docker公式HPからインストーラをダウンロードし実行し、PCを再起動(close and restart)するとインストールは完了です。
 ※url: https://docs.docker.com/desktop/setup/install/windows-install/
 ※Windows11 Proの場合は、hyper-Vの代わりにWSL2を使用する、を選択

＜インストール後の流れ＞
 1. Docker Desktopの初回起動
 2. サブスクの同意画面に同意（agree）
 3. サインインや調査回答(skip可能)
 4. 設定の変更
     ・Generalの使用状況の送付(Send usage statistics)をオフ
     ・Notificationを好みに変更
     ・変更の適応（Apply & restart）

## 2.2 Dockerの動作確認（やらなくてもいい）
　Windows Powershellを開き以下の作業を行います。
・Docker バージョン確認
 ```php:入力
 docker -v
 ```
```php:出力
Docker version 27.3.1, build ce12230
```
・Docker Compose バージョン確認
 ```php:入力
docker compose version
 ```
```php:出力
Docker Compose version v2.29.7-desktop.1
```
・Docker buildx バージョン確認
 ```php:入力
docker buildx version
 ```
```php:出力
github.com/docker/buildx v0.17.1-desktop.1 1a2ee7e8d945b88fdc18f1948da491c2f540dec9
```
・hellow-world imageの実行
 ```php:入力
docker images
 ```
```php:出力
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
```
・Docker image listの表示
 ```php:入力
docker images
 ```
```php:出力
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   18 months ago   13.3kB
```
・Docker container（動作中）の確認
 ```php:入力
docker ps
 ```
```php:出力
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
・Docker container（停止）の確認
 ```php:入力
docker ps -a
 ```
```php:出力
CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                          PORTS     NAMES
880dd473f14f   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             nervous_curran
```
・Docker containerの削除
 ```php:入力
docker rm [container ID]
 ```
```php:出力
docker rm 880dd473f14f
docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
・Docker imageの削除
 ```php:入力
docker rmi [image ID]
 ```
```php:出力
docker rmi d2c94e258dcb
docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
```

## 3 仮想環境の構築
　Dockerで仮想環境を構築するためには、指示書（Dockerfile）をもとに設計図（Docker Image）を構築し、実行環境（Docker Container）を生成する必要があります。

## 3.1 事前準備
　VSCodeの拡張機能であるDockerとDev Containersをインストールします。


## 3.2 Dockerfileの作成
　Ubuntu22.04にPython3.12をインストールすることを目標としましたが、自分のスキルが足りず、自作のDockerfileではpython3.10しかインストールできませんでした。そこで、今回はDocker hubにあるpython3.12のイメージを使用しました。試行錯誤しましたが、結論としましては、Pythonのimageを利用するほうが楽でいいと思います。
```php:自作
FROM ubuntu:22.04
RUN set -x && \
        export DEBIAN_FRONTEND=noninteractive \
        && apt-get update && apt-get install -y --no-install-recommends \
        git \
        curl \
        vim \
        python3 \
        python3-pip \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*

# シンボリックリンクを作成して、python3.12をpythonとしても使えるようにする
RUN ln -s $(which python3) /usr/bin/python  

COPY requierments.txt .
RUN python -m pip install --upgrade pip && \
        python -m pip install -r requierments.txt

WORKDIR /home/var
```
```php:python imageの使用
FROM python:3.12.7-bookworm
```

## 3.3 Docker imageの構築 
```
docker build -t <image name> <Dockerfile's directory>
```
・-t <image name>：image名の指定

## 3.3 Docker Containerの生成
```
docker run -v ${PWD}:/home/src -it --rm --entrypoint /bin/bash <image name>
```
・-v ${PWD}:/home/src：ホストのディレクトリをコンテナにマウント
・-it：コンテナ自動終了の防止
・-d：バックグラウンドで起動
・-rm：終了後、コンテナを自動削除
・--entrypoint /bin/bash：コンテナ作成後、自動的に実行されるコマンドを"/bin/bash"(対話型シェルの起動)に変更

## 4 まとめ
　私がDockerを導入するまでに集めた基礎知識をまとめてみました。今後も新しい学びがあったら定期的に追加しようと思います。
 ※(現在) VSCodeのDevContainer機能を用いた環境構築に取り組み中

## 参考
https://qiita.com/Yuu_tsm/items/fe5bd33a49c6e8d9ae2a
https://www.dx-digital-business-sherpa.jp/blog/containerized-virtualization
https://it-infomation.com/virtualization-differences-hosted-hypervisor-container/
1. https://www.youtube.com/watch?v=6kCZJLZBVpQ
https://www.youtube.com/watch?v=6b7g8swdXCg