Windows PCにPodmanをインストールしてMySQLを動かす

ローカル上で開発環境を構築する際、最近ではRDBをコンテナを上で起動して使用する機会が増えた。
ローカルの開発環境はWindowsのPCだがDocker Desktopは有料化しているので仕事では使用できないこともある。
そこでdockerとほぼ同じ機能を持つ上で無料のコンテナ環境を作れるPodmanを使用することにした。

フリーのツールPodman Desktopを使用してMySQLを起動する手順を、備忘録として以下に記載する。
Podman自体はdocker同様Linux環境で動くため、Windows PCにWSL（Linux仮想環境）がインストールされている必要があるが、Podman Desktopのインストールの中でWSLのインストールもできるようだ。
また、コンテナ起動にはpodman-composeを使用する想定である。
## 1. Podman Desktopのインストール手順
### 1.1. Podman Desktopをインストールする
ブラウザでPodman Desktopの [ダウンロードサイト](https://podman-desktop.io/downloads/windows) に行く。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/8682351f-6000-2471-738e-1e476052c111.png" width="40%">
### 1.2. ダウンロードしたインストーラを実行する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/b64b259f-3ab0-c93b-9b92-4424b36d8651.png" width="20%">

インストール後にPodman Desktopの画面が起動するので「Go To Podman Desktop」ボタンを押下する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/4ea666b6-c427-8103-8112-771de7924180.png" width="40%">
「install」ボタンを押下する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/d94f4e63-752e-1278-0cf6-90d45dfc2de7.png" width="40%">
インストールウィザードの先頭で、WSLが入っていない場合はインストールしてくれるのでチェックを入れておく
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/140d567b-4e6a-aa7c-879d-6e09efe192b0.png" width="30%">
インストールウィザードでのインストールが終わった時点でコマンドプロンプト上では `podman --help` のようなPodmanのコマンドが使えるのだが、まだPodmanの起動はできていないみたい。
### 1.3. Podmanを開始する
Podman Desktopの画面から「initialize and start」ボタンを押下してしばらくたつと以下の画面の表示なって使用可能な状態となる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/2aba1a9b-177b-90f8-3722-e0e2ebef55f1.png" width="40%">
### 1.4. Podman DesktopをWSLの既定にする
コマンドプロンプトで `wsl --list` コマンドを使用してディストリビューションの一覧に「podman-machine-default」があることを確認する。
以下のように表示される。
```
> wsl --list

Ubuntu-22.04（既定）
podman-machine-default
```
podman-machine-defaultを既定にする必要があるので `wsl --set-default podman-machine-default` を実行し、以下の状態にする。
```
> wsl --set-default podman-machine-default
この操作を正しく終了しました。

> wsl --list

Ubuntu-22.04
podman-machine-default（既定）
```
## 2. podman-composeのインストール
Podman Desktopをインストールしただけだとpodman-composeコマンドが使用できないためpodman-composeをインストールする必要がある。
コマンドプロンプトでWSLを起動し `sudo dnf install podman-compose` コマンドでインストールを開始する。
```
> WSL

$ sudo dnf install podman-compose
```
`Complete!` と出たらインストール成功。
## 3. docker-compose.ymlと初期化スクリプトファイルの準備
コンテナ起動のために以下のファイルを作成します。
- docker-compose.yml
- my.cnf
- init.sql（ファイル名は拡張子sql以外はなんでもよい）
### 3.1. docker-compose.yml
コンテナの情報を記載するファイルです。
今回はMySQL8.0をここで起動したいので、以下のような内容にしています。
Podmanでもdocker-compose.ymlを読み込んでくれるのでファイル名はこれにしています。
```yaml
version: "3"
services:
  mysql:
    image: mysql:8.0.34
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root # MySQLパスワード設定
      MYSQL_DATABASE: hogeDb # MySQLデータベース名設定
      MYSQL_USER: hogeuser # MYSQL_DATABASEで指定したDBの権限をもつユーザ
      MYSQL_PASSWORD: hogepass # hogeuserユーザのパスワード
      TZ: Asia/Tokyo # タイムゾーン
    volumes:
      - mysqldata:/var/lib/mysql # DBデータ永続化
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
      - ./initdb:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
volumes:
  mysqldata:
```
設定内容は以下のような感じです。
- `image` MySQLイメージのバージョンを記載します
- `environment` MySQLの環境変数です。この例ではタイムゾーンも指定
- `/var/lib/mysql` 永続化するDBデータのボリュームに名前をつけます
- `/etc/mysql/conf.d/my.cnf` 独自の初期設定用のファイルを、docker-compose.ymlと同じフォルダにあるmy.cnfにしています
- `/docker-entrypoint-initdb.d` コンテナ起動時に実行するスクリプトファイルの置き場所を、docker-compose.ymlと同階層に作ったinitdbフォルダにしています
- `volumes` 作成するボリュームの指定をします
### 3.2. my.cnf
```conf
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci

[client]
default-character-set = utf8mb4
```
設定内容は以下のような感じです。
- `character_set_server` MySQLのサーバ側に関係する文字コード
- `collation_server` MySQLサーバーの照合順序
- `default-character-set` MySQLのクライアント側に関係する文字コード
### 3.3. init.sql
コンテナ起動時にMySQL内へのテーブルクリエイトも同時に行いたいので、create tableを記載したsqlファイルを用意しました。
docker-comose.ymlにてinit.dのディレクトリ名をinitdbにしたので、docker-compose.ymlのあるディレクトリにinitdbディレクトリを作成し、そのディレクトリ内にsqlファイルを配置します。
sqlファイルを変更した場は、ボリュームを削除したあとにコンテナを起動すると反映されます。
```sql
CREATE TABLE TestHoge (
    hogeId VARCHAR(32) NOT NULL
    , hogeCount SMALLINT NOT NULL DEFAULT 0
    , PRIMARY KEY (hogeId)
);
```
### 3.4. ファイルの配置
WSL内に上記3ファイルを配置する必要があります。
今回はWSL起動するといるディレクトリの直下にlocaldbディレクトリを作り、そこに一式置くこととします。
windowsのエクスプローラ上だと「Linux」というドライブの下に「podman-machine-default」というフォルダがあり、その中が仮想Linuxで使用するディストリビュートを表しているようです。

WSL起動直後のディレクトリは `/home/user` なので、以下のように配置するイメージです（場所は任意）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/a2e0c821-1db6-7455-eea5-56c53fcfb97d.png" width="30%">
## 4. コンテナの起動
### 4.1. コンテナを起動する
コマンドプロンプトでWSLを起動した状態で、docker-compose.ymlファイルの配置してあるディレクトリに移動する。
そこでdockerと同様に `podman-compose up -d` コマンドを実行する。
```shell
$ podman-compose up -d
・
・
途中省略
・
・
exit code:0
```
となってコンテナ上のMySQLが起動した状態になります。
このようにPodman Desktopの画面でも確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/db77382a-4f5e-0576-c37a-b92bae40e23d.png" width="50%">
### 4.2. MySQLを使用する
起動後はローカルにインストールしたRDBと同様の操作が可能です。
今回の例だと以下のようにlocalhostのポート3306でMySQLに接続できます（A5M2で接続する例）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663421/2bcf8c15-d7c2-377b-d035-02c61c7ce597.png" width="30%">
### 4.3. コンテナを終了する
dockerと同様に `podman-compose down` コマンドを実行すると終了する。
保存されているデータを削除したい場合もdockerと同様に、ボリュームを削除するオプションを着けて  `podman-compose down -v` にて実行する。
```shell
$ podman-compose down -v
・
・
途中省略
・
・
exit code:0
```
あくまで試してみたらできたという方法なので、docker-compose.ymlには色々な設定を追加したほうがよいのかもしれません。

以上