Windows×Rails6でDockerを使えるようにする ③Dockerで環境制作編

記事のレベル; ★★★☆☆

はじめに

Windows × Rails6でDocker desktop for Winsowsを使用できるようにすることを目指すにあたって、今回はDockerでバッチリ環境を作っちゃいます!

↓の続きです

Windows×Rails6でDockerを使えるようにする ②Docker Desktop for Windows導入編

環境

Windows 10 home
Docker for Windows

前提

・OSがWindows 10 home(バージョン2004, OSビルド19041.264以上)であること!
・WLS2が使用可能であること!
もしまだだったら→ http://main-website.com/blog/2020/11/04/wls2/
・Docker for Windowsがインストール済であること!
もしまだだったら→ http://main-website.com/blog/2020/11/05/docker-desktop-for-windows/・Railsチュートリアル終わらせた程度の知識

目標

1, Railsでおなじみのこのファイル群を生成すること

UnGOChan bin bundle rails rake setup spring update config vendor .gitignore config. ru docker-compose.yml Dockerfi'e Gemfile Gemfile.lock Rakefi'e README.md

2, ブラウザ上で、この見慣れた画面に行くこと。

uo αι,ι10Α

 

方法

用意するもの

 

dockerで環境構築するには

dockerfile

docker-compose.yml

Gemfile

Gemfile.lock

が必要です。

ファイルを作る

PCのどこでもいいですが、とりあえずRailsを構成するファイル群をダウンロードするためのフォルダを作成しましょう。

ここではローカルディスク(C:)直下に作成しようと思います。

エクスプローラーを開いてローカルディスク(C:)をクリックし、

自分の作りたいアプリ名を冠したフォルダを作りましょう。

 

ここに上記の

dockerfile

docker-compose.yml

Gemfile

Gemfile.lock

の4つを入れていきます。

Gemfile, Gemfile.lock

・Gemfile

・Gemfile.lock

は、Dockerを使おうが使わまいがRailsを立ち上げる時に必要なファイルです。

これらのファイルはメモ帳で作れます。(普通に何らかのエディタで作れます。)

●Gemfile

ここに書かれたGem (Railsのライブラリ)がインストールされることになります。

メモ帳を開いて以下を記述しましょう

source 'https://rubygems.org'                                     #ここからRailsの色々なものを仕入れてくるよ~ってやつ
git_source(:github) { |repo| "https://github.com/#{repo}.git" }   #Gitつかいたいよ~ってやつ
#Rubyのバージョンを指定したかったら下記追加、最新版でいいや~って人は特に記述する必要ないです。 #をはずしてください
#ruby '2.6.6'
gem 'rails', '~>6'                                                #Railsは6系統使いたいよ~ってやつ

Etc» source 'https: //rubygems.o gem 'rails', ' 'ô'

でOKです。

メモ帳を使っている場合はファイルの保存時に「全てのファイル」を選んで

Gemfile.

という名前で、↑で作ったフォルダに保存しましょう!

エディタで保存する時は

Gemfile
でOKです。
因みにdockerfileとか、Gemfileとかは拡張子が無いですが、ファイルの保存時に全てのファイルを選んで、ファイル名の最後に「.」をつけると拡張子なして保存できます。
d コ 、 「 ! f ⅱ 「 フ ァ イ ル の 種 類 ( 新 : す べ て の 万 イ ル に つ 文 字 コ ー ド ( 日 : ^ フ ォ ル ダ - の 非 表 示 訂 F ・ 日 保 存 キ ャ ン セ ル

 

それと、Gemfileのバージョンの書き方は

・何も書かなければ、最新のバージョンのgemになります。

 

・2.0.0

みたいに書くと、そのバージョンになります。

 

・>= 2.0.0     

 みたいに書くと、2.0.0以上のバージョンになります。

 

・>= 2.0.0, < 3.0.0

みたいに書くと 2.0.0以上、3.0.0未満のなかで最新版になります。

 

・~> 2.0.0       

 みたいに書くと 2.0.X の中でXが最新になるバージョンになります。(2.0.9が最高)

 

だから gem 'rails', '~>6' は6.X.Xの中で最新のものってことになる訳です!

 

 

●Gemfile.lock

これは、空でいいです。
GemfileでインストールしたGemを記録するためのファイルですから。

こんな感じで、フォルダ内にぶち込めばOK!

普通にここで、rails new (Rails構成ファイル群をダウンロード)してからDockerfileとかを入れてもOKですが、先にDocker関連のファイルを作りましょう。

 

Dockerfile

docker-fileはこんな感じで良いと思います。

Dockerの内部にいろんなものをインストールするためのコマンドを書いていく感じです。

これもメモ帳使う人は

メモ帳に以下を記述して、「Dockerfile.」の名前で保存してください。
普通にエディタ使ってたら、「Dockerfileでいいです!」

FROM ruby:2.6.6           #rubyのバージョンを指定する。バージョン分からんかったらターミナルでruby -vで確認 *1

# mariaDBインストールしたり、nodejsをインストールしたり(rails6のwebpackerのために)するコマンドをRUN(発動)
RUN apt-get update && \
apt-get install -y mariadb-client nodejs vim --no-install-recommends && \
rm -rf /var/lib/apt/lists/*

#yarnをインストール(rails6のwebpackerのために)

RUN curl https://deb.nodesource.com/setup_12.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update && apt-get install -y yarn

 #自分の好きな名前で!というか自分のアプリ名でOK, その名前のディレクトリをmkdir(ディレクトリ作成)
RUN mkdir /Myapp 

#自分の好きな名前で!というか自分のアプリ名でOK, その名前のディレクトリに移動する感じ 
WORKDIR /Myapp

# ↑で作った自分のpc内のフォルダの中に入れてるGemfileと、Gemfile.lockをDockerの内部のMyappディレクトリにGemfile, Gemfile.lockとしてコピー
#ちなみに、Myappの部分は自分のアプリ名に変更やで
ADD Gemfile /Myapp/Gemfile
ADD Gemfile.lock /Myapp/Gemfile.lock

# bundelerのインストール + bundle installでgemを入れまくる、「docker内で!」。これはDocker使わなくても必要な作業ですね!
RUN gem install bundler
RUN bundle install

ADD . /Myapp

・DockerファイルはDockerのコンテナを作成した時に発動するコマンドとかを記述するためのファイルです。

↑で出てきたコマンドの紹介

FROM
ベースイメージです。ここではruby:2.6.6を指定

RUN
コマンドの実行
コンテナ作成した時に発動する感じです。

ADD
ローカル内の(自分のpcの中身の)ファイル・ディレクトリをコンテナ内にコピーする。

WORKDIR
ディレクトリの移動。
cd xxxみたいな感じ

Rubyのバージョンが分からなければ
powershellかコマンドプロンプトで
アプリの有る場所に行って (C直下に置いてる人は cd C:\Myapp で行けるはず)

ruby -v

とうてば、rubyのバージョンが出てくる。

こんな感じで。

ここまでは何となくこんな感じな理解で良いと思います!

docker-compose.ymlファイル

これも同様に用意していきます。
Dockerの各コンテナに関する情報をここに記述していく感じです。

version: '2'
services:

#データベースについての情報を書く

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "4306:3306"

#自分のアプリについての情報を書いていくappはwebでもいい ← 名前ただの名前なのでサービス名はなんでもいい。

  app:
    tty: true
    stdin_open: true
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/lingochan
      - bundle:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
      - chrome

#将来的にRspecを使うなら...クロームあったほうが良いかも

  chrome:
    image: selenium/standalone-chrome:latest
    ports:
      - 4444:4444

#データを保存しておく場所

volumes:
  mysql-data:
  bundle:

みたいな感じで良いと思います!

versionは2で書いています。
3とかもありますが、2にしたからと言って特段劣るわけでもないので2で
ドンキーコングも2が一番面白いのでいいでしょう!
db: について
データベースのコンテナ作るよって感じ・今回はMySQLを使っていく感じで想定しています。・Docker内のMySQLのパスワードとかユーザ名は決まっていて、それぞれ、passwordとrootってことになってる。・volumesはコンテナ消した時にデータが消し飛ぶので、そのデータを残しておく場所。・portは別に- "3306:3306"とかでも別にok(データが出入りする入口詳しくはggrks)
app: について
・これは自分のアプリケーションであるMyappを入れるコンテナ。
・tty: trueにしておけば binding.pry(デバグに便利)を使えるので是非
・他はそのままでOK
まあそんな感じでOKです。
イメージとしてはこんなかんじっすね。
W→windows
L→Linux
D→Dcoker

いよいよコマンドを打っていく

Rails newする

powershellかコマンドプロンプトで自分のアプリのディレクトリに移動(cd xxxxxxで移動)する
(ここでは C:\Myapp)

docker-compose run app rails new . --force --database=mysql

って打ったら必要なファイルが生成される。

→目標1達成!

docker-compose run app rails new . –force –database=mysql

 

ですが

・docker-compose
はdocker内でやってくださいねコマンド

・run
新規でコンテナ組み立てるでコマンド

・app
自分のサービス名 docker-compose.ymlでこの部分をweb:にしてたらweb

・rails new
これはRails始める時のおまじない。docker使ってなくてもRailsを立ち上げるときに使うやつ。大量のファイル、ディレクトリがインストールされるやつ

・–force
強制的に。なにがあっても絶対実行するマン

・–database=mysql
データベースとしてmysqlつかうで!

という感じです

イメージをビルド

次はpowershellとかコマンドプロンプトにてRailsイメージのビルド実行コマンド

docker-compose build

って打つ。

イメージをつくりますが、5分とか10分くらい余裕でかかってしまいます。
ので、じっくり待ちましょう。

ちなみに
docker-compose build
はイメージを構築するコマンドですね。

MySQLの設定する

docker-compose.ymlでMySQLの設定はしましたが、あれはDockerの内部にMySQL用のコンテナを立てるための仕様書みたいなものでした。

今回は、RailsがどのMySQL(データベース)を使うかを設定するためのマニュアルを作っていく感じです。

 

そのマニュアルはconfig/database.ymlになります。

Rail newで生成されたフォルダの中にconfigがあると思います。さらに、その中にあるdatabase.ymlを編集していきます。

power shellまたはコマンドプロンプトで

エディタをインストールいている人は

(エディタ名) config/database.yml

で開くはずです。

筆者は、atom config/database.ymlでした。

エディタをまだインストールしていないよって人は

notepad config/database.yml

で編集モードに入ります。 *notepadの使いかたは下の方に簡単にまとめておきます。

passwordlocal hostをそれぞれ

password: password

host: db

に変更してください。

 

これは先述のとおり、docker内部にあるMySQLのデフォルトのホスト名がDB, パスワードがpasswordというようになっているからです。

この設定を行うことで、Railsは
Rails「ワイはhostがdbを参照ね、名前のユーザーネームがrootでパスワードがpasswordね!OK」
ってなってDockerの内部のDBを参照できるようになる訳です。

ちなみに、
default云々は全環境共通の設定
developmentは開発環境で参照するDB
testはテスト環境で参照するDB
productionは本番環境で参照するDBって感じです。
で、
<<: *default
は細けぇことはdefault見ろよ!ってことです。
あ、DBはデータベースってことです。ドラゴンボールではないです。

docker-compose up

 

コンテナ実行するコマンドをうちましょう

docker-compose up -d
・docker-compose up
を打つことで、コンテナが立ち上がり、ます。
また、

rails s

は不要となります!

-d
をデタッチドモード(バックグラウンド)で処理してよってコマンドです。
– dなしの普通の docker-compose up をしてみると分かりますが、powershellやコマンドプロンプトのようなターミナルが操作不可になります。(ターミナル2つ使えば解決なんですけど)
それを防ぐ効能があります。

起動しているかの確認

起動しているコンテナを確認するには、ターミナルに

docker-compose ps

を打ちましょう。
IDとかコンテナ名とかいろいろ出てきたら、起動しています。

因みに、起動してないコンテナ含めて確認する時は、
docker-compose ps -a
で見れますよ!

データベースについて

今度はDBを立ち上げていきましょう(筆者はここで1週間くらい無駄に沼ったんですけど…)

結論から言うと、

docker-compose run app rails db:create #appの部分は自分のサービス名(docker-compose.ymlでappだったらapp, webにしてたらweb)

もちろん下のような書き方でもOKです。

docker-compose run app bundle exec rake db:create

(筆者はとち狂ってたので、ここでひたすらrails db:createを打ちまくってて前に進まなかった。Railsチュートリアルの印象が強すぎてdocker-composeが頭になかったんです!)

docker-compose dockerのコンテナ内部でやるよ

run 新規でコンテナ作ってその中で処理するよ

app docker-compose.ymlでのサービス名

・rails db:create Railsでデータベース立てる時のいつものやつ

ブラウザへGO!

Google Chromeとかのブラウザを開いて、url欄に

http://localhost:3000

って打ったら、

いつものhello rails画面になります!

これで、ブラウザ上で自分のサイトが見られるぞ!

→目標2の達成

ipアドレスについて

因みに、

docker-machine ip default

でipアドレスを確認できます。

http://<確認したIPアドレス>:3000 #<確認したIPアドレス>に値を代入<>も消して代入

これでもOKです。

bundle install

powershell, コマンドプロトでbundle installする。

docker-compose exec app bundle install #appの部分は自分のサービス名(docker-compose.ymlでappだったらapp, webにしてたらweb)

docker-compose dockerのコンテナの内部で処理しますよ。

exec 実行しますよ!
★runとの違いは
・runは新規でコンテナを作って実行しますよ!
・execは既存のコンテナで実行しますよ!

bundle install Gemfileに記述したgemをインストールする

こんな感じ。

これでローカルでの開発環境は整った。

docker-compose exec app bundle installできないよ~

上記のコマンドを打っても

ERROR: No container found for app_1

ってなって進まない人は

dockerのコンテナが起動していない可能性ありです。

docker ps -a
を打つと

CONTAINR IDみたいなのが出てくると思います。

なので、

docker start <CONTAINR ID> #<>に値を代入

してdockerをスタートしてから、再度試してください。

それか、tmp/pids/server.pidsが残っていたら消す。

これで解決です。

notepadでの処理

MySQLの設定のために、config/ database.ymlを編集する訳ですが、エディタがなくてもwindowsならnotepadで編集できますよというお話。
まず、とりあえずnotepadはターミナルでファイル編集できる優れもの的な解釈で良いと思います。

とりあえず、ターミナルにて

notepad config\database.yml

Windowsのメモ帳のノリで編集できます!
上記のように

username: root
password: password
host: db

に変更しておきましょう!

編集し終わったら、Ctrl+sで保存して×印を押して消しましょう!

MySQLの所に戻る

両声類講座⑤ 風邪と女声