rocky-engineer7の技術日記

webエンジニアを目指して奮闘中!!

【初学者向け】既存プロジェクトをDocker化してみよう!

ゴール

既存のrailsプロジェクトををdocker,docker-composeを使用して 環境構築を行いローカルでwebアプリケーションをブラウザ上で表示する。

※本記事はDockerについての記事のため、LinuxのコマンドとGitコマンドの初歩的なものはご自身で出来るという設定で記載しています。

事前準備

  • ローカルの環境
PC: mac M1チップ Sonoma 14.0
エディタ:VScode
  • 各種バージョン
ruby 3.2.2
Rails 7.0.6
postgresql 12.0
  • docker,docker-composeのインストール

docs.docker.com

手順

1.対象プロジェクトをGithubからクローン(コピー)してくる
2.Dockerfile、doccker-compose.ymlの作成と記述
3.database.ymlファイルの編集
4.コンテナ生成と実行
5.動作確認

全体像としてはこのような流れです。次は各項目の解説していきます。

1.対象プロジェクトをGithubからクローン(コピー)してくる

Github上から対象プロジェクトをクローンするために下記のコマンドを使用します。

git clone <リポジトリパス>

ここからはクローンしてきたディレクトリで作業をします。

2.Dockerfile、docker-compose.ymlの作成と記述

Dockerfileとは?

Dockerfileは、Dockerコンテナの"設計図"のようなものです。このファイルには、コンテナに何をインストールするか、どのように設定するかなど、コンテナを作成するための手順が書かれています。

なぜDockerfileが必要なのか?

Dockerfileを使用すると、コンテナの作成手順を明確にし、それを再利用や共有が可能になります。これにより、同じ環境を再現するのが簡単になります。

Dockerfileは、Dockerコンテナを作るためのレシピのようなものです。このファイルに従って、Dockerはコンテナを作成します。これにより、必要な環境を正確に再現することができます。

docker-composeとは?

docker-composeを使うと、複数のコンテナを簡単に扱えるようになります。そして、その設定はdocker-compose.ymlファイルに書かれています。

docker-composeは、複数のDockerコンテナを一度に管理・実行するためのツールです。一つのコマンドで複数のコンテナを起動・停止できるので、複雑なアプリケーションを簡単に扱えます。

docker-compose.ymlとは?

docker-compose.ymlは、docker-composeがどのようにコンテナを実行するかの設定を書くファイルです。この中に、使用するイメージやコンテナ間のリンク、ポートの設定などが記述されます。

前置きが長くなりましたが下記からDockerfileとdocker-compose.ymlの実際のコードです。

touch Dockerfile

対象プロジェクト直下で上記のコマンドを実行しファイルを作成する。

FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
  build-essential \
  libpq-dev \
  nodejs \
  postgresql-client \
  yarn
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker/
RUN bundle install

エディタを使用し、Dockerfileを上記のように記載します。 下記に一行ずつの解説を記載していきます。


  1. FROM ruby:3.2.2

    • ベースをRubyのバージョン3.2.2を使うように指定しています。
  2. RUN apt-get update && apt-get install -y \

    • システムを最新の状態に更新してインストールするようにします。インタラクティブ(対話的)な質問に対しては、全てYESで答えるように-yオプションをつけています。
  3. build-essential \

    • 必要な基本的なツールを取り込んでいます。
  4. libpq-dev \

    • PostgreSQL(データベース)とやり取りするためのツールをインストールしています。
  5. nodejs \

    • JavaScriptを使うためのツール、Node.jsをインストールしています。
  6. postgresql-client \

    • PostgreSQLのクライアントツールをインストールします。これにより、コンテナからPostgreSQLサーバに接続できます。
  7. yarn

    • JavaScriptのライブラリを管理するツール、yarnをインストールしています。
  8. WORKDIR /rails-docker

  9. COPY Gemfile Gemfile.lock /rails-docker/

    • GemfileRubyのツールリスト)をコンテナに移しています。
  10. RUN bundle install

    • Gemfileに書かれているツールを全てインストールしています。

このDockerfileは、Ruby on Railsアプリケーションを動作させるためのDockerコンテナを作成するための設計図です。必要なツールやライブラリをインストールし、アプリケーションの依存関係をセットアップしています。

docker-compose.ymlの記述

以下のコマンドでdocker-compose.ymlを作成します

touch docker-compose.yml

作成したdocker-compose.ymlをエディタで編集していきます。

version: '3'

volumes:
  db-data:

services:
  web:
    build: .
    command: bash -c "rails db:migrate && rails s -p 3000 -b '0.0.0.0'"
    ports:
      - '3000:3000'
    volumes:
      - '.:/rails-docker'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db
  db:
    image: postgres:12.0
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'DATABASE_PASSWORD=postgres'
      - 'POSTGRES_HOST_AUTH_METHOD=trust'

webdbという2つのコンテナを動かすための設定です。
webRailsアプリケーション、dbPostgreSQLデータベースを表しています。
こちらも一行ずつ解説していきます。


  1. version: '3'

    • Docker Composeのバージョンを3に指定しています。
  2. volumes:

    • ボリューム(データを保存する場所)の設定。
  3. db-data:

    • db-dataという名前のボリュームを作ります。
  4. services:

    • サービス(動かすコンテナの設定)を定義します。今回の場合だとwebとdbが該当します。
  5. web:

    • webという名前のサービスを設定します。Railswebサービスと、後述のPostgreSQLのdbサービスの2つのコンテナが起動します。
  6. build: .

    • 現在のディレクトリのDockerfileを使ってイメージをビルドします。
  7. command: bash -c "rails db:migrate && rails s -p 3000 -b '0.0.0.0'"

    • コンテナが起動したときに実行するコマンドを指定します。今回はrailsのアプリなので、Railsアプリケーションのデータベースに関連するマイグレーションを実行するためのコマンドが成功した後にRailsアプリケーションをローカルサーバーで起動するためのコマンドを実行するように記載しています。
  8. ports: - '3000:3000'

    • ポートのマッピングを設定し、ホストの3000番ポートをコンテナの3000番ポートに繋げます。
  9. volumes: - '.:/rails-docker'

  10. environment:

  11. - 'DATABASE_PASSWORD=postgres'

    • データベースのパスワードを設定します。
  12. tty: true

    • 出力を見やすくします。
  13. stdin_open: true

    • 標準入力をオープンします。
  14. depends_on:

    • コンテナの作成順序の設定です。 depends_on: -dbは、Postgresのコンテナが起動してからRailsのコンテナを起動するという意味です。
  15. links: - db

    • webサービスはdbサービスとリンクされます。
  16. db:

    • dbという名前のサービスを設定します。
  17. image: postgres:12.0

    • 使うイメージをpostgresのバージョン12.0に指定します。
  18. volumes:

  19. - 'db-data:/var/lib/postgresql/data'

    • db-dataボリュームをコンテナの指定の場所にマッピングします。
  20. environment:

  21. - 'POSTGRES_USER=postgres'

    • PostgreSQLのユーザー名を設定します。
  22. - 'DATABASE_PASSWORD=postgres'

    • データベースのパスワードを設定します。
  23. - 'POSTGRES_HOST_AUTH_METHOD=trust'

    • 認証方法をtrustに設定します。

2.database.ymlファイルの編集

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db
  user: postgres
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>

development:
  <<: *default
  database: rails-docker_development

test:
  <<: *default
  database: rails-docker_test

production:
  <<: *default
  database: rails-docker_prod

今回はdocker-composer.ymlで設定した内容をもとに、database.ymlのデフォルトでは記述されていないhost username passwordを追記しています。

  host: db
  user: postgres
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>

3.コンテナの生成と実行

下ごしらえが完了したので、dockerのコマンドを使ってrailsの環境を構築していきます。

  • イメージの作成
docker-compose build
  • DB作成
docker-compose run web rails db:create

※docker-compose run の後はサービス名を指定しないとNo such servicesのエラーが出るので、サービス名の指定は忘れずに...。

  • コンテナの作成と起動
docker-compose up 

これでrailsアプリをDocker化する手順は以上です。

※今回はdocker-compose.ymlのcommandにrails db:migrate && rails s -p 3000 -b '0.0.0.0'を記述しているので,db:createのみrunしています。

4.動作確認

docker compose psrails serverが動いてるのを確認し ローカルに接続し、ブラウザにて画面が正しく表示されれば無事終了です。

おわりに

今回dockerを学んでみて最初はやること書くこと多すぎ!とかなり混乱していたのですが、少しづづ慣れていって無事既存のrailsプロジェクトをdocker化することができました。 教材を見返しながら一つずつやっていたのでかなり時間はかかりましたが、docker化の便利さがとともよく分かるいい機会でした。 まだまだdockerについては初学者程度の知識しかないので、使いこなせるようにたくさんハンズオンをしていきたいと思います。