使用Docker将现有的Rails应用程序容器化
终点坪
在已经安装了Docker和Docker Compose的PC上,使现有的Rails应用可以在本地进行复现,而不受个人PC环境的影响。
事前准备
- 以下の環境にてローカルで動作確認済みのrailsアプリ
ruby 3.2.2
Rails 7.0.6
postgresql 12
- docker,docker-composeのインストール
操作步骤
1. 创建和编写Dockerfile和docker-compose.yml文件
2. 编辑database.yml文件
3. 生成和运行容器
4. 进行操作确认
我会按顺序解释。
创建和编写Dockerfile、docker-compose.yml文件。
在这里,我们将创建并描述Dockerfile和docker-compose.yml,作为生成容器的准备工作。
请将上述内容视为创建容器的设计蓝图。
请将创建的文件放在Rails应用程序文件夹的根目录下。

Dockerfile文件的描述
Dockerfile是一种类似于创建原始Docker映像的设计文档。
基于现有的Docker映像,可以安装软件包或修改文件来创建新的映像。
本例中,我们将描述如何运行Rails应用程序。
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /rails-docker
WORKDIR /rails-docker
ADD Gemfile Gemfile.lock /rails-docker/
RUN gem install bundler
RUN bundle install
ADD . /rails-docker
// ※rails-dockerは今回のrailアプリが配置されているディレクトリ名を指しています。
docker-compose.yml文件的描述
Docker Compose是一种用于自动化构建和执行多个容器的工具。docker-compose.yml是包含了构建和执行步骤的文件,借助这个文件,只需执行少量命令即可启动多个容器。本次我们将按以下方式进行描述。
version: '3'
services:
db:
container_name: rails-docker-db
image: postgres:12
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- postgresql-data:/var/lib/postgresql/data
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/rails-docker
ports:
- "3000:3000"
depends_on:
- db
volumes:
postgresql-data:
driver: local
我将逐一解释上述出现的单词。
服务
在services中定义运行的容器。由于本次将对Postgres和Rails进行容器化,为了方便理解,我们将它们命名为”db”和”web”。
图像
指定一个要使用的图像,并构建容器。
如果是针对数据库,我们使用postgres ver12,并在其中描述其内容。对于Web应用程序,我们在Dockerfile中使用上述信息进行构建,并创建相应的图像。
环境
設定Postgres相關的環境變數。
您可以自行決定使用者ID和密碼。
卷 –
volume是在容器中可以永久保存生成的数据的功能。
例如,对于这次的Postgres,我们将其容器化并保存了数据。
然而,如果删除了这个Postgres容器,其中保存的数据也会一并被删除。
因此,我们使用volume来将数据也保存在本地。
通过使用volume,即使删除了容器并重新启动了一个新的容器,也可以在保持上一次数据的状态下使用系统。
保存volume的方法可以大致分为两种:
第一种是通过挂载想要保存的目录的方式,
第二种是通过使用带有命名的volume的方式。
本次,Rails 將使用一種方法來掛載第一個欲保存的目錄,
而 Postgres 則使用另一種方法使用第二個命名卷。
首先,关于Rail的体积部分描述如下。
volumes:
- .:/rails-docker
在上述情况下,volumes: 表示要同步的本地目录和容器目录。
本次使用的rail应用rails-docker是根据docker-compose.yml文件来查找的,因此要同步的本地目录可以用”.”(表示当前目录)来表示,
以下是使用以下命令的方式。
web:
build: .
在容器中,会生成rails-docker的文件,所以将想要与容器同步的目录指定为/rails-docker。这样,当容器启动后,如果在本地的rails-docker目录下编辑文件,容器中的文件也会被更新。
然后,Postgres使用了第二个命名卷的方法。这种方法在本地创建了一个命名卷,并将容器指定的目录保存在其中。
如果使用命名的卷,volumes: 会表示为 – volume name: 要在容器中保存的目录。这次,我们将卷名设为postgresql-data,并指定容器中要保存的目录为Postgres的数据存储位置/var/lib/postgresql/data。结果,
volumes:
- postgresql-data:/var/lib/postgresql/data
这个写法是指的是,在版本(version:)和服务(services:)下方同一层级的段落中,在volumes:下方写入卷的名称,并明确它是一个有命名的卷。
volumes:
postgresql-data:
driver: local
命令
设置容器启动时要执行的命令。
本次执行的命令如下:
command: bundle exec rails s -p 3000 -b '0.0.0.0'
一旦启动容器,同时在容器内执行 bundle exec rails s 命令,即可启动Rails服务器。
通过参数 -p 3000 -b ‘0.0.0.0’,将端口号设置为3000,并允许通过localhost(0.0.0.0)在浏览器中进行访问。
依赖于
在创建容器的顺序设置上,depends_on:- db 表示需要等待 Postgres 容器启动后再启动 Rails 容器。
编辑database.yml文件。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: postgres
# 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-compose.yml中设置的内容进行描述。
生成和执行容器
在此之前的工作已经准备好了。
只需要按照下面的命令执行,Rails容器环境的建立就完成了。
- イメージの作成
docker-compose build
- コンテナの作成と起動
docker-compose up -d
- DB作成
docker-compose run web rails db:create
- migrate実行
docker-compose run web rails db:migrate
完成了将Rails应用程序进行Docker化的步骤。
動作驗證
最后,通过运行`docker compose ps`确认Rails服务器正在运行中,
连接到本地并在浏览器中正确显示页面,即表示完成!!
最后一句
这次我们进行了关于使用Rails的docker构建容器环境的配置说明。
初次设置可能会有些繁琐,但只需设置一次后,之后只需键入命令即可轻松完成环境设置。
我希望您能参考本文并尝试实践。