用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化完了です!
在输入命令时,有时候可能会出现在容器中没有出现过的错误。在这种情况下,需要将解决错误的命令添加到yaml文件中。

最后

    • 今回は構成がシンプルなRailsアプリのDocker化を行ったので、土台となるDockerfileとdocker-compose.ymlの準備も容易でした。

 

    しかし、複雑なアプリになると土台のDockerfileとdocker-compose.ymlを用意すること自体困難なことも想定されます。その場合は、Dockerfileから構築していく作業から行う必要があります。
广告
将在 10 秒后关闭
bannerAds