Docker入門1）WSL2 Docker 導入手順

# WSL2上にDockerをインストールし、サンプルのDockerfileをビルドするまでの手順

## 前提条件
- WSL2がWindows上にセットアップされており、Ubuntuがインストールされていること
- 事前準備の参考にした記事：https://note.com/hiro20180901/n/nc798a07485e2
 
## Docker導入手順
1. **システムのアップデート**
   ```
   sudo apt update
   sudo apt upgrade
   ```
   
   <details> 
   
    - **目的:** システムのパッケージリストを更新し、インストールされているパッケージを最新版にアップグレードします
    - **構成要素:** 
        - **sudo:** スーパーユーザー権限でコマンドを実行します
        - **apt:** Ubuntuのパッケージ管理ツールです
        - **update:** パッケージリストの更新を行います
        - **upgrade:** 新しいパッケージのバージョンがある場合にアップグレードを行います
    </details>


2. **Dockerの前提パッケージのインストール**
   ```
   sudo apt install -y apt-transport-https ca-certificates gnupg-agent software-properties-common
   ```

    <details>
    
    - **目的:** Dockerを安全にインストールするために必要なパッケージをインストールします
    - **構成要素:**
        - **install:** 指定したパッケージをインストールします
        - **-y:** すべてのプロンプトに対して「yes」と自動で答え、手動での確認を省略します
        - **apt-transport-https:** HTTPS経由でリポジトリにアクセスするために必要です
        - **ca-certificates:** SSL/TLSのための証明書を管理するために必要です
        - **gnupg-agent:** GPGの鍵管理を助けるツールです
        - **software-properties-common:** ソフトウェアのリポジトリを追加・管理するツールです
    
    </details>

3. **DockerのGPGキーの取得とリポジトリの追加**
   ```
   curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
   sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
   ```
   
    <details>
    
    - **目的:** Dockerの公式GPGキーを取得して信頼できるソースからパッケージをインストールできるようにし、Dockerのリポジトリをシステムに追加します
    - **構成要素**
        - **curl:** URLからデータを転送するためのコマンドラインツールです
        - **-fsSL:** オプション群で、エラー時に無言で失敗し（-f）、サーバーの指示に従ってロケーションを変更し（-L）、進行状況やエラーメッセージを表示しない（-sS）設定です。
        - **apt-key add -:** ダウンロードしたGPGキーをAPTの信頼できるキーとして追加します
        - **add-apt-repository:** 新しいリポジトリをシステムに追加します
        - **$(lsb_release -cs):** 現在のUbuntuのバージョンコード名を出力します
    </details>

4. **Docker本体のインストールとdocker-composeのインストール**
   ```
   sudo apt install -y docker-ce docker-ce-cli containerd.io
   sudo apt install docker-compose
   ```
   
    <details>
    
    - **目的:** DockerエンジンとCLIツール、さらにdocker-composeをインストールします
    - **構成要素**
        - **docker-ce:** Dockerのコミュニティエディションをインストールします
        - **docker-ce-cli:** Dockerのコマンドラインインターフェイスツールをインストールします
        - **containerd.io:** Dockerコンテナのランタイムをインストールします
        - **docker-compose:** 複数のコンテナを定義し、実行するためのツールです
    </details>


5. **Dockerサービスの開始**
   ```
   sudo service docker start
   ```

6. **Docker動作確認**
    ```
    sudo docker run hello-world
    ```

    ::: details 実行結果（抜粋）
    以下のようなレスポンスが返ってくればOK
    ```
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    ```

7. **sudoなしでDockerコマンドを使用**
   ```
   sudo gpasswd -a $USER docker 
   logout
   ```

   <details>
   
    - **目的:** 毎回sudoをタイプするのは面倒なので、Dockerコマンドをsudoなしで利用可能にする。
    - **構成要素**
        - **sudo:** スーパーユーザー権限でコマンドを実行します。
        - **gpasswd:** グループのメンバーシップを管理するためのコマンドです。
        - **-a $USER docker:**　-a オプションはユーザーをグループに追加します。
            - $USERは現在のユーザー名
            - dockerはグループ名
        - **logout:** 現在のセッションを終了し、変更を有効にするために必要です。
    </details>      


8. **Docker動作確認(sudoなし)**
   ```
   ubuntu
   ```
   ```
   docker run hello-world
   ```
   sudoなしでも先ほどと同様のレスポンスが返ってくればOK

---
参考サイト
- https://kondeneenen.com/install_docker_to_wsl2_ubuntu/
- https://zenn.dev/itch/articles/4b432b73c36826

---
今後やりたいこと
- Dockerfile作成、ビルド、コンテナ実行といった一覧のプロセスを実施して概要を理解したい
- Linux使用経験がほとんどないので、コマンドやファイル操作など、基本的な操作方法を理解したい
- 最終的にはLangChainとOpenAIなどの大規模言語モデル（LLM）を組み合わせたアプリケーションを、DDocker環境で構築・デプロイしたい
    - LangChainやOpenAIはメジャーバージョンアップ時に互換性がなくなり、コードが動かなくなるかもしれないので、Dockerでバージョン指定して管理したい
    - LangChainとほかのライブラリとの間にバージョンの依存関係があるので（LangChain==0.xx.xxは、openai==0.xx.xxをサポートしているが、openai==1.xx.xxはサポート外）、依存関係で困らないようにDockerで環境構築できるようにしたい。