使用Docker Compose对Rails项目进行Docker化
本文介绍了使用Docker Compose将现有的Rails项目容器化的步骤。
什么是Docker Compose?
Docker Compose是一种工具,用于定义多个Docker容器并便捷地启动、停止和连接它们。
在开发、测试和部署由多个组件构成的应用程序(如Rails项目)时,Docker Compose非常方便。
通过将每个组件作为单独的容器处理,可以轻松构建开发环境、调试、测试和顺利部署到生产环境。
前提条件 (Qian ti tiao jian)
-
- 确认Docker和Docker Compose已安装完毕
- 确保有准备好的Rails项目(GitHub上)
将Rails项目Docker化的步骤流程
-
- 创建项目的克隆
-
- 创建用于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 } %>