elixir on docker
2022-01-30 tokyo.ex #15 hands-on
agenda
About Me
ゴール
docker/docker-compose
why docker?
why docker?
dockerの構造/Dockerfileの構成
FROM イメージ名
WORKDIR 作業ディレクトリのパス
RUN イメージ作成時に実行するコマンド
CMD コンテナ起動時に実行するコマンド
ENTRYPOINT コンテナ起動時に実行するコマンド
dockerの構造
docker registory
(dockerhub)
開発マシン
/path/to/work
Dockerfile
FROM
コンテナ runtime (docker)
コンテナ
マシン上のイメージ領域
image1
layer1
layer2
…
tag
docker build
docker images
image2
docker pull
docker ps
docker run
docker create
docker start
docker xxx
docker inspect
File
Process
…
docker-composeの構造/docker-compose.ymlの構成
version: ‘3’
services:
サービス名:
build or image: Dockerイメージ名 or Dockerfileのパス
command: コンテナ起動時に実行するコマンド
environment:
環境変数名: 環境変数の値
…
ports:
- ホスト側の通信ポート:コンテナ側の通信ポート
depends_on:
- コンテナ開始前に開始させるサービス名
…
volumes:
- ホスト側のパス or ボリューム名:コンテナ側のパス
…
サービス名:
…
volumes:
volume名:
…
docker-composeの構造
開発マシン
コンテナ runtime (docker)
コンテナimage領域
コンテナvolume領域
/path/to/work
docker-compose.yml
サービス名:
demo_app
サービス名:
demo_db
volume2
image1
image2
/path/to/work/volume1
mount
mount
create
create
コンテナ間はサービス名(demo_app, demo_db)で通信可能
コンテナの構成を定義
portsで指定したportで該当のコンテナに通信可能
docker compose build
docker compose up/down
docker compose exec/run [cmd]
…
elixir/phoenixアプリへの適用
elixir/phoenixアプリへの適用
開発マシン
コンテナ runtime (docker)
コンテナvolume領域
/path/to/work
docker-compose.yml
app
db
node_modules
db_data
/app/assets/node_modules
/var/lib/postgresql/data
/app
mount
mount
5432 : 5432
4000 : 4000
Dockerfile
WORKDIR /app
docker compose build
docker compose run --rm app mix phx.new …
docker compose run --rm app mix ecto.create
docker compose up -d
docker compose logs -f
docker compose down
localhost:4000 でappに通信
host=dbで通信
CIとは
CIへの組み込み方(CircleCI)
.circleci/config
version: ‘3’
jobs:
build:
docker:
- image: circleci/elixir:1.13-node
environment:
MIX_ENV: test
MIX_TEST_DB_HOST: localhost
- image: circleci/postgres:9.6
environment:
POSTGRES_USER: postgres
POSTGRES_DB: demo_test
POSTGRES_PASSWORD: postgres
working_directory: ~/app
steps:
-checkout
-run: mix local.hex --force
-run: mix local.rebar --force
-run: mix archive.install --force hex phx_new
-run: mix do deps.get, compile
-run: mix test
CI pipelineを実行するコンテナ
→ elixir(+nodejs)とpostgres
CI pipelineのコンテナで実行するコマンド
→ mixをセットアップして、testを実行
config/test.exsを以下の様に設定して、DBのhostを環境変数MIX_TEST_DB_HOSTから取得するよう修正しておく
まとめ