はじめに
みなさん、こんにちは。torihaziです。
みなさん、docker使ってますか?
そうです。あの鯨ちゃんです🐳
今回は docker使い始めて1週間弱のこの私が、
タイトル通りのことを実際にやった際の過程になります!
鯨ちゃんすら知らない方は、雰囲気だけでも掴んでいってください!
それでは ltg.
更新 4と5以降
前提環境について
筆者の環境は下記になります。
- Macbook air M2
- Ventura 13.4
Docker Desktopが入っていない方はこちらを参照してインストールしてください。
※以前作成した私の記事です。
どうやったの?
- 任意のディレクトリに移動して作業ディレクトリを作成する。
- 4つのファイルを新規作成し、編集する。
- Dockerイメージを作成する。
- Dockerイメージから作成されたDockerコンテナを起動する。
- 起動したDockerコンテナにおいてrailsアプリを立ち上げる。
- データベース周りの設定を記述する。
- Dockerコンテナを起動して、webからアクセスする。
この手順を踏むことによって
- ruby 3.2.2
- rails 7.0.8
- postgresql:12
を使用したrailsアプリのdocker化をします。
文字だけだと少しわかりにくかったかもしれませんが
ここからはターミナルの操作も交えて説明していこうと思います。
実際にやってみて雰囲気を掴んでみてください!
大丈夫、簡単です!!
1. 作業ディレクトリを作成する
rail アプリを作成するためにそれらファイル等を格納するディレクトリを作成する
# cd ~/Documents # mkdir rails-docker # cd rails-docker
2. 4つのファイルを作成する
docker化する上で必要な2つのファイルDockerfile
とdocker-compose.yml
と
railsで開発を進めるために必要なGemfile
と Gemfile.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人です・・・
しかし、このエラーが自分を最も成長させてくれるものだと思っています。
なぜこのエラーが発生したのか、どうしたら解決できるのか。
それらを考えることが回り道なようで、結局一番近道です。
そのためどんどん遠いようで近い道を行きましょう。
私も頑張ります。