将Web应用程序(Docker)化的方法(Rails)
首先
这次将GitHub上的现有Rails项目进行了Docker化,所以我写了一篇文章包括了自己的输出。
Docker是一种应用程序,通过使用容器虚拟化技术,让团队成员能够共享相同的开发环境和执行环境。
据说在现代开发环境中,最近的技术中经常使用到Docker,因此它已成为必备知识。
我参考了Docker官方日本文档来编写大致的代码。
将应用程序容器化
我們將把Rails應用程式進行Docker化。
在現有的Rails應用程式上創建新文件。
-
- Dockerfile
- docker-compose.yml
编辑确认文件
-
- Gemfile
- database.yml
Gemfile:装有Ruby项目所需要的gem库的清单文件。
这次我要使用Rails,所以我会确认一下Ruby的版本以及与之兼容的Rails版本。
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "3.2.2"
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.0.6"
.
.
.
根据我发现的信息,我知道这个应用程序的 Ruby 版本是 3.2.2,因此我将在 Dockerfile 中使用它。
Docker文件
FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
nodejs
RUN mkdir rails-docker
WORKDIR /rails-docker
COPY . Gemfile Gemfile.lock /rails-docker/
RUN bundle install
-
- FROM: ベースとなるdocker imageを指定する。Docker hubを確認すればlinuxも導入されていることがわかる
-
- RUN: コマンドを実行
-
- WORKDIR: dockerfileでコマンドを実行する際基準となるdirを指定。
-
- なかったら作成される。
- COPY: docker内へホストのファイルをコピーする。
和COPY类似,ADD是一种DSL,但ADD主要用于压缩解压tar文件。
因此,在将主机的文件或目录添加到Docker文件系统时,基本上使用COPY。
docker-compose.yml文件
docker-compose.yml文件描述了如何启动容器。
docker-compose.yml具有类型。
versinon: 'n'
services:
service_name1:
service_name1のパラメータ
service_name1のパラメータ
.
.
service_name2:
service_name2のパラメータ
service_name2のパラメータ
.
.
-
- version: ここのnにはdocker-composeのバージョンについて記述する
- services: サービスとはアプリケーションとして実行したいコンテナのこと。でservicesはその一覧のこと
这次我们的描述如下所示。
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/myapp
command: >
/bin/sh -c "rm -f /tmp/pids/server.pid &&
rails db:migrate &&
bundle exec rails s -p 3000 -b '0.0.0.0' "
environment:
- 'DATABASE_PASSWORD=postgres'
depends_on:
- db
links:
- db
tty: true
stdin_open: true
db:
image: postgres
environment:
- 'POSTGRES_USER=postgres'
- 'POSTGRES_PASSWORD=postgres'
build: . ビルドするビルドコンテキストを指定する。今回はカレントディレクトリを指定
ports:
– “3000:3000”
ポートの割り当てを指定します。ホストのポート番号 : コンテナのポート番号
volumes:
– .:/myapp
ホストのdirとコンテナのdirを共有するために使われる ホストdir : コンテナdir あくまでファイルはホストにある
command: >
/bin/sh -c “rm -f /tmp/pids/server.pid && rails db:migrate && bundle exec rails s -p 3000 -b ‘0.0.0.0’”
/bin/sh -c "rm -f /tmp/pids/server.pid"
当启动开发用的web服务器时,会将信息写入到server.pid文件中,并且当文件中存在信息时,会判断服务器处于启动状态。因此,为了避免错误,我们在启动服务器时会删除server.pid文件。
在启动Rails服务器之前,必须创建数据库并进行数据库迁移。
rails db:create → → rails db:migrate
只需在每次启动时创建一次,无需每次启动时都进行创建,因此将此处用于记录数据库同步和服务器启动的初始化操作。
environment:
– ‘DATABASE_PASSWORD=postgres’
コンテナ内で使用される環境変数の設定。
depends_on:
– db
サービスの依存関係を定義するために使用
links:
– db
webとdbが通信できるようにする。
tty: true
stdin_open: true
docker run -itと同義。
数据库配置文件.yml
default: &default
adapter: postgresql
encoding: unicode
host: db
user: postgres
port: 5432
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 } %>
port : 5432はPostgreSQLのTCPポート番号
password : 接続する際に使用するパスワード
pool : DBに接続するコネクションプールの上限数。
コネクションプールとは、DBの接続情報を維持しておく機能。
开启
创建图像文件
docker-compose build
我将创建一个数据库。
docker-compose run --rm web rails db:create
将进行DB反映和服务器启动。(执行.yml文件中的描述内容)
docker-compose up -d
用浏览器打开http://localhost:3000/。
这样就完成了Rails的Docker化
停下来
暂时停止时
docker-compose stop
再次启动之后就不需要运行rails db:create了。
docker-compose up -d
当完全停止时
docker-compose down
在下线后重新启动时,需要从Rails db:create开始。
是的。
结束
我认为之所以Docker能做到这一步,是因为Udemy的课程很不错。我推荐它。
如果有任何错误,请您指正,将不胜感激。