使用Docker Compose对Rails项目进行Docker化

本文介绍了使用Docker Compose将现有的Rails项目容器化的步骤。

什么是Docker Compose?

Docker Compose是一种工具,用于定义多个Docker容器并便捷地启动、停止和连接它们。
在开发、测试和部署由多个组件构成的应用程序(如Rails项目)时,Docker Compose非常方便。
通过将每个组件作为单独的容器处理,可以轻松构建开发环境、调试、测试和顺利部署到生产环境。

前提条件 (Qian ti tiao jian)

    1. 确认Docker和Docker Compose已安装完毕

 

    确保有准备好的Rails项目(GitHub上)

将Rails项目Docker化的步骤流程

    1. 创建项目的克隆

 

    1. 创建用于Docker化所需的文件

 

    构建和启动容器

步骤

项目的克隆

从GitHub上克隆项目,并切换到工作目录。

git clone <GitHub リポジトリ URL>
cd <プロジェクトディレクトリ>

创建Docker文件

为了在Docker中运行Rails应用程序,需要在项目目录(根目录)中创建一个Dockerfile。进行必要的包安装和配置。

FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker/
RUN bundle install

ADD . /rails-docker

※目录名称是任意的(本次使用/rails-docker作为示例)。

创建Docker Compose文件

version: '3'
services:
  db:
    image: postgres:12
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails-docker
    environment:
      - DATABASE_PASSWORD=postgres
    tty: true
    stdin_open: true
    ports:
      - "3000:3000"
    depends_on:
      - db
    links:
      - db

volumes:
  db-data:

编辑database.yml文件

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_development

构建和启动Docker容器

使用Docker Compose构建和启动包含Rails应用和数据库的所有服务。

docker-compose build
docker-compose up -d

近年,像docker-compose up这样的命令通常会在执行时不使用破折号,但是根据我参考的教材,它是带破折号的,所以我会按照那边的规范进行操作。

如果没有镜像存在(比如首次运行),只需要执行docker-compose up命令即可,它会同时进行构建操作。

在中文中设置PostgreSQL数据库

既经成功建立了与PostgreSQL数据库的连接,接下来需要进行数据库的初始化和迁移工作。

docker-compose exec web bash
rails db:create
rails db:migrate
exit

启动Rails应用程序

在本地主机上启动Rails应用程序。

ブラウザで
http://localhost:3000
へ接続

创建的文件描述

# クローンしたのrailsアプリのGemfileでバージョンを確認する。今回は3.2.2を指定。
FROM ruby:3.2.2

# apt-getパッケージマネージャを使用して、ビルドに必要な依存関係(build-essential、libpq-dev、nodejs)をインストール
# -qq:エラーメッセージ以外の全ての出力を抑制(quiet)する
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

# 作業ディレクトリを/rails-dockerに変更.
WORKDIR /rails-docker

# GemfileとGemfile.lockファイルをDockerイメージの/rails-docker/ディレクトリにコピー.
# これでbundle install時に、ローカルのGemfile定義が使用される
COPY Gemfile Gemfile.lock /rails-docker/

# Gemfileに記述された依存関係をインストール
RUN bundle install

# ローカルのプロジェクトファイルをDockerイメージの/rails-dockerディレクトリにコピー
ADD . /rails-docker
version: '3'
services:
  db:
    image: postgres:12
    # データ永続化
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
        # userは記載しない場合はpostgresがデフォルト.今回は記載
      - POSTGRES_USER=postgres
        # 必須項目のため必ず記載
      - POSTGRES_PASSWORD=postgres

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails-docker
    # コンテナ内での環境変数を定義する
    environment:
      - DATABASE_PASSWORD=postgres
    tty: true
    stdin_open: true
    ports:
      - "3000:3000"
    # サービス間の起動順番と終了順番の依存関係を表す
    # webの前にdbが作成
    depends_on:
      - db
    # サービス内のコンテナが別のサービス内のコンテナに簡単にアクセスできるようになる
    links:
      - db

volumes:
  db-data:

default: &default
  adapter: postgresql
  encoding: unicode
  # データベースサーバーのホスト名を指定.
  # Docker Composeを使用している場合、dbはデータベースコンテナのサービス名
  host: db
  # データベースに接続する際のユーザー名を指定.postgresはデフォルト
  username: postgres
  # データベースに接続する際のパスワードを環境変数から取得
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

广告
将在 10 秒后关闭
bannerAds