Railsアプリの開発で使ったDockerコマンド集

# 概要

普段から開発環境はDockerを使っていて、
仕事でよく使うDockerコマンドをまとめました。

:::note info
**前提**
- Railsアプリケーション・データベース・バックグラウンドプロセス（例: Webpackerなど）がそれぞれ独立したDockerコンテナで稼動
:::


### 【基本】コンテナの作成・起動・停止・削除
まずは、基本的に使うコマンドから。[コンテナID]は「`docker ps`」から確認できます
| コマンド | 役割 | 
|:-:|:-:|
| docker build [コンテナID]  |  コンテナの作成 |  
| docker start [コンテナID]  |  コンテナの起動 |  
| docker compose up  | コンテナの作成・起動 |   
|  docker stop [コンテナID] | コンテナの停止 |
| docker rm [コンテナID] |  コンテナの削除 |

### バックグラウンド上でコンテナの作成・起動
`-d`のオプションはデタッチド・モードと言います。
バックグラウンド上でコンテナを立ち上げるモードです。これをつけずに「`docker compose up`」をすると、ログがサウナで流れる汗のように出てきます。

```
$ docker compose up -d
```
これが何だかんだ1番使ってるコマンドかもしれません。

### 動いているコンテナの一覧を表示 
`compose up` などで起動した現在稼働中のコンテナ一覧を表示。
コンテナID（CONTAINER ID ）やコンテナ名（NAMES）を確認したい時によく使うコマンド

 ```
 $ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED        STATUS              PORTS                   NAMES
c3f279d17e0a   nginx              "/docker-entrypoint.…"   3 hours ago    Up 3 hours          0.0.0.0:80->80/tcp      webserver
4e5021d210f6   mysql:5.7          "docker-entrypoint.s…"   2 days ago     Up 24 hours         3306/tcp, 33060/tcp     mysqldb
 ```

### 存在するコンテナの一覧を表示
- 動いているコンテナと停止しているコンテナの一覧を表示します

ここで「STATUS」の欄が「Exited」になっていたら存在はしているけど停止しているコンテナ。
下記の1番下のCONTAINER ID「5a0f2d3c9e5a」のコンテナとかがその例になります。
```
$ docker ps -a
CONTAINER ID   IMAGE              COMMAND                  CREATED        STATUS              PORTS                   NAMES
c3f279d17e0a   nginx              "/docker-entrypoint.…"   3 hours ago    Up 3 hours          0.0.0.0:80->80/tcp      webserver
4e5021d210f6   mysql:5.7          "docker-entrypoint.s…"   2 days ago     Up 24 hours         3306/tcp, 33060/tcp     mysqldb
5a0f2d3c9e5a   my-rails-app       "/bin/bash"              12 hours ago   Exited         0.0.0.0:3000->3000/tcp  my-rails-container
```

### railsコンテナの中に入って、`rails c`でコンソールを叩きたい


```
## railsコンテナの中に入る
$ docker compose exec -it [railsコンテナID] bash

## railsコンソールを開く
$ bundle exec rails console
```

### railsコンテナの中で、`binding.pry`でデバッグをしたい時
rails使っている人なら大体知ってると思うので、binding.pryの説明は省略します。

```
$ docker attach [railsコンテナ]

## この後にrailsのログが流れる
## binding.pryの書かれている箇所の画面に遷移したりすると、以下のように処理が止まって、デバッグできる

   3: def index
   4:   @tweets = Tweet.all
=> 5:   binding.pry
   6: end

  [1] pry(#<TweetsController>)>
```


### railsコンテナのルーティングを確認したい時

```
## railsコンテナの中に入る
$ docker compose exec -it [railsコンテナID] bash

## railsコンソールを開く
$ bundle exec rails routes
```

### seedファイルからテストデータを作りたい時
```
## railsコンテナの中に入る
$ docker compose exec -it [railsコンテナID] bash

## railsコンソールを開く
$ bundle exec rails db:seed
```


### railsコンテナで`bundle install`したい時
Gemfileを更新したら実施する
```
docker compose exec rails bundle install
```

### データベースのテーブル構造を確認したい時

```
## DBコンテナの中にはいる
$ docker compose exec -it [DBコンテナID] bash

$ mysql

$ show databases;
##ここでmysqlで管理しているデータベースがずらっと出てくる

$ use [確認したいデータベース名];

$ show [確認したいテーブル名];

```


# 余談
1年前くらいは「railsコンテナの中に入る」という意味がわからないくらいDockerを使えてませんでしたが、今は割とサクサク使えるようになってきました。

何が言いたいかというと、「Docker意味分からん」っていう人も実務でガシガシ使わざるを得ない環境に1年くらいいると良い感じに使えるようになってると思います。


# 終わりに
「こんなDockerコマンドもRailsアプリの開発でよく使うよ！」
「そのコマンド、ちょっと違うかもよ？」などの意見がありましたら、
編集リクエスト・コメントどしどしお待ちしてます :bow: