Elixir/Phoenixをdocker環境で立ち上げてみる。

# はじめに

はじめまして、[naritomo](https://x.com/KanagawaLo81146)と申します。

本職はインフラエンジニアを行っています。
個人的にいじっているElixir系についてなにか投稿しようと
思って作成してみました。

初めての投稿なのでいろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

windows11を使用してwsl2+Ubuntu+vscode環境を作り、
docker-composeを使用して立ち上げるものになります。

必要なソースは以下にまとめてあります。

https://github.com/naritomo08/elixir-docker-db

## なぜ、あえてDockerなのか？

インフラエンジニアとしてDockerから触れたほうが扱いやすく、
以下の利点を感じられたため、開発環境構築ではDockerを使用することを
推しています。

* OS問わず同じ開発環境での開発が可能
* インフラ/アプリエンジニアでのコラボがしやすい。
　 (具体的にはインフラ屋でOS/開発環境のベース環境を構築し、
　　アプリエンジニアで本来行うべき開発業務に集中できる。)
* 本番Web環境で多く使用されているAWS/AzureなどのIaaSサービス
　に対し、Docker資産を使用できる。

一応、本番環境展開にPaaSを使用する手はありますが、
AWS/Azureを絡めたほうが業務につながるとみています。

## 構築される環境

* Phoenix1.5
  - Erlang/OTP 23
  - Elixir 1.11.3
  - Phoenix 1.5.7

* Phoenix1.6
  - Erlang/OTP 24
  - Elixir 1.13.4
  - Phoenix 1.6.15

* Phoenix1.7
  - Erlang/OTP 25
  - Elixir 1.14.3
  - Phoenix 1.7.1

## 必要なソフトウェア

* Docker 20 以上
* Docker Compose 1.27 以上

## 動作確認済みのOS

* Windows11(wsl2上のUbuntuから稼働)

## 構築方法

### windoows11上にwsl/Ubuntu22.04をインストールする。

参考>
[Ubuntu 22.04でElixirの最短手順](https://qiita.com/piacerex/items/01e89435af0f7a454ad2)

作業実施後、以下のコマンドをwindowsコマンドプロンプトで実施する。

```bash
wsl --unregister Ubuntu
wsl --set-default Ubuntu-22.04
wsl --list --verbose
```

### docker-desktopをインストールする。

従業員250人以上かつ年間売上高1000万ドル以上の企業利用の場合、
有料となるため注意

参考>
[Docker Desktop インストール手順](https://qiita.com/R_R/items/a09fab09ce9fa9e905c5)

Docker Desktopを使用しない(できない)場合、以下のサイトを参照

[DockerDesktopからWSL2上のみで動くDockerに移行する](https://zenn.dev/taiga533/articles/11f1b21ef4a5ff)

### vscodeのインストールを行い、wsl2内のUbuntuコンソールを開く

以下のサイトを参考に、vscodeのインストール/Ubuntuコンソールを開く。

参考>
[WSL2 + Ubuntu + VSCodeでの開発環境構築](https://qiita.com/zaburo/items/27b5b819fae2bde97a3b)

### dockerコンテナクローン、デプロイ、立ち上げ

```bash
＊Phoenix1.5利用
git clone https://github.com/naritomo08/elixir-docker-db.git elixir-docker-db
＊Phoenix1.6利用
git clone -b phx1.6 https://github.com/naritomo08/elixir-docker-db.git elixir-docker-db
＊Phoenix1.7利用
git clone -b phx1.7 https://github.com/naritomo08/elixir-docker-db.git elixir-docker-db

＊上記について、それぞれ別名フォルダで立ち上げればそれぞれの
　バージョン用として共存できます。

cd elixir-docker-db
sudo bin/setup.sh
sudo bin/start.sh
sudo bin/login.sh
→この時点でElixirプログラミング可能
```

後にファイル編集などをして、git通知が煩わしいときは
作成したフォルダで以下のコマンドを入れる。

```bash
 rm -rf .git
```

### Webサイト作成

```bash
mix phx.new testsite --database postgres
→yを選択する。
cd testsite
vi config/dev.exs
"hostname: "postgres","にする。
*Phoenix1.6/1.7の場合
"http: [ip: {0, 0, 0, 0}, port: 4000],"にする。
vi config/test.exs
"hostname: "postgres","にする。
```

###  DB作成

```bash
mix ecto.create
```

### サイト立ち上げ

```bash
mix phx.server
```

### サイト参照

ブラウザで以下のURLを参照してサイト参照できることを確認する。

http://localhost:4000

### DB管理ツール(adminer)にも参照できることを確認する。

http://localhost:8081

* ログイン情報(postgresql)
  - データベース種類: Postgresql
  - サーバ: postgres
  - ユーザ名: postgres
  - パスワード:postgres
  
* ログイン情報(mariadb)
  - データベース種類: mysql
  - サーバ: mariadb
  - ユーザ名: root
  - パスワード:root

### サイト停止

Ctrl+c を2回押すことで停止可能

### コンテナ停止

```bash
＊コンテナに入っている場合
exit

sudo bin/stop.sh
```

### コンテナ起動

```bash
sudo bin/start.sh
```

### Elixirコンテナログイン

```bash
sudo bin/login.sh
```

### コンテナ削除

```bash
docker-compose down
```

## 作成したソースを流用したい場合

サイト作成したあと、以下のフォルダ内をgithubなどに保管すれば、
他の開発/本番環境へソースを持っていって利用できます。

```bash
apps/testsite
```

本docker環境に持っていきたい場合、
"dockerコンテナクローン、デプロイ、立ち上げ"したあと、
別ターミナルで上記フォルダ(別名でも可)へ使用したいソースを入れて、
もとのターミナルでソースを入れたフォルダに移動して
"サイト立ち上げ"を実施すればひとまず立ち上がるはずです。

他環境で本ソースを使用した立ち上げ方は、
ここでは割愛いたします。

# おわりに

合わせてDBなし版のコンテナも作っていますので、
参照いていただいて指摘をいただけると嬉しいです。

Phoenix1.6/1.7を使用したい際は、phx1.6/phx1.7ブランチに切り替え
参照してください。

https://github.com/naritomo08/elixir-docker-nondb

Phoenixサイト作成アラカルトについて、
以下の場所にもまとめていますので、
是非参照ください。

https://qiita.com/naritomo08/items/1284f64ced1baeda9c03

本記事以外にもruby/phpについても同様のものを上げていますので、
参照していただいてこちらにも挑戦していただければと思います。

https://qiita.com/naritomo08/items/b39d4ee6987fb052ca79

https://qiita.com/naritomo08/items/a66f4647c13a6c4a920e

NeosとElixir/Phoenix連携も行ってみました。

https://qiita.com/naritomo08/items/5f04266424ec46312122