Docker基本操作、Railsプロジェクトの作成（MacOS）

自分用の作業メモとして残します。
（Markdownはあとで修正）

## 開発環境
| Tool           | Version     |
|:---------------|:------------|
| MacOS(Ventura) | 13.0        |
| Docker         | 20.10.23    |
| Ruby           | 2.6.4       |
| Rails          | 6.0.0       |

## Docker
### Dockerとは
Dockerは、仮想環境を提供するオープンソースソフトウェアです。
設定の容易さや起動の速さなどの理由により、開発者の間でとても人気があります。
Dockerでは、個々の仮想環境をコンテナと呼びます。
コンテナの内容はDockerfileと呼ばれるテキストファイルで記述されます。
このファイルがあればさまざまなOS上でコンテナを復元できます。

- Docker Hubのアカウントを取得し、ログインしてインストーラをダウンロードして使用します。

### Docker Composeとは
Dockerを用いてRailsアプリケーションを開発したり、production環境で動かすとき、RubyアプリケーションとDBサーバーを別々のコンテナとして構築するのが一般的です。
Docker Composeはこれらの複数のコンテナをまとめて起動・停止するためのツールです。
コマンド一つ実行するだけで、Webアプリケーションを構成するすべてのコンテナ群が動作します。

### Dockerの基本操作
Dockerは２つのコンテナを使用します。
１つではRailsアプリケーションが動き、もう一つではRDBMSのPostgreSQLが動きます。
前者のコンテナをweb、後者のコンテナをdbと呼びます。


```terminal:バージョン確認
$ docker --version            # Dockerバージョン確認
$ docker-compose --version    # Docker-composeのバージョン確認
```

```terminal:Rails開発用コンテナ群の構築
$ git clone https://github.com/oiax/rails6-compose.git
$ cd rails6-compose
$ ./setup.sh
```

```terminal:コンテナ群の起動、動作確認
$ docker-compose up -d           # -dは、コンテナをデーモンとして動かすためのもの
$ docker-compose ps              # プロセス状態の確認
$ docker-compose images          # imageのリスト表示
$ docker volume ls               # volumeのリスト表示
$ docker network ls              # networkのリスト表示
```

```terminal:コンテナ群の停止
$ docker-compose stop            #PC電源を落とす前にコンテナ群を停止してください
```

```terminal:webコンテナにログイン
$ docker-compose exec web bash
$ rails --version                #Railsのバージョンを確認
$ exit                           #webコンテナをログアウト
```

## Railsプロジェクトの作成

```terminal:rails new
$ rails new test-project -d postgresql --skip-test-unit
 # -d postgresql・・データベースにPostgreSQLを指定。
 # --skip-test-unit・・テストフレームワークとしてTest::Unitの代わりにRSpecを使用するので、Test::Unit関連の生成を省略
```

### Gemfileの修正とbundle install
```terminal:Gemfile修正と適用
$ vim Gemfile       # インストール対象のgemとバージョンを記入
$ bin/bundle        # 適用（bundle installと同じ動作です）
```

### データベースのセットアップ設定と作成
- データベースのconfigです。
- 適切な設定をしないとデータベースとの接続が出来ません。
```terminal:config/database.ymlの編集
$ vim database.yml       # 編集してインストール対象のgemとバージョンを記入
```

- webコンテナで次のコマンドを実行すると、データベースが作成されます。
```terminal:開発環境（development）のデータベース作成方法
$ bin/rails db:create    # データベースの作成
```
```terminal:本番環境（production）のデータベース作成方法
$ bin/rails db:create RAILS_ENV=production    # データベースの作成
```

## hostsファイルの設定
```terminal:/private/etc/hosts（macOS）
127.0.0.1  example.com  project.example.com  # ループバックにホスト名1,2を設定し名前解決
#(loopback) (ホスト名1)  (ホスト名2)

# Dockerの仮想マシン上で動作するRailsアプリケーションに、
# 特定のホスト名でアクセスする必要があるためホスト名を設定する
```

### Blocked Hostsの設定
```rb:config/initializers/blocked_hosts.rb（新規作成）
Rails.application.configure do
  config.hosts << "example.com"
  config.hosts << "project.example.com"
end
```

### web-consoleの設定
web-consoleはRailsアプリケーションのデバッグツール。
初期状態では127.0.0.1からのアクセスしか受け付けないようになっているため、
Docker環境でrailsアプリケーションを動かして、ホストOS側のブラウザでアクセスするとweb-consoleは応答しない。
この問題を回避するため、config/environmentディレクトリにあるファイルdevelopment.rbを以下のように書き換える。
```rb:config/environments/development.rb
# （中略）
# 以下を最終行に追加
  config.web_console.whitelisted_ips = [ "127.16.0.0/12" ]
end
```

## Webアプリケーションの動作確認
webコンテナ側でrailsアプリケーションを起動します。
```terminal:railsサーバの実行(開発環境)
$ rails s -b 0.0.0.0
```

```terminal:railsサーバの実行(本番環境)
$ rails s -e production -b 0.0.0.0
```

アプリケーションサーバを起動後、ブラウザを起動しhostsで設定したホスト名1、2のURLでwebサーバにアクセスできるか確認する。
```terminal:ブラウザでhostsに設定したURLでアクセスする
http://example.com:3000
          or
http://project.example.com:3000
```
→「Yay! You're on Rails!」が表示されたら問題なし
また、ターミナルにログが表示されるのでこちらも確認する

## Dockerの基本操作
docker-compose upで作られたものを一括削除する
```terminal:一括削除
$ docker-compose down --rmi all --volumes
```
削除されたかを確認しよう