Dockerでrails環境構築

Dockerの勉強用にDockerでrailsの環境構築をした
環境構築手順をまとめる

# Dockerのインストール

下記URLよりDockerをダウンロードしインストールする．
https://docs.docker.com/get-docker/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717281/78ad2c94-f7cd-cdb2-872c-6d49120ef4e5.png)

インストールされていることを確認する

```
$ docker version                                                                [:|✔ ]
Client: Docker Engine - Community
 Cloud integration: 1.0.9
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:13:00 2021
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:15:47 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

# railsの環境構築

インストールしたDockerを利用して、早速railsの環境を構築する

## 1. 作業用のディレクトリを作る

```
$ mkdir docker_for_rails27
$ cd docker_for_rails27
```

## 2. Dockerfileを作成する

```
$ vi Dockerfile
```

```
# rails2.7.0を指定
FROM ruby:2.7.0
# パッケージインストール
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /docker_for_rails27
WORKDIR /docker_for_rails27
COPY Gemfile /docker_for_rails27/Gemfile
COPY Gemfile.lock /docker_for_rails27/Gemfile.lock
RUN bundle install
COPY . /docker_for_rails27

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# rails起動コマンド
CMD ["rails", "server", "-b", "0.0.0.0"]
```

## 3. Gemfileを作る

```
vi Gemfile
```

```
source 'https://rubygems.org'
gem 'rails', '~>5.2.4'
```

空の`Gemfile.lock`を作成する

```
$ touch Gemfile.lock
```

## 4. entrypoint.shを作る

dockerの初回起動時に実行されるファイル

```
vi entrypoint.sh
```

```
#!/bin/bash
set -e

rm -f /docker_for_rails27/tmp/pids/server.pid
exec "$@"
```

## 5. docker-compose.ymlを作る

```
$ vi docker-compose.yml
```

```
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/docker_for_rails27
    ports:
      - "3000:3000"
    depends_on:
      - db
```

## 6. 作成したファイルをもとに環境を構築する

```
$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bun
```

```
$ docker-compose build
db uses an image, skipping
Building web
[+] Building 77.7s (15/15) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                              0.2s
 => => transferring dockerfile: 559B                                                                                                                              0.1s
 => [internal] load .dockerignore                                                                                                                                 0.1s
 => => transferring context: 2B                                                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/ruby:2.7.0                                                                                                     0.0s
 => [ 1/10] FROM docker.io/library/ruby:2.7.0                                                                                                                     0.3s
 => [internal] load build context                                                                                                                                 5.9s
 => => transferring context: 41.27MB                                                                                                                              5.8s
 => [ 2/10] RUN apt-get update -qq && apt-get install -y nodejs postgresql-client                                                                                16.2s
 => [ 3/10] RUN mkdir /docker_for_rails27                                                                                                                         0.5s
 => [ 4/10] WORKDIR /docker_for_rails27                                                                                                                           0.1s
 => [ 5/10] COPY Gemfile /docker_for_rails27/Gemfile                                                                                                              0.1s
 => [ 6/10] COPY Gemfile.lock /docker_for_rails27/Gemfile.lock                                                                                                    0.1s
 => [ 7/10] RUN bundle install                                                                                                                                   56.1s
 => [ 8/10] COPY . /docker_for_rails27                                                                                                                            0.6s
 => [ 9/10] COPY entrypoint.sh /usr/bin/                                                                                                                          0.1s
 => [10/10] RUN chmod +x /usr/bin/entrypoint.sh                                                                                                                   0.7s
 => exporting to image                                                                                                                                            2.6s
 => => exporting layers                                                                                                                                           2.6s
 => => writing image sha256:ea82de4e78548b8d350390c1146a3b486a8dbc00b196d6e7c98f03570552c517                                                                      0.0s
 => => naming to docker.io/library/docker_for_rails27_web                                                                                                         0.0s
Successfully built ea82de4e78548b8d350390c1146a3b486a8dbc00b196d6e7c98f03570552c517
```

## 7. DBの設定を作成する

```
$ vi config/database.yml
```

```
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: postgres
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: docker_for_rails27_development

test:
  <<: *default
  database: docker_for_rails27_test

production:
  <<: *default
  database: docker_for_rails27_production
  username: docker_for_rails27
  password: <%= ENV['DOCKER_FOR_RAILS27_DATABASE_PASSWORD'] %>
```

## 8. コンテナを起動する

```
$ docker-compose up
```
## 9. DBを作成する
`docker-compose up`した後に別タブで

```
$ docker-compose run web rake db:create
```

# 起動したサーバーにアクセスする

`http://localhost:3000`にアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717281/8a3850a1-ec5f-f1a0-7927-1f522f535e13.png)


# 詰まった部分
`config/database.yml`でhostを設定していなかったため、デフォルトのunix domain socketに接続しようとしてdb:createが出来なかった
=> `host: db`を記載することで解決

その際のエラー

```
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```

# 参考
https://qiita.com/chisaki0606/items/a4b42af5c4735c94057a
https://qiita.com/sagahi/items/ef4b04b5498658bf6210
https://teratail.com/questions/178489