記事のレベル; ★★★☆☆
はじめに
Windows × Rails6でDocker desktop for Winsowsを使用できるようにすることを目指すにあたって、今回はDockerでバッチリ環境を作っちゃいます!
↓の続きです
Windows×Rails6でDockerを使えるようにする ②Docker Desktop for Windows導入編
環境
Docker for Windows
前提
・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でおなじみのこのファイル群を生成すること
2, ブラウザ上で、この見慣れた画面に行くこと。
方法
用意するもの
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系統使いたいよ~ってやつ
でOKです。
メモ帳を使っている場合はファイルの保存時に「全てのファイル」を選んで
Gemfile.
という名前で、↑で作ったフォルダに保存しましょう!
エディタで保存する時は
Gemfile
それと、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
↑で出てきたコマンドの紹介
FROM
ベースイメージです。ここではruby:2.6.6を指定
RUN
コマンドの実行
コンテナ作成した時に発動する感じです。
ADD
ローカル内の(自分のpcの中身の)ファイル・ディレクトリをコンテナ内にコピーする。
WORKDIR
ディレクトリの移動。
cd xxxみたいな感じ
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:
みたいな感じで良いと思います!
3とかもありますが、2にしたからと言って特段劣るわけでもないので2で
ドンキーコングも2が一番面白いのでいいでしょう!
データベースのコンテナ作るよって感じ・今回はMySQLを使っていく感じで想定しています。・Docker内のMySQLのパスワードとかユーザ名は決まっていて、それぞれ、passwordとrootってことになってる。・volumesはコンテナ消した時にデータが消し飛ぶので、そのデータを残しておく場所。・portは別に
- "3306:3306"
とかでも別にok(データが出入りする入口詳しくはggrks)・これは自分のアプリケーションであるMyappを入れるコンテナ。
・tty: trueにしておけば binding.pry(デバグに便利)を使えるので是非
・他はそのままでOK
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の使いかたは下の方に簡単にまとめておきます。
passwordとlocal 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見ろよ!ってことです。
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のメモ帳のノリで編集できます!
上記のように
password: password
host: db
に変更しておきましょう!
編集し終わったら、Ctrl+sで保存して×印を押して消しましょう!