Windows11 で Docker をインストールして MySQL実行（WSL2・Ubuntu・Docker・MySQL）

Windows11 で Docker をインストールして MySQL 実行してみる
手順を大雑把に書くと以下の感じで進める

1. PowerShell 7 インストール ※Windows PowerShell じゃない、次の処理でエラーでた...
1. WSL2 インストール(Ubuntu v22.04 インストール)
1. Docker インストール
1. MySQL の Docker Compose 作成・実行・停止


# PowerShell 7 インストール

基本的には以下の公式サイトを参考にインストール
https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3

1. Windows PowerShell を管理者で実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/942eb7fd-995a-24e2-a821-82a380a9393e.png)

1. インストールバージョン確認 (今回は 7.3.0.0 で実施してます)
    ```PowerShell:PowerShell
    winget search Microsoft.PowerShell
    ```
1. インストール実行
    ```PowerShell:PowerShell
    winget install --id Microsoft.Powershell --source winget
    ```
1. 念のため再起動

# WSL2 インストール(Ubuntu v22.04インストール)

PowerShell でコマンド一つで終了！！
インストール後に再起動して Ubuntu の初期設定をする
参考としてMSの公式サイト： [WSL を使用して Windows に Linux をインストールする](https://learn.microsoft.com/ja-jp/windows/wsl/install)

1. PowerShell 7 を管理者で実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/6b8dfd46-bd1f-0d5d-c252-af1183985715.png)

1. インストール実行
    ```PowerShell:PowerShell
    wsl --install
    ```

1. 再起動して Ubuntu の初期設定
    - ユーザ/パスワード：任意（なんでもOK, ユーザ/パスワードを忘れないように注意）
1. バージョン確認 (今回は 22.04 で実施してます)
    ```Ubuntu:Ubuntu
    cat /etc/os-release
    ```
1. root ユーザに変更 (Windows の管理者実行みたいなやつ)
    パスワードは Ubuntu の初期設定で設定したものを使う
    ```Ubuntu:Ubuntu
    sudo -su root
    ```
1. アップデート実行 ※失敗が残った時は再起動して再実行
    ```Ubuntu:Ubuntu
    # コマンドは二つ
    sudo apt update -y
    sudo apt upgrade -y
    ```
1. 念のため再起動

# Docker インストール

Ubunts に Docker, Docker Compose をインストールしていく

1. Ubunts を管理者で実行
    ユーザ・パスワード入力があるときは Ubuntu の初期設定時に設定したものを使う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/e88252c8-d75d-fcbd-d180-dce4d18d0168.png)

1. root ユーザに変更 (Windows の管理者実行みたいなやつ)
    パスワードは Ubuntu の初期設定で設定したものを使う
    ```Ubuntu:Ubuntu
    sudo -su root
    ```

1. DockerインストールのGCP鍵取得
    ```Ubuntu:Ubuntu
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    ```

1. 安定版（stable）リポジトリをセットアップ
    ```Ubuntu:Ubuntu
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    ```

1. パッケージ更新
    ```Ubuntu:Ubuntu
    sudo apt update
    ```

1. Dockerインストール実行
    ```Ubuntu:Ubuntu
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    ```

1. iptables, ip6tables 設定変更
    ```Ubuntu:Ubuntu
    # コマンド2つ実行 
    sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
    sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
    ```

1. root ユーザに変更 (Windows の管理者実行みたいなやつ)
    パスワードは Ubuntu の初期設定で設定したものを使う
    ```Ubuntu:Ubuntu
    sudo -su root
    ```

1. Docker Compose インストールディレクトリ作成
    ```Ubuntu:Ubuntu
    sudo mkdir -p /usr/local/lib/docker/cli-plugins
    ```

1. Docker Compose インストール実行
    ```Ubuntu:Ubuntu
    sudo curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
    ```

1. シンボリックリンク設定
    ```Ubuntu:Ubuntu
    sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
    sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
    ```

1. Docker, Docker Compose バージョン確認 (今回は Docker 23.0.1, Docker Compose 2.4.1 で実施してます)
    ```Ubuntu:Ubuntu
    docker --version
    docker-compose --version
    ```

# MySQL の Docker Compose 作成・実行・停止
Docker Compose の設定ファイルを作って実行、停止する

1. Ubunts を管理者で実行
    ユーザ・パスワード入力があるときは Ubuntu の初期設定時に設定したものを使う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/e88252c8-d75d-fcbd-d180-dce4d18d0168.png)

1. root ユーザに変更 (Windows の管理者実行みたいなやつ)
    パスワードは Ubuntu の初期設定で設定したものを使う
    ```Ubuntu:Ubuntu
    sudo -su root
    ```

1. Docker Compose を作るディレクトリを作成・移動(任意でどこでもOK)
    ```Ubuntu:Ubuntu
    # 例はかなり適当... ディレクトリ名は慎重に！！！
    mkdir -p tekito1/tekito2/tekito3
    cd tekito1/tekito2/tekito3
    ```

1. Docker Compose 設定ファイル作成（docker-compose.yml, .env の2つ）
    ```yaml:docker-compose.yml
    version: '3'

    services:
      db:
        image: mysql:8
        container_name: mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: ${ROOT_PASS}
          MYSQL_DATABASE: ${DB_NAME}
          MYSQL_USER: ${DB_USER}
          MYSQL_PASSWORD: ${DB_PASS}
          TZ: ${TZ}
        ports:
            - ${DB_PORT}:3306
        volumes:
            - db-store:/var/lib/mysql
            - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
    volumes:
      db-store:
    ```
    ```properties:.env
    ROOT_PASS=root
    DB_NAME=WEB_APP_DB
    DB_USER=webapp
    DB_PASS=webapp
    DB_PORT=13306
    TZ=Asia/Tokyo
    ```

1. Docker 起動
    ```Ubuntu:Ubuntu
    service docker start
    ```

1. Docker Compose 起動・停止 etc...
    ```Ubuntu:Ubuntu
    # 起動
    docker-compose up -d

    # 停止
    docker-compose down

    # 起動プロセス確認
    docker-compose ps
    
    # 起動コンテナにログイン ( ${serviceName} はここだと db )
    docker-compose exec ${serviceName} /bin/bash

    ```

※ 参考 Docker の MySQL にアクセス（ローカルJavaなど）
port, user, password などを Docker Compose の設定に合わせる感じでコネクション生成

```Java:参考コネクション生成
    String dbUrl = "jdbc:mysql://localhost:13306/WEB_APP_DB";
    String dbUser = "webapp";
    String dbPassword = "webapp";
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);

    // 以降は SQL 実行などやってく感じ

```