簡単！！WSL2とDockerでデータベース環境構築

開発環境を構築する中でデータベースは必ずと言ってもいいくらい必要になります。
WSL2のディストリビューションにDockerを入れると
とても簡単に短時間で安定したデータベース利用環境を構築することができたので、
今回は以前投稿したWSL2を利用したLinux開発環境にDockerをインストールして
データベースの環境を構築した際の手順をご紹介いたします。

構築するデータベースとしてはRDBの例としてMySQL、NoSQLの例としてRedisを構築していきます。

* MySQL

https://www.mysql.com/jp/

* Redis

https://redis.io/

## 前提条件

以下の記事に従ってWSL2を利用したLinux開発環境の環境が構築されていること。

https://qiita.com/T-Ooshio83/items/d10dc09c3ccdeea7b970

### 実施環境
* OS：Windows 10 Home バージョン 21H1
* ディストリビューション：Ubuntu 20.04 LTS

(推奨)作業用ターミナルとしては[Windowsターミナル](https://docs.microsoft.com/ja-jp/windows/terminal/)の使用をお勧めします。

## Dockerのインストール

Dockerのインストール手順についてはdocker docsに手順が記載されているので、
基本的にはdocsの手順に従いインストールを進めていきます。

### Docker Engine インストール

https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/ubuntu/

#### リポジトリのセットアップ

1.　aptパッケージの更新
 
~~~Bash
sudo apt-get update
sudo apt-get install \
   ca-certificates \
   curl \
   gnupg \
   lsb-release
~~~

2.　GPG 鍵の追加

~~~Bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
~~~

3.　安定版（stable）リポジトリのセットアップ

~~~Bash
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.　aptパッケージの更新

~~~Bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
~~~

### Linux インストール後の作業

#### Docker管理のユーザ追加

ログインユーザにdockerコマンドの実行権限を付与してsodo無しでコマンド実行できるようにします。

1.　dockerグループの作成

~~~Bash
sudo groupadd docker
~~~

2.　グループへのユーザ追加

~~~Bash
sudo gpasswd -a $USER docker
~~~

※ docker docsではusermodコマンドを利用してグループ追加を行っていますが、破壊的なコマンドのため、ここではgpasswdコマンドを利用してユーザ追加を行います。

#### Docker自動起動設定

WSLを起動するたびにDockerを起動するのはとても煩わしいので自動起動設定を行います

**serviceコマンドのsudo権限追加**

visudoを使いsudoersファイルを更新してログインユーザにsudo権限を追加します。

1.　visodo起動

~~~Bash
sudo visudo
~~~

2.　Dockerデーモン起動設定追記

最後の行に以下の設定を追加します。
※ XXXXXX部はユーザ名に置き換える

~~~Bash
XXXXXX ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service docker start
~~~

* 入力例  
![visudo_00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849496/166ed6bc-93de-2ed0-537d-7e900d70a508.png)

3.　保存


3.1.　編集終了

メニューに従い次のコマンドを入力して編集を終了します。

~~~plaintext
[Ctrl] + [X]
~~~

* 表示メニュー
![visudo_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849496/5e9dcbd1-9a17-e6ef-c6e9-ef5fe3565541.png)

3.2.　確認

メニューに従い次のコマンドを入力して設定を保存します。

~~~plaintext
[Y]
~~~

* 表示メニュー  
![visudo_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849496/cb6fb323-2360-fc62-a4b3-3b61bf5f1466.png)

3.3.　終了

ファイル名はそのままに次のコマンドを入力して保存します。

~~~plaintext
[Enter]
~~~

* 表示メニュー  
![visudo_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1849496/7d056d74-5fd9-67cd-fcc0-cc38edbd47d1.png)

**Dockerデーモン起動設定**

.bashrcの最後の行に以下の設定を追加します。

* .bashrcの編集

~~~Bash
vi .bashrc
~~~

* 設定

~~~Bash
if [ $(service docker status | awk '{print $4}') = "not" ]; then
  sudo service docker start > /dev/null
fi
~~~

#### 設定反映

コマンドプロンプトを起動して次のコマンドを入力してwslをシャットダウンします。

~~~Bash
wsl --shutdown
~~~

再度wslにログインすることでDockerデーモンが自動で起動しsudo無しでdockerコマンドが実行可能となります。

## Dockerイメージの取得

Dockerイメージを取得してデータベース環境を構築していきます。
以下の手順ではイメージはDocker Hubより取得します。
Docker Hubにはイメージ取得(Pull)の回数制限があるため、
同一IPアドレス環境内でイメージ取得が頻繁に行われている場合、
上限に達している可能性があります。
その際にはDocker Hubに登録したユーザーでログインした上で実施する必要があります。
(無料ユーザでも可)

https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/download-rate-limit/

### Redis環境構築

#### イメージ取得

次のコマンドを実行してRedisのイメージを取得します。

~~~Bash
docker pull redis
~~~

#### イメージ起動

次のコマンドを実行してRedisのイメージを起動します。

~~~Bash
docker run -it --name redis -d -p 6379:6379 redis:latest
~~~

#### コンテナ自動起動設定

次のコマンドを実行することでWSLを再起動した際にコンテナが自動で起動します。

https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/start-containers-automatically/

~~~Bash
docker update --restart=always redis
~~~

#### Redisコマンドラインインタフェースインストール

Redisのコマンドラインインタフェースであるredis-cliをインストールします。

**redis-cliインストール**

次のコマンドを実行してredis-cliをインストールします。

~~~Bash
sudo apt install redis-server
~~~

**接続確認**

次のコマンドを実行して接続を確認します。

~~~Bash
redis-cli
~~~

127.0.0.1:6379に接続され対話モードでCLI実行可能となれば構築完了です。

### MySQL環境構築

#### イメージ取得

次のコマンドを実行してMySQLのイメージを取得します。

~~~Bash
docker pull mysql
~~~

#### イメージ起動

次のコマンドを実行してMySQLのイメージを起動します。

~~~Bash
docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql:latest
~~~

#### コンテナ自動起動設定

次のコマンドを実行することでWSLを再起動した際にコンテナが自動で起動します。

https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/start-containers-automatically/

~~~Bash
docker update --restart=always mysql
~~~

#### MySQLクライアントインストール

MySQLのクライアントをインストールします。

**コマンド確認**

次のコマンドを実行することでMySQLクライアントのインストールを促されます。

~~~Bash
mysql
~~~

※ 2022年2月時点では次のコマンドが表示されます。

~~~Bash
sudo apt install mysql-client-core-8.0     # version 8.0.27-0ubuntu0.20.04.1, or
sudo apt install mariadb-client-core-10.3  # version 1:10.3.32-0ubuntu0.20.04.1
~~~

**インストール**

次のコマンドを実行してMySQLクライアントをインストールします。

~~~Bash
sudo apt install mysql-client-core-8.0
~~~

**接続確認**

次のコマンドを実行して接続を確認します。

~~~Bash
mysql -u root -p -h 0.0.0.0 -P 3306
~~~

接続に成功し対話モードでCLI実行可能となれば構築完了です。

## 参考

* docker docs
  * [Docker Engine インストール（Ubuntu 向け）](https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/ubuntu/)
  * [Linux インストール後の作業](https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/linux-postinstall/) 
  * [ダウンロードレート制限](https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/download-rate-limit/)
  * [コンテナーの自動起動](https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/start-containers-automatically/)

* docker hub
  * [redis](https://hub.docker.com/_/redis)
  * [mysql](https://hub.docker.com/_/mysql)