搭建Rails、Postgres、ElasticSearch开发环境的方法是通过Docker实现

我打算使用Docker来创建Rails6的开发环境。我的目标是从rails new到rails db:create,所有步骤都在Docker上进行。实际的代码已上传到这里。

环境

$ sw_vers
ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69
$ docker -v
Docker version 20.10.0, build 7287ab3
$ docker-compose -v
docker-compose version 1.27.4, build 40524192

使用Docker创建Rails应用程序环境。

首先,在项目的根目录下按照以下方式创建文件。

$ tree
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
└── docker-compose.yml

0 directories, 4 files

创建Dockerfile

FROM ruby:2.7.2
RUN apt-get update && apt-get install -y --no-install-recommends build-essential libpq-dev nodejs \
  && rm -rf /var/lib/apt/lists/*
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem install bundler:2.0.2 && bundle install
COPY . /myapp

docker-compose.yml是一个文件。

version: "3"
services:
  # Elasticsearch用のコンテナ
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    volumes:
      - esdata:/usr/share/elasticsearch/data
  # Kibana用のコンテナ
  kibana:
    # elasticsearchとkibanaのimageのバージョン番号を一致させる
    image: docker.elastic.co/kibana/kibana:7.10.1
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
  # Postgres用のコンテナ
  db:
    image: postgres
    ports:
      - 5432:5432
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
  # Rails用のコンテナ
  rails:
    build: .
    command: bundle exec rails server -p 3000 -b '0.0.0.0'
    depends_on:
      - db
      - elasticsearch
    ports:
      - 3000:3000
    environment:
      DATABASE_HOST: db
    tty: true
    stdin_open: true
    volumes:
      # delegatedによって一貫性を捨てパフォーマンスを重視
      - .:/myapp:delegated
# elasticsearchとdbで使うボリューム
volumes:
  esdata:
  pgdata:

Gemfile文件

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.7.2'

gem 'rails', '~> 6.1.0'

Gemfile.lock文件

# 空

创建一个新的 Rails 项目

docker-compose run --rm rails rails new . --force --database=postgresql --skip-test --api

以下是中文的翻译:
选项重点:
– –rm: 一次性使用容器,执行后销毁。
– 在当前目录下创建Rails应用:rails new .
– –database=postgresql:指定使用Postgres数据库。

进行3.数据库配置

我将修改在docker-compose.yml文件中设定的环境变量的值。

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    # ユーザーとパスワードを追加追加
  username: <%= ENV.fetch('POSTGRES_USER') { 'postgres' } %>
  password: <%= ENV.fetch('POSTGRES_PASSWORD') { 'password' } %>

development:
  <<: *default
  database: myapp_development
    # railsコンテナに設定した DATABASE_HOST をホストに設定
  host: &development_host <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
test:
  <<: *default
  database: myapp_test
    # development と同様のホストを設定
  host: *development_host

启动和确认

在构建镜像后,启动并确认每个容器都已经启动。

docker-compose build
docker-compose up

我们不要忘记创建数据库。

docker-compose run --rm rails bundle exec rails db:create

确认Rails

只需提供一种选择的汉语释义为:访问 http://localhost:3000,如果出现以下界面则表示成功。

スクリーンショット 2020-12-30 17.14.07.png

Kibana的确认

访问 http://localhost:5601,若显示以下画面则表示成功。

スクリーンショット 2020-12-30 16.59.14.png

确认ElasticSearch

如果使用Curl命令发送请求,并且得到的响应包含以下的集群和版本信息,则表示成功。

-> $ curl -XGET http://localhost:9200/
{
  "name" : "36e3fc003013",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "9U_MQqxLQ1adh3jHpxEfEA",
  "version" : {
    "number" : "7.10.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
    "build_date" : "2020-12-05T01:00:33.671820Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

请参考

    • 書籍『さわって学ぶクラウドインフラ docker基礎からのコンテナ構築』

 

    • 書籍『Elasticsearch実践ガイド』

 

    • RailsとElasticsearchで検索機能をつくり色々試してみる – その1:サンプルアプリケーションの作成 – Qiita

 

    Elasticsearch + Kibana を docker-compose でさくっと動かす – Qiita

总结

由于现在个人也有了可以利用ElasticSearch的环境,所以我可以开始大量使用了。
虽然对于Docker不太熟悉,但是通过将各种中间件与Rails组合来构建环境,我觉得我的Docker技能也提升了一些。

广告
将在 10 秒后关闭
bannerAds