使用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应用程序文件夹的根目录下。

スクリーンショット 2023-10-02 12.38.20.png

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构建容器环境的配置说明。
初次设置可能会有些繁琐,但只需设置一次后,之后只需键入命令即可轻松完成环境设置。
我希望您能参考本文并尝试实践。

广告
将在 10 秒后关闭
bannerAds