Express+PostgreSQL+SequelizeをDockerで構築してみる【前編】

#前説

将来的にはフロントエンドはVue、バックエンドはExpressのような構成を目指します。
まずはバックエンドでExpress+PostgreSQL+Sequelizeでの環境構築です！

#①Dockerでコンテナ動作まで

##初期ファイル構成
```
-Dockerfile
-docker-compose.yml
-app
|-- package.json
```

##Dockerfile

```:Dockefile
# イメージ指定
FROM node:latest

# 環境変数設定
ENV NODE_ENV="development"

# 作業ディレクトリ作成&設定
WORKDIR /src

COPY ./app /src

RUN npm install
```

##docker-compose.yml

ここでNode.jsのExpress(サーバーサイド)コンテナの構造とDBコンテナの構造を設計します。

- ポート番号は5432が一般的です。
- Volumesではコンテナを破棄しても、データを永続化できます。その為データをコンテナ外に保存します。

```yml:docker-compose.yml
version: '3'
services:
  app:
　　# Dockerfile保存場所
    build:
      context: ./  
    depends_on:
      - database
    image: n-app
    #volumes設定
    volumes:
     - "./app:/src"
    # コンテナ名
    container_name: n-app
    # ポート接続
    ports:                          
      - 3000:5000
    environment:
      PORT: 5000
      DB_USER: postgres
      DB_HOST: database
      DB_PORT: 5432
      DB_NAME: mydatabase
    tty: true

  database:
    image: postgres:12.3
    volumes:
      - ./init-sql:/docker-entrypoint-initdb.d:ro
    environment:
      POSTGRES_DB: mydatabase
      TZ: "Asia/Tokyo"
      POSTGRES_HOST_AUTH_METHOD: trust
```

##package.json

自分用です。
Volumesを設定することにより、コンテナ上でInstallしたパッケージもホスト上・コンテナ上にも保存されます。コンテナを破棄した場合もVolumesを設定することにより、package.jsonをもとに'npm install'で破棄したコンテナの環境を復元できます。

- scripts内では"node 〇〇"のコマンドの'〇〇'の部分を設定します。 
現状./bin/wwwはExpressの雛形ファイルを生成しないと作成されませんので、注意が必要です。

```json:app/package.json
{
  "name": "myapp",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "ejs": "~2.5.7",
    "express": "~4.16.0",
    "http-errors": "^1.6.3",
    "morgan": "~1.9.0",
    "nodemon": "^2.0.4",
    "pg": "*",
    "sequelize": "^6.3.5",
    "sequelize-cli": "^6.2.0"
  }
}
```

自分は以下のサイトを参考にしました。
以下のサイトの方のgithubからcloneして、必要な情報を追加しました。
あらかじめExpressのテンプレートが整っていたので、大変便利でした。

https://qiita.com/tamoco/items/caffca436546a1a5fcc8

ではDockerを使ってコンテナを動かしましょう。

```:Terminal
$ docker-compose build

Building app
Step 1/5 : FROM node:10.12
 ---> a2b9536415c2
Step 2/5 : ENV NODE_ENV="development"
 ---> Using cache
 ---> 40f981aef1ce
Step 3/5 : WORKDIR /src
 ---> Using cache
 ---> ec233d742a63
Step 4/5 : COPY ./app /src
 ---> Using cache
 ---> 88f269307e53
Step 5/5 : RUN npm install
 ---> Using cache
 ---> b22a8c36f08e

$ docker-compose up -d

$ docker-compose ps

      Name                     Command              State           Ports
----------------------------------------------------------------------------------
n-app               node                            Up      0.0.0.0:3000->5000/tcp
ta-app_database_1   docker-entrypoint.sh postgres   Up      5432/tcp

$ docker exec -it n-app bash

root@f195575a066f:/src# 
```

上記のところで構築したコンテナに入ることができました。

#②Express環境構築

ExpressとはNode.js上で動作するWebアプリのMVC型フレームワークです。
自分の場合は偉大なる先人様のリポジトリからCloneしたため、あらかじめExpressの雛形が揃っていました。

Expressの雛形を生成したい場合はこんな感じでしょうか。

```
# npm install express-generator -g

1. viewをpugファイルで作成したい場合(Default)
# express --view=pug myapp

viewをejsファイルで作成したい場合
2. express -e myapp 
```

#次回
https://qiita.com/rockguitar67/items/0020d734201632077cb5

#参考文献

Docker-Expressの構築
https://qiita.com/tamoco/items/caffca436546a1a5fcc8

https://gitlab.com/tamoco-mocomoco/study-docker-compose/-/tree/master/app/routes

https://qiita.com/yoshiplum/items/129e7ad1ffc3a02b9eb2

Docker-Volumesについて
https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32