やりたいこと
- docker-compose upでrails serverを起動できるようにする。
- ホストのファイルシステムとコンテナのファイルシステムを同期させる。
- docker-compose upでrailsプロセスとdbが起動し、http://localhost:3000 でアクセスできるようにする。
dockerを立ち上げてアプリを自動起動するまでの流れ
- docker-compose upでrailsとDBのコンテナを起動できるようにする。
- Webアプリを自動で起動できるようにする。
コンテナ化の手順
- 今回はRailsアプリをコンテナ起動による自動化を目指すためrailsとpostgresをコンテナ化します。
- コンテナ化に必要なDockerfileと2つのコンテナを使うのでdocker-compose.ymlを用意します。
- DBの設定に必要なdatabase.ymlファイルも適宜修正します。
例 Dockerfile
FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
nodejs
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock
COPY . /rails-docker/
RUN bundle install
※アプリ起動の自動化前のため、コンテナを起動するまでに留めてます。
例 docker-compose.yml
version: '3'
volumes:
db-data:
services:
web:
build: . ports:
- '3000:3000'
volumes:
- '.:/rails-docker'
environment:
- 'DATABASE_PASSWORD=postgres'
tty: true
stdin_open: true
depends_on:
- db
links:
- db
db:
image: postgres:12
volumes:
- 'db-data:/var/lib/postgresql/data'
environment:
- 'POSTGRES_USER=postgres'
- 'POSTGRES_PASSWORD=postgres'
- 'POSTGRES_HOST_AUTH_METHOD=trust'
上記設定ファイルを保存したらターミナルにて以下のコマンドを実行しアプリを起動します。
railsとpostgresのコンテナを起動
※-dオプションでdetachモード(バックグランド)でコンテナを起動します。
$ docker-compose up -d
2つのコンテナが起動したことを確認
$ docker-compose ps
コンテナにログイン
※今回の場合は引数にwebを指定してます。
$ docker-compose exec web bash
コンテナにログイン後DBの設定をします。
# rails db:create
# rails db:migrate
# rails s -b 0.0.0.0 ※今回はローカルで起動することを想定
ブラウザにlocalhost:3000を入力しWebアプリが起動することを確認。
上記の記載内容でコンテナ、およびアプリが立ち上がることがわかったので、今度はアプリを自動で起動できるようにdocker-compose.ymlを修正します。
例 docker-compose.yml
services:
web:
build: .
以下のDB設定コマンドとrails起動コマンドを追記する
command: >
bash -c "rails db:create &&
rails db:migrate &&
rails s -b 0.0.0.0"
コンテナを一時的に停止し再度立ち上げる
コンテナを停止
$ docker-compose down
コンテナを起動
$ docker-compose up -d
ブラウザにlocalhost:3000を入力しコンテナ起動と同時にWebアプリが起動することを確認。
まとめ
今回のケースではコンテナ起動と同時にアプリを自動で立ち上げるためにDB設定コマンドとrailsを起動するコマンドを追記するだけでした。
ただ今後より本格的なWebアプリをコンテナ化して自動で起動する際はより複雑な設定をdocker-compose.ymlに追記する必要があるかと思います。