将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的课程很不错。我推荐它。

 

如果有任何错误,请您指正,将不胜感激。

广告
将在 10 秒后关闭
bannerAds