Torihaji's Growth Diary

Little by little, no hurry.

初心者がrailsアプリをdocker-composeまで使ってdocker化してみた話🐳

はじめに

みなさん、こんにちは。torihaziです。

みなさん、docker使ってますか?

そうです。あの鯨ちゃんです🐳

今回は docker使い始めて1週間弱のこの私が、

タイトル通りのことを実際にやった際の過程になります!

鯨ちゃんすら知らない方は、雰囲気だけでも掴んでいってください!

それでは ltg.

更新 4と5以降

前提環境について

筆者の環境は下記になります。

Docker Desktopが入っていない方はこちらを参照してインストールしてください。

※以前作成した私の記事です。

どうやったの?

  1. 任意のディレクトリに移動して作業ディレクトリを作成する。
  2. 4つのファイルを新規作成し、編集する。
  3. Dockerイメージを作成する。
  4. Dockerイメージから作成されたDockerコンテナを起動する。
  5. 起動したDockerコンテナにおいてrailsアプリを立ち上げる。
  6. データベース周りの設定を記述する。
  7. Dockerコンテナを起動して、webからアクセスする。

この手順を踏むことによって

を使用したrailsアプリのdocker化をします。

文字だけだと少しわかりにくかったかもしれませんが

ここからはターミナルの操作も交えて説明していこうと思います。

実際にやってみて雰囲気を掴んでみてください!

大丈夫、簡単です!!

1. 作業ディレクトリを作成する

rail アプリを作成するためにそれらファイル等を格納するディレクトリを作成する

# cd ~/Documents
# mkdir rails-docker
# cd rails-docker

2. 4つのファイルを作成する

docker化する上で必要な2つのファイルDockerfiledocker-compose.yml

railsで開発を進めるために必要なGemfileGemfile.lockを作成します。

今回はVscodeを使用します。お使いのエディタで作業を進めてください。

次のように編集します。

# Dockerfile の内容(この行より下を記入)
FROM ruby:3.2.2

RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /app
COPY Gemfile Gemfile.lock /app/
RUN bundle install
# docker-compose.yml の内容
# ymlファイルは"タブ"や"改行"に意味があります。
# 上手くいかない場合は正しく記入できているか確認してみてください(この行より下を記入)
version: '3'

volumes:
  db_data:

services:
  db:
    image: postgres:12
    volumes:
      - "db_data:/var/lib/posggresql/data"

  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/app'
    tty: true
    stdin_open: true
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      - 'POSTGRES_PASSWORD=postgres'
    depends_on:
      - db
    links:
      - db
# Gemfile(この行より下を記入)
source "https://rubygems.org"
gem "rails", "~> 7.0.6"

Gemfile.lockは未記入で問題ありません。

3. Dockerイメージを作成する

現時点でのファイル構造は次のとおりです。

# pwd
/Users/hoge/Documents/rails-docker
# ls -l
-rw-r--r--@ 1 hoge  staff  215  2  2 22:35 Dockerfile
-rw-r--r--@ 1 hoge  staff   53  2  2 22:51 Gemfile
-rw-r--r--@ 1 hoge  staff    0  2  2 22:54 Gemfile.lock
-rw-r--r--@ 1 hoge  staff  408  2  2 22:44 docker-compose.yml

下記コマンドを実行してDockerfileとdocker-compose.ymlからDockerコンテナを

立ち上げるために必要なDockerイメージを作成します。

# docker compose build
[+] Building 16.6s (10/10) FINISHED                                                                                 docker:desktop-linux
 => [web internal] load build definition from Dockerfile                                                                            0.0s
 => => transferring dockerfile: 291B                                                                                                0.0s
 => [web internal] load .dockerignore                                                                                               0.0s
 => => transferring context: 2B                                                                                                     0.0s
 => [web internal] load metadata for docker.io/library/ruby:3.2.2                                                                   3.4s
 => [web 1/5] FROM docker.io/library/ruby:3.2.2@sha256:bc2b1b2c5cf0423b9ca12f2c2196c51efa80c8d3d4d0cf01858e67dc2c7136e4             0.0s
 => [web internal] load build context                                                                                               0.0s
 => => transferring context: 194B                                                                                                   0.0s
 => CACHED [web 2/5] RUN apt-get update && apt-get install -y     build-essential     libpq-dev     nodejs     postgresql-client    0.0s
 => CACHED [web 3/5] WORKDIR /product                                                                                               0.0s
 => [web 4/5] COPY Gemfile Gemfile.lock /product/                                                                                   0.0s
 => [web 5/5] RUN bundle install                                                                                                   13.0s
 => [web] exporting to image                                                                                                        0.2s
 => => exporting layers                                                                                                             0.2s
 => => writing image sha256:eb0c31b9a78f090edcb0903c34d6ea2f9858ee4602eff04b9168f5502b6887bb                                        0.0s
 => => naming to docker.io/library/rails-docker1-web

特にエラーがないようなら成功しています。

4. Dockerイメージから作成されたDockerコンテナを起動する。

5. 起動したDockerコンテナにおいてrailsアプリを立ち上げる。

4.5は同時にやります。次のコマンドを実行してください。

# docker compose run web rails new . --force --database=postgresql --skip-bundle
様々なファイルが生成されます。
数分かかる場合があります
終了した場合は下記コマンドで実行結果を確かめてみてください。
# ls -l 
total 64
-rw-r--r--@  1 hoge  staff   215  2  2 22:35 Dockerfile
-rw-r--r--@  1 hoge  staff  2250  2  2 23:05 Gemfile
-rw-r--r--@  1 hoge  staff  5498  2  2 23:05 Gemfile.lock
-rw-r--r--   1 hoge  staff   374  2  2 23:05 README.md
-rw-r--r--   1 hoge  staff   227  2  2 23:05 Rakefile
drwxr-xr-x  11 hoge  staff   352  2  2 23:05 app
drwxr-xr-x@  7 hgoe  staff   224  2  2 23:05 bin
drwxr-xr-x  16 hgoe  staff   512  2  2 23:05 config
-rw-r--r--   1 hoge  staff   160  2  2 23:05 config.ru
drwxr-xr-x   3 hgoe  staff    96  2  2 23:05 db
-rw-r--r--@  1 hoge  staff   408  2  2 22:44 docker-compose.yml
drwxr-xr-x   4 hoge  staff   128  2  2 23:05 lib
drwxr-xr-x   4 hgoe  staff   128  2  2 23:05 log
drwxr-xr-x   9 hoge  staff   288  2  2 23:05 public
drwxr-xr-x   3 hoge  staff    96  2  2 23:05 storage
drwxr-xr-x  12 hoge  staff   384  2  2 23:05 test
drwxr-xr-x   7 hoge  staff   224  2  2 23:05 tmp
drwxr-xr-x   4 hoge  staff   128  2  2 23:05 vendor

先程に比べて様々なファイルが生成されている事がわかります。

このrailsアプリ立ち上げに伴い、Gemfileの内容が更新されたのでビルドしなおして up します。

# docker compose up --build -d

そして http://localhost:3000にアクセスしてみると・・

何やら postgresql に関することでエラーが出ていますね。ctrl + cで止めて。

次の手順でこれを修正します。

6. データベース周りの設定を記述する

先ほどのファイルにおいてdatabase.ymlファイル(19行目付近)を編集します。 パスは/Users/hoge/Documents/rails-docker/config/database.ymlです。

default: &default
  adapter: postgresql
  encoding: unicode
+  host: db
+  user: postgres
+  password: <%= ENV.fetch("POSTGRES_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 } %>

これで接続できるようになったはずです。

7. Dockerコンテナを起動してwebからアクセスする。

一度コンテナを止めて再度コンテナを立ち上げます。

# docker compose down
# docker compose up -d

成功するかと思いきや、

これは下記で解決されます。

docker-compose.ymlを編集します。

  db:
    image: postgres:12
    volumes:
      - "db_data:/var/lib/posggresql/data"
+    environment:
+     - 'POSTGRES_USER=postgres'
+     - 'POSTGRES_PASSWORD=postgres'

postgresqlの環境変数設定について

(Docker hubのPostgresql)https://hub.docker.com/_/postgresを参照すると下記の記述があります。

Environment Variables

The PostgreSQL image uses several environment variables which are easy to miss. The only variable required is POSTGRES_PASSWORD, the rest are optional.

環境変数のうちPOSTGRES_PASSWORDは必須ですよ、それ以外は任意ですという意味です。

公式曰く「みんな忘れやすいからね」だそうです。忘れないであげましょう。

ではdocker を止めて再度実行してみましょう。

# docker compose down
# docker compose up -d

しかし

うーん。なかなか進みませんね。

ただエラーメッセージにYou may need to create your databaseとあるので

下記のコマンドを別ターミナルを立ち上げて実行します。実行時は元のディレクトリに移動してください。

# docker compose run web rails db:create
[+] Creating 1/0
 ✔ Container rails-docker1-db-1  Running                                                                                            0.0s
Created database 'product_development'
Created database 'product_test'

無事に成功したら、 http://localhost:3000にアクセスしてみてください。

お馴染みの画面が出たら成功です。お疲れ様でした。

終わりに

いかがだったでしょうか。

よくあるハウツーの記事はエラー画面を載せない綺麗な記事が多いですが、

意外とエラー画面が多くて、戸惑われた方も多いのではないでしょうか。

railsのエラー画面は赤字でドンと出るので焦る方も多いのではないかと思います。

筆者もその1人です・・・

しかし、このエラーが自分を最も成長させてくれるものだと思っています。

なぜこのエラーが発生したのか、どうしたら解決できるのか。

それらを考えることが回り道なようで、結局一番近道です。

そのためどんどん遠いようで近い道を行きましょう。

私も頑張ります。