macでRails apiとNuxtを作れるDocker環境を作る
はじめに
WEBサービスの勉強を始めたいけど、開発環境がよくわからない。
こんな事で困っているケースが多々あるので、かんたんな開発環境をすぐに再現できるように、方法を残しておきます。
※ この記事内では、各ファイル内の細かい使い方などは、説明いたしません。
ゴール
- rails apiへのアクセスは、http://localhost:3000/ で、できるようにする。
- nuxt表示の確認は、 http://localhost:8080/ で、できるようにする。
用意するもの
- Docker.app
- エディター
- 作業用ファイルをいくつか
docer.app
Docker Desktop for Mac については、https://www.docker.com/products/docker-desktop からダウンロードできると思います。
エディター
Visual Studio Codeなど、お好きなエディターを用意しましょう。
作業用ファイルをいくつか
まず、開発環境の大本であるディレクトリを用意します。(以下:rootと言います。)
例:nuxtdemoディレクトリ
※「★」は適当なディレクトリ名で構いません。私の場合は「works」としています。
/Users/ユーザー名/★/nuxtdemo
nuxtdemoディレクトリの構成は、以下のようにします。
各ファイルの中身については、後ほど記載します。
※[]はそれぞれ、apiディレクトリ、frontディレクトリを指します。
docker-compose.yml
.env
[api]
└Dockerfile
└Gemfile
└Gemfile.lock
[front]
└Dockerfile
各ファイルの中身について
version: '3.8'
services:
db:
image: postgres:12.3-alpine
environment:
TZ: UTC
PGTZ: UTC
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
volumes:
- ./api/tmp/db:/var/lib/postgresql/data
api:
stdin_open: true
tty: true
build:
context: ./api
args:
WORKDIR: $WORKDIR
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
environment:
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
API_DOMAIN: "localhost:$FRONT_PORT"
APP_URL: "http://localhost:$API_PORT"
volumes:
- ./api:/$WORKDIR
depends_on:
- db
ports:
- "$API_PORT:$CONTAINER_PORT"
front:
build:
context: ./front
args:
WORKDIR: $WORKDIR
CONTAINER_PORT: $CONTAINER_PORT
API_URL: "http://api:$API_PORT"
API_URL_BROWSER: "http://localhost:$API_PORT"
command: yarn run dev
volumes:
- ./front:/$WORKDIR
depends_on:
- api
ports:
- "$FRONT_PORT:$CONTAINER_PORT"
# commons
WORKDIR=app
CONTAINER_PORT=3000
API_PORT=3000
FRONT_PORT=8080
# db
POSTGRES_PASSWORD=password
FROM ruby:2.7.1-alpine
ARG WORKDIR
ENV RUNTIME_PACKAGES="linux-headers libxml2-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql git imagemagick" \
DEV_PACKAGES="build-base curl-dev" \
HOME=/${WORKDIR} \
LANG=C.UTF-8 \
TZ=Asia/Tokyo
WORKDIR ${HOME}
COPY Gemfile* ./
RUN apk update && \
apk upgrade && \
apk add --no-cache ${RUNTIME_PACKAGES} && \
apk add --virtual build-dependencies --no-cache ${DEV_PACKAGES} && \
bundle install -j4 && \
apk del build-dependencies
COPY . .
source 'https://rubygems.org'
gem 'rails', '~> 6.0.0'
FROM node:14.16.1-alpine
ARG WORKDIR
ARG CONTAINER_PORT
ARG API_URL
ARG API_URL_BROWSER
ENV HOME=/${WORKDIR} \
LANG=C.UTF-8 \
TZ=Asia/Tokyo \
HOST=0.0.0.0 \
API_URL=${API_URL} \
API_URL_BROWSER=${API_URL_BROWSER}
WORKDIR ${HOME}
# COPY package*.json ./
# RUN yarn install
# COPY . ./
# RUN yarn run build
EXPOSE ${CONTAINER_PORT}
Rails API環境を作る
ファイルの準備が整いましたら、rails apiアプリから作成していきます。
ゴールは、http://localhost:3000/ のURLで表示する画面が、以下のようになることです。
ここから先は、ターミナルでのコマンド入力で行います。
そのためにまず、ターミナルで、先程作成したroot(ディレクトリ)に移動します。
root $ cd /Users/ユーザー名/★/nuxtdemo
移動後、一度dockerが動くかどうかを確認するためにも、buidlコマンドを実行します。
root $ docker-compose build
その後、buildコマンドが正しく動いたかどうか確認するために、
docker imagesコマンドを実行します。
結果、以下のようにREPOSITORYなどが表示されればOKです。
root $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nuxtdemo_front latest 9043ea43445d 21 minutes ago 116MB
nuxtdemo_api latest 9cd48bec61b8 21 minutes ago 658MB
この確認ができたら、Railsアプリを作成します。
root $ docker-compose run --rm api rails new . -f -B -d postgresql --api
無事に作成完了した場合は、railsとDBを連携させるために、以下のファイルを更新し、
docker環境を更新した後に、DBを作成するコマンドを実行します。
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: db # 追加
username: postgres # 追加
password: <%= ENV["POSTGRES_PASSWORD"] %> # 追加
root $ docker-compose build
root $ docker-compose run --rm api rails db:create
これらを実行後は、以下のように表示されます。
root $ docker-compose run --rm api rails db:create
Creating nuxtdemo_api_run ... done
Created database 'app_development'
Created database 'app_test'
DBが作成されたら、docker環境を立ち上げましょう。
root $ docker-compose up api
そうすると、以下のように表示されるはずです。
nuxtdemo_db_1 is up-to-date
Creating nuxtdemo_api_1 ... done
Attaching to nuxtdemo_api_1
api_1 | => Booting Puma
api_1 | => Rails 6.0.4.1 application starting in development
api_1 | => Run `rails server --help` for more startup options
api_1 | Puma starting in single mode...
api_1 | * Version 4.3.10 (ruby 2.7.1-p83), codename: Mysterious Traveller
api_1 | * Min threads: 5, max threads: 5
api_1 | * Environment: development
api_1 | * Listening on tcp://0.0.0.0:3000
api_1 | Use Ctrl-C to stop
このような表示が確認できた場合は、http://localhost:3000/ にアクセスしてみましょう。
そうすると、以下の画面が表示できると思います。
これで、Rails API環境の作成は完了です。
Nuxt環境を作る
続いてNuxt環境を作っていきます。
ゴールは、http://localhost:8080/ のURLで表示する画面が、以下のようになることです。
ターミナルで以下のコマンドを実行します。
root $ docker-compose run --rm front yarn create nuxt-app app
コマンドの処理の途中、「どうのようなnuxt環境にするか」を選択できる状態になります。
が、何も考えず、エンターキー連打でかまいません。
そのため、今回は以下のように選択して、すすめることにします。
create-nuxt-app v3.7.1
✨ Generating Nuxt.js project in app
? Project name: app
? Programming language: JavaScript
? Package manager: Yarn
? UI framework: None
? Nuxt.js modules: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Testing framework: None
? Rendering mode: Universal (SSR / SSG)
? Deployment target: Server (Node.js hosting)
? Development tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? What is your GitHub username?
? Version control system: Git
先程のコマンドの実行完了を確認したら次に、作成したファイルの移動を行います。
root $ mv front/app/{*,.*} front
root $ rmdir front/app
ファイルの移動が終わりましたら、front/Dockerfileの更新を行います。
(先頭の「#」を削除してください。)
COPY package*.json ./
RUN yarn install
COPY . ./
RUN yarn run build
Dockerfileを書き換えたので、buildしなおします。
root $ docker-compose build
その後は upで立ち上げ、http://localhost:3000/ と、 http://localhost:8080/ にアクセスしてみましょう。
root $ docker-compose up
http://localhost:8080/ の表示が、以下のようになれば、Nuxt環境の準備完了です。
おつかれさまでした!
[その他]よく使うDockerコマンド
# dockerのイメージを作成する。
root $ docker-compose build
# docker内のnuxt yarn install
root $ docker-compose run --rm front yarn install
# docker内のrails bundle install
root $ docker-compose run --rm api bundle install
# docker環境の立ち上げ
root $ docker-compose up
# dockerのコンテナの停止・削除を一度に行う
root $ docker-compose down
# Dockerイメージを確認する
root $ docker images
# Dockerイメージのうち、noneタグのイメージを削除
root $ docker rmi $(docker images -f 'dangling=true' -q)
[その他]参考記事
Discussion