【Docker】【Ruby on Rails】初学者向け－頻出コマンドについて

前提
・windows
・環境はDocker使用
・フレームワークはRuby on Railsを使用

本記事はDocker環境を使用してRuby on Railsの開発を行った際に頻出したコマンドと
その内容についてまとめています。

## Dockerについて

### Docker
…アプリケーションを「コンテナ」と呼ばれる軽量な仮想環境で実行することができる。
　これによって環境の違いなどに依存しない動作が保証される。
 「Dockerイメージ」という、依存関係・設定情報等すべて含むパッケージを使用して、
 　任意の環境で「コンテナ」を作成し、実行することができる。

  （※個人的にですが「コンテナ」はサーバなどといった実行環境という認識でいます。）

  開発・テスト・運用環境で同じDockerイメージを使用することで、環境依存の問題を減らすことができる。

  （※まとめると、軽いうえに環境に依存しない超効率的なやつ。）

## Ruby on Railsについて

### Ruby on Rails
…アプリケーションをモデル・ビュー・コントローラーに分けてコードの保守性・再利用性を高める
　MVCアーキテクチャに基づいているRubyのフレームワークのこと。
 「設定より規約」が原則となっており、多くのデフォルト設定が提供され、
 　利用者がコーディングに集中できる環境が整いやすい。

  Railsの名の通り、ある程度レールに沿って開発を効率的に進めることができる。
  （※　まとめると、実は裏で色々設定やらなにやらやってくれているやつ。）

---------------------------------------------------------------------------

#### 【Dockerを用いた開発において使用頻度が高かったコマンド】

・**Dockerファイルを用いてイメージをビルドするコマンド**
　→**Dockerファイル**は、Dockerイメージを構築するための設定ファイルのこと。
 　　Dockerイメージを作成する際に必要な指示が記述されており、
  　　アプリケーションの環境構築を自動化することができる。
  　（例えばrailsのbundle install等のコマンドも、Dockerファイルに記載しておけば、
  　　下記コマンド実行時に一緒に実行される。）
```
　　docker compose build
```
---------------------------------------------------------------------------


・**docker-compose.ymlファイルに定義された複数のサービスを一括で起動するためのコマンド**

　いわゆるサーバ起動のコマンドのようなもの

```ruby
docker compose up 
docker compose up -d # ログ表示なし・バックグラウンドでのサーバ起動
docker compose up --build # コンテナを実行する前に強制的にDockerイメージを再ビルドする
```
-----------------------------------------------
・**docker composeを使用して管理しているサービスを止めるコマンド**

```ruby
# アプリケーションを停止したいが、再起動する予定がある場合に使用する
docker compose stop

# アプリケーションのすべてのサービスを停止し、関連するリソースを削除する
docker compose down
```
-----------------------------------------------
・**docker-composeを使用して管理されているコンテナの状態を確認するためのコマンド**
いわゆるサービスが起動しているかどうかの確認が行えるコマンド
```ruby
docker compose ps
```
このコマンドを実行すると以下のように表示される。起動中のサービスがあればSERVICE列で「Up」と表示される
```ruby
NAME                   IMAGE                COMMAND                   SERVICE   CREATED         STATUS         PORTS
rails-practice-db-1    mysql:8.0            "docker-entrypoint.s…"   db        2 weeks ago     Up 6 seconds   3306/tcp, 33060/tcp
rails-practice-web-1   rails-practice-web   "sh -c 'rm -f tmp/pi…"   web       7 seconds ago   Up 5 seconds   0.0.0.0:3000->3000/tcp
```

-----------------------------------------------
・**デバッグを行うときのコマンド**
１.rubyのbinding.pryやbyebugなどといった処理を止めるデバッグツールの記載を行う
２.docker compose up でコンテナが起動している状態で、新しいターミナルを開き
　下記コマンドを入力する。
```ruby

# この<サービス名>箇所はdocker compose psコマンドを使用して表示されたwebのサービス名を記載する
docker attach <サービス名>

# 例
docker attach  rails-practice-web-1 
```
３.処理を止めたい画面を動かす→画面が止まる
４.docker attachを行ったコンテナ内で処理を止めた箇所を確認でき、デバッグを行うことができる


docker attachの状態から抜け出す方法は２通り
①：docker attachしたコンテナで「Ctrl + p + q」
（VSCode等はすでにCtrl + pを用いたショートカットが割り当てられている場合があるため、設定を変更する必要がある）
②：起動しているコンテナの停止（docker compose stop または docker compose down）

-----------------------------------------------
#### 【Dockerコマンド + Railsコマンド】
Dockerのコンテナ内でRailsのコマンドを直接実行するとエラーになってしまうので、
以下DockerとRailsを使用した開発の中で頻出したコマンドをまとめておきました。

・**Railsコンソールの起動**
```ruby
docker compose exec web rails console
```

-----------------------------------------------
・**DBの作成**
```ruby
docker compose exec web rails db:create
```

-----------------------------------------------
・**DBのマイグレーション**
```ruby
docker compose exec web rails db:migrate
```

-----------------------------------------------
・**新しいRailsアプリケーションの作成**

```ruby
# databaseの箇所はpostgresqlとしているが、任意のDBを設定して良い
docker compose run web rails new . --force --database=postgresql
```
-----------------------------------------------
・**ジェネレーターの実行**
モデル・コントローラー・マイグレーションを作成するジェネレータコマンド
```ruby
# 下記はPostという名前のモデルを作成し、その中にtitleという文字列型のカラムとbodyというテキスト型のカラムを追加するというコマンド内容
docker compose exec web rails generate model Post title:string body:text
```