搭建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,如果出现以下界面则表示成功。
Kibana的确认
访问 http://localhost:5601,若显示以下画面则表示成功。
确认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技能也提升了一些。