WSL2 環境に Docker と Elixir と PostgreSQL をインストールしよう
動画
Docker をインストールする
Ubuntu ターミナルを起動して、以下のコマンドを順に実行してください。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Ubuntuユーザーのパスワードの入力をしてください。しばらくして次のようなメッセージが表示されれば、Docker のインストールが完了しています。
念のため、docker --version
コマンドを実行して、Docker のバージョン番号を確認してください。動画収録時の Docker の最新バージョン番号は 26.0.2 でした。
続いて、次のコマンドを実行してください。
sudo usermod -aG docker $USER
その後、Ubuntu ターミナルを終了し、起動し直してください。
参考資料
プロジェクトディレクトリを作成する
Ubuntuターミナル上でプロジェクトディレクトリを作成します。名前は何でも構いません。この動画では projects/my_app
としました。
次のコマンドを実行してください。
mkdir -p projects/my_app
cd projects/my_app
Dockerfile
を作成する
code .
コマンドで VS Code を起動してください。まだ VS Code をインストールしていない方は、◯◯◯を参照してください。VS Code の代わりに Vim や Nano を利用しても構いません。
プロジェクトのルートディレクトリに次の内容を持つ Dockerfile
(拡張子なし)を作成してください。
FROM elixir:1.16.0
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NOWARNINGS yes
RUN apt-get update && apt-get -y install apt-file && apt-file update
RUN apt-get -y upgrade
RUN apt-get -y install bash git vim sudo curl inotify-tools imagemagick ffmpeg cmake erlang-dev \
ca-certificates gnupg postgresql-client
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | \
gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
ENV NODE_MAJOR=20
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" > /etc/apt/sources.list.d/nodesource.list
RUN apt-get update && apt-get -y install nodejs
RUN echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
ARG UID=1000
ARG GID=1000
RUN groupadd -g $GID devel
RUN useradd -u $UID -g devel -m devel
RUN echo "devel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
COPY . /app
USER devel
WORKDIR /app
RUN mix local.hex --force
RUN mix local.rebar --force
docker-compose.yml
を作成する
続いて、プロジェクトのルートディレクトリに次の内容を持つ docker-compose.yml
を作成してください。
services:
db:
image: postgres:16.2
volumes:
- db_data:/var/lib/postgresql/data:cached
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
app:
build: .
volumes:
- .:/app:cached
working_dir: /app
ports:
- "4000:4000"
depends_on:
- db
tty: true
volumes:
db_data:
コンテナの起動、動作確認、終了
app
コンテナのビルド
id -u
コマンドの実行結果を確認してください。通常は、「1000」と表示されます。
「1000」と表示された場合は、次のコマンドを実行してください
docker compose build --no-cache app
「1001」とか「1002」のように「1000」と表示されない場合は、次のコマンドを実行してください
docker compose build --no-cache --build-arg UID=$(id -u) --build-arg GID=$(id -g) app
コンテナ群を起動する
docker compose up -d
コマンドを実行してください。
コンテナ群の状態を確認する
docker compose ps
コマンドを実行してください。次のように表示されれば、すべてのコンテナ群が起動されています。
app
コンテナの中に入る
docker compose exec app bash
コマンドを実行し、app
コンテナの中に入ります。
Elixir のバージョンを確認する
app
コンテナの中で elixir --version
コマンドを実行してください。動画収録時点では、次のように表示されました:
Erlang/OTP 26 [erts-14.1.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
Elixir 1.16.2 (compiled with Erlang/OTP 24)
PostgreSQL に接続できることを確認する
app
コンテナの中で psql -h db -U postgres
コマンドを実行してください。
「Password for user postgres:」というプロンプトに対して、「postgres」と入力してください。
ターミナルに次のように表示されれば接続に成功しています:
psql (15.6 (Debian 15.6-0+deb12u1), server 16.2 (Debian 16.2-1.pgdg120+2))
WARNING: psql major version 15, server major version 16.
Some psql features might not work.
Type "help" for help.
postgres=#
キーボードから Ctrl-D を入力して PostgreSQL コンソールからログアウトしてください。
コンテナ群を終了する
docker-compose stop
を実行し、コンテナ群を終了してください。
Phoenix アプリの骨格を作る
phx_new パッケージのインストール
docker compose up -d
コマンドを実行し、改めてコンテナ群を起動します。そして、docker compose exec app bash
コマンドで、app
コンテナの中に入ります。
そして、mix archive.install hex phx_new 1.7.12
コマンドを実行してください。
このコマンドにより、Phoenix のソースコードの骨格を生成する mix_new
パッケージがインストールされます。
ソースコードの骨格を生成する
app
コンテナの中で以下のコマンドを順に実行してください。
mix phx.new my_app
mv my_app/* .
mv my_app/.* .
config/dev.exs
を書き換える
VS Code で config/dev.exs
を開きます。すると次のような内容が表示されます:
import Config
# Configure your database
config :my_app, MyApp.Repo,
username: "postgres",
password: "postgres",
hostname: "localhost",
database: "my_app_dev",
stacktrace: true,
show_sensitive_data_on_connection_error: true,
pool_size: 10
localhost
を db
に書き換えてファイルを保存してください。
データベースを作成する
app
コンテナの中で mix ecto.create
コマンドを実行してください。
ターミナルに「The database for MyApp.Repo has been created」と表示されれば成功です。
Discussion