用Docker Compose将web应用程序(Rails)容器化的方法
条件 – conditions.
-
- Docker未使用の環境で動作するRailsのwebアプリを用意する。
-
- RailsアプリはRubyのバージョン3.2.2、dbとしてpostgresのバージョン12を使用する。
docker-compose upでRailsプロセスとdbが起動し、http://localhost:3000 でこのWebアプリでアクセスできるようにする。
ホストのファイルシステムとコンテナのファイルシステムを同期させる。
朝向Docker化的粗略方向
docker-compose upですべての環境を構築できるようにするのが最終的なゴールになります。しかし、Dockerfileやdocker-compose.ymlに必要なコマンドを最初から網羅して記載することは難しいです。
そこで、まずはWebアプリを起動するために最低限のDockerfileやdocker-compose.ymlを用意するのみにとどめ、立てたコンテナの中で必要なコマンドを模索する作業を行います。
コンテナの中で環境構築に必要なコマンドを特定することができたら、Dockerfileやdocker-compose.ymlにコマンドを追記し環境構築の自動化を行います。
Docker化的步骤
为创建容器做最基本的文件准备。
-
- Railsアプリのためアプリケーション用とdb用のコンテナを使用します。複数コンテナを使うため、Dockerfileとdocker-compose.ymlを用意します。
-
- WebアプリのソースがGitHub等リモートのリポジトリで公開されている場合クローンしてきます。
-
- その後、土台となるDockerfileとdocker-compose.ymlを作成します。
- また、railsのdatabase.yml等に記述が不足している場合は必要な内容を追記します。
# Rubyのバージョンは元のWebアプリのGemfileを参考にします。
FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
nodejs \
postgresql-client \
yarn
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker/
RUN bundle install
version: '3.9'
volumes:
db-data:
services:
web:
build: .
# アプリケーション側のコンテナでは何かしらコマンドの入力が必要であると推測されます。
# しかし、この段階では必要なコマンドが特定できないためcommandを入力しません。
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'
启动容器并确定需要用于环境配置的命令。
docker-compose up -dをしたのち、docker-compose exec web bashをします。こうすることでwebという名称のアプリケーション側のコンテナの中のbashを起動できます。
このステップでは、コンテナの中でrailsのアプリケーション起動を行い、http://localhost:3000 でWebアプリにアクセスできるようにします。ここで入力したコマンドがそのまま環境構築に必要なコマンドになるため、重要な作業になります。
ここからはDockerの話というよりはRailsのアプリケーション起動に必要なコマンドの話となります。
まず、$ rails db:createを入力してDBの作成を行います。
その後、$ rails db:migrateを入力してmigrationファイルの内容をDBに反映します。
最後に、rails s -b 0.0.0.0を入力して、Railsサーバーを起動します。
これらを入力した後、ブラウザ上でhttp://localhost:3000 を入力することでWebアプリにアクセス可能になります。
在docker-compose.yml文件中添加启动Web应用所需的命令
-
- Webアプリの起動が確認できたら、docker-compose upの1コマンドのみでサーバー起動までの環境構築を完了できるようにします。
- docker-compose.ymlのcommandに以下を追記します。今回のケースだと追記後のyamlファイルは以下になります。
version: '3.9'
volumes:
db-data:
services:
web:
build: .
# コンテナの中で特定した環境構築用のコマンドをyamlファイルに追記します。
command: >
bash -c "rails db:create &&
rails db:migrate &&
rails s -b 0.0.0.0"
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'
通过运行docker-compose up进行操作验证
- 最後にdocker-compose upを入力してRailsプロセスとdb起動まで完了するか確認いたします。エラーなくコンテナが起動し、http://localhost:3000 でWebアプリへアクセスできたらDocker化完了です!
最后
-
- 今回は構成がシンプルなRailsアプリのDocker化を行ったので、土台となるDockerfileとdocker-compose.ymlの準備も容易でした。
- しかし、複雑なアプリになると土台のDockerfileとdocker-compose.ymlを用意すること自体困難なことも想定されます。その場合は、Dockerfileから構築していく作業から行う必要があります。