WindowsでDocker+Rails(MySQL)環境を作る+便利なツール紹介

## This is 何？

WindowsでDocker+Rails環境を作る手順書と便利なツールの紹介です。
とりあえず動かせるようになるのが目的のため、「Dockerとは」「なぜDockerなのか」や各種コマンドの意味などは省略しています。

基本的にメンティーの方に伝える様に書きましたが、独学で勉強されている方などにも役に立つかもと思って公開しています。
普段はMacを使っており動作確認ができないので、違う箇所があったらコメント欄・編集リクエストにてご指摘ください:bow:
アプリは全て無料で使用できるもののみ載せています。

**環境**

- Windows10 Home(64bit)

**Railsを動かすために入れるもの**

- Docker Toolbox
- Ruby 2.5.1
- Rails5.2.1(mysql8.0.17)

**アプリ開発に便利なツールその1(すぐに役立つもの)**

- Visual Studio Code
- TortoiseGit
- WinMerge

**アプリ開発に便利なツールその2(必要になったらいれるもの)**

- A5:SQL Mk-2
- RLogin
- WinSCP
- PuTTY
- Clibor

## Docker

Windows上で開発を進めるのは少し難しい場合があるので、`Docker`という仮想化技術を使います。
すごく雑に説明すると仮想のLinuxマシンをWindows上に立てる技術です。

WindowsでDockerを使う場合、`Docker for Windows`または`Docker ToolBox`を使います。
`Docker for Windows`には`Hyper-V`という仮想化機能が必要ですが、Windows 10 Homeではこの機能を使えない為`Docker ToolBox`を使います(Proを使っている場合は`Docker for Windows`を使います)。

### 0. CPU仮想化有効の確認

[CPU仮想化が有効になっているか確認](https://qiita.com/KIYS/items/8ac37f6757a6b7f84569)し、無効であれば有効にします。

### 1. Docker Toolboxのダウンロード

[Install Docker Toolbox on Windows](https://docs.docker.com/toolbox/toolbox_install_windows/)からDocker Toolboxをダウンロードします(`Toolbox Releases`のリンクの最新版からexeファイルをダウンロード)
(Legacy desktop solutionって書いてあって悲しい)
(VirtualBox同梱なのすごい)

### 2. Docker Toolboxのインストール

ダウンロードしたファイルを開いてインストーラを起動。
基本的にデフォルト選択のまま進めていって大丈夫です。

### 3. Terminal起動
`Docker Quickstart Terminal`をダブルクリックで開き、しばらく待ちます。
クジラ絵文字が画面に表示されたら下記コマンドを入力して、`Docker version 19.03.1, build 74b1e89`のようなバージョン情報が返ってきたらインストール完了です。

```bash
$ docker --version
```

(`$`は入力しません)

途中[Docker Hub](https://hub.docker.com/)のアカウント作成を求められるかもしれません。
とりあえず今(イメージのPullをするだけ)は不要、またいつでも作れるのでスキップして構いません。

## Ruby & Rails

RubyとRailsをDockerで動かす準備をします。

### 1. Dockerコンテナを作る準備

任意の場所にフォルダを作ります。今回は`c:\projects\rails_practice`に作ったと仮定します。
下記テキストファイルたちを作ります。
(`Dockerfile`と`Gemfile`に拡張子は必要ありません)

```
rails_practiceフォルダ
  - Dockerfile
  - docker-compose.yml
  - Gemfile
  - Gemfile.lock
  - mysqlフォルダ
    - confdフォルダ
      - default_authentication.cnf
```

それぞれ、下記のスクリプトをコピーして保存します。

```Dockerfile:Dockerfile
FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

```docker-compose.yml
version: '2'
services:
  db:
    image: mysql:8.0.17
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "password"
    volumes:
      - ./mysql/volumes:/var/lib/mysql
      - ./mysql/confd:/etc/mysql/conf.d
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      USER: "root"
      PASSWORD: "password"

```

(mysql8.0.17は2019年8月18日現在の最新版)

```Gemfile:Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.1'
```

```default_authentication.cnf
[mysqld]
default_authentication_plugin= mysql_native_password
```

(Gemfile.lockは空で構いません)

### 2. Dockerコンテナのビルド

コマンドプロンプトを開き、下記コマンドを入力します。
(コマンドプロンプトはWindowsキー→`cmd.exe`と入力→Enterキーで立ち上がります)

```bash
$ cd c:\projects\rails_practice
$ docker-compose build
```

`cd`は`Change Directory`の意味、指定ディレクトリ(フォルダ)に移動するというコマンドです。
`docker-compose`コマンドは`docker-compose.yml`ファイルのあるディレクトリに移動して実行します。

### 3. Railsアプリを作る

`rails new`でRailsアプリが作れる準備が整いました。
下記コマンドを実行するとRailsアプリが作成されます。
エクスプローラでフォルダ(`c:\projects\rails_practice`)を開くと、たくさんのファイルが作られているのを確認できます。

```bash
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
```

今回はRailsとデータベースを別々の仮想マシン上で動かしています。
`rails new`で作られる設定ファイルでは同じマシン上で動かすことが想定されているので、設定ファイルを修正します。
また、併せてデータベースのログイン情報を`docker-compose.yml`で指定したものを受け取るように修正します。
`config`フォルダの`database.yml`をテキストエディタで開き、16〜18行目を下記のように修正します。

```yml
# 修正前
  username: root
  password:
  host: localhost
# 修正後
  username: <%= ENV.fetch("USER") %>
  password: <%= ENV.fetch("PASSWORD") %>
  host: db
```

### 4. データベースを作成する

```bash
$ docker-compose run web rails db:create
```

### 5. Railsアプリが立ち上がることを確認する

下記コマンドをコマンドプロンプトで入力します。

```bash
$ docker-compose up
```

ログが表示されたのちに下記のような表示で止まったら無事Railsサーバが立ち上がっています。

```
web_1  | => Booting Puma
web_1  | => Rails 5.2.3 application starting in development
web_1  | => Run `rails server -h` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop
```

Webブラウザを開いて`localhost:3000`とアドレスバーに入力します。
老若男女たちが`Yay! You’re on Rails!`と言っているイラストが表示されたら環境構築は完了です。
おつかれさまでした！
dockerは`Ctrl+C`キーで終了します。

### 6. よく使うコマンド

`docker-compose`コマンドは`$ cd c:\projects\rails_practice`してから入力します。

- Dockerコンテナ上でRailsアプリを立ち上げる  
`$ docker-compose up`
- Railsアプリを終了し、Dockerコンテナを終了する  
`$ docker-compose down`
- Dockerコンテナ上でマイグレーションを行う  
`$ docker-compose run web rails db:migrate`
- `A server is already running.`と言われたら  
`Ctrl+C`キーを入力し、`$ rm tmp/pids/server.pid`を実行して再度`docker-compose up`します。

`docker`コマンド、`docker-compose`コマンドはたくさんあります。
気になった時に調べてみてください。

## 各種ツールその1

プログラミングをするのに便利なツールの紹介です。

### Visual Studio Code(テキストエディタ)

[Visual Studio Code](https://code.visualstudio.com/download)
Microsoftが提供している無料のテキストエディタです。よく`VSCode`と省略されます。
軽量でプラグインも多く、MacとWindows(とLinux)のマルチプラットフォームで提供されています。
同じくMicrosoftが提供している`Visual Studio`は統合開発環境(IDE)で異なるものです。

**プラグインのインストール**

インストールが完了したら`VSCode`を起動します。
一番左側の列に並んでいるアイコン群の中の■が二重になったようなアイコンをクリックすると`EXTENSIONS`と表示されます。ここで各種プラグインを検索してインストールできます。
インストール、アンインストールが簡単にできるので、色々検索して試してみると面白いと思います。

- Bracket Pair Colorizer 2
bracketとは`()``{}``[]`などのかっこのことです。対になっているかっこが色つきで表示されて見やすくなります。

- GitLens — Git supercharged
今カーソルがいる行のGitの履歴を表示してくれるプラグインです。

Ruby、Rails関連のプラグインはたくさんありますが、Windows自体にRubyを入れる必要があるものが多いので、ここには記載しません。
超便利なので、慣れてきたら調べて導入してみるとよいと思います。

WindowsにRubyをインストールする手順は[RailsGirlsの記事](http://railsgirls.jp/install)が詳しいです。

### Git

[Git](https://git-scm.com/download/win)(64-bit Git for Windows Setup)
バージョン管理を行うためのアプリです。
ダウンロードが完了したらインストーラをダブルクリックし、インストールを行います。

### TortoiseGit

[TortoiseGit](https://tortoisegit.org/download/)
GitをGUI(コマンドではなくマウスで扱える画面)で使えるアプリです。
日本語版がいい場合、上記ページ内でスクロールすると`Japanese`があるので、`64bit`版をクリックしてダウンロードします。
ダウンロードが完了したらTortoiseGit本体(TortoiseGit-2.x.x.x-64bit.msi)をダブルクリックしてインストールし、完了後日本語パック(TortoiseGit-LanguagePack-2.x.x.x-64bit-ja.msi)をインストールします。
インストールが完了すると適当なフォルダで右クリックするとTortoiseGitのメニューが表示されるようになります。
設定は手元に環境ができず書けませんが、ひとまず`設定`から自分のGitアカウント(ユーザ名とメールアドレス)を入力しておくとよいと思います。
Gitをコマンド入力で扱いたい場合も、右クリックのメニューから`GitBash`で行えるようになります。

### WinMerge

[WinMerge](https://winmerge.org/downloads/?lang=ja)
ファイルの差分をチェックする際に便利なアプリです。
インストールした時点でおそらく設定されるかと思いますが、されない場合、`TortoiseGit`の設定でこのアプリをデフォルトに設定しておくと`git add`する際の差分のチェックがしやすくなります。

## 各種ツールその2

Webアプリを開発しはじめて、しばらくたって「なんか不便だな」と感じ始めたときに導入するととても便利なツールたちです。

### A5:SQL Mk-2

[公式サイト](https://a5m2.mmatsubara.com/)
Windows用のデータベースクライアントです(軽量・多機能・各種DB対応)。
すごく雑に説明すると、データベースの中身をエクセルのように表形式で確認・問い合わせ・更新できるアプリです。
Vector版、Microsoft Store版どちらでも構いません。わたしは以前Vector版を使っていました(Microsoft Store版がなかったという説もある)。

### RLogin

[公式サイト](http://nanno.dip.jp/softlib/man/rlogin/)
Windows用端末エミュレータです。
すごく雑に説明すると、どこかのサーバに接続する時に使うアプリです。

### WinSCP

[公式サイト](https://winscp.net/eng/docs/lang:jp)
Windows用のFTP、FTPS、SFTPクライアントプログラムです。
すごく雑に説明すると、どこかのサーバに接続してエクスプローラみたいな画面でファイルをアップロード・ダウンロードできるアプリです。

### PuTTY

[公式サイト](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
Windows用端末エミュレータ。
基本的にRLoginで事足りますが、ssh-keygenが同梱されているのが嬉しい。

### Clibor

[公式サイト](https://chigusa-web.com/download/)
クリップボード履歴管理アプリ。
コピーした数個前までの履歴を保存・呼び出しができたり、定型文の登録ができたりするアプリです。

---

以上です。
よいエンジニアリングライフをお過ごしください:tada: