【Node.js express Docker】 Dockerを用いてNode.js Express MySQLの環境を構築する

前回の記事で作ったdockerファイルを整理した内容です。

【Node.js】 Dockerを用いてNode.js Express MySQLの環境を構築するまでの道のり
https://qiita.com/sho_U/items/0ef3dfc7b07b5e13fa18

####インストールするパッケージ
"cookie-parser"
"debug"
"ejs"
"express"
"express-generator"
"express-session"
"express-validator"
"http-errors"
"morgan"
"nodemon"
"sequelize"
"sequelize-cli"

#最初に用意するパッケージ

![3e7f3d04-aa97-f566-5af4-b0473d2d6c59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/ec13034d-374c-3e53-ee4c-18529d142a2c.png)




###app.env
```app.env
MYSQL_SERVER=mysql
MYSQL_USER=（ユーザー名）
MYSQL_PASSWORD=（パスワード）
MYSQL_DATABASE=(データーベース名)
```
###docker-compose.yml:
node.jsコンテナとmysqlコンテナを管理するyml

```docker-compose.yml
version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: (アプリ名)_db_container
    env_file: ./mysql/mysql.env
    environment:
      - TZ=Asia/Tokyo
    ports:
      - '3306:3306'
    restart: always
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d/:ro
      - mysqldata:/var/lib/mysql
    networks:
      - container-link

  app:
    build: .
    container_name: (アプリ名)_app_container
    env_file: ./app.env
    environment:
      - TZ=Asia/Tokyo
      - DEBUG=app:*
    tty: true
    ports:
      - '3000:3000'
    restart: always
    volumes:
      - ./src:/app
    working_dir: /app
    command: npm start
    networks:
      - container-link
    depends_on:
      - mysql

#使用するネットワークを作成。docker-composeの場合service以下の名前を使って名前解決されるため、appとmysqlが自動的に接続される。
networks:
  default:
    external:
      name: bridge
  container-link:
    # これが作成されるネットワーク名（同名がなければ自動生成される）
    name: docker.internal

volumes:
  mysqldata:

```
###Dockerfile:
アプリケーション用(node.js)コンテナを作るためのfile

```dockerfile.
FROM node:12
WORKDIR /app
```

###my.conf:
（コンテナ側の/etc/mysql/conf.d/に配置される。)

```mysql/conf/my.conf
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqldump]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
lower_case_table_names=1

# Enable access from the host machine.
bind-address=0.0.0.0
```

###mysql.env

```mysql/mysql.env
MYSQL_ROOT_HOST=%
MYSQL_ROOT_PASSWORD=（ルートパスワード）
MYSQL_USER=（ユーザー名）
MYSQL_PASSWORD=（パスワード）
MYSQL_DATABASE=(データーベース名)
```



###src:
アプリケーション本体(空ディレクトリ)

###package.json:
初期は空

```package.json(空）
{}
```





##アプリケーション用のコンテナを作成する

コンテナをビルドする。

```ホスト.
docker-compose build
```

```ホスト.
#コンテナを一時的に起動（--rmで停止後削除する。コンテナ起動後、bashに入る）
docker-compose run --rm app /bin/bash
```

```コンテナ.
# express-generatorでアプリケーションのひな形を生成
npx express-generator --view=ejs
```

package.jsonに必要なパッケージを記載（必要に応じて追加）

```package.json
{
  "name": "アプリ名",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "nodemon ./bin/www"
   //nodemon用起動scripts
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "ejs": "^3.1.5",
    "express": "~4.16.1",
    "express-generator": "^4.16.1",
    "express-session": "^1.17.1",
    "express-validator": "^6.7.0",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "mysql2": "^2.2.5",
    "nodemon": "^2.0.6",
    "sequelize": "^6.3.5",
    "sequelize-cli": "^6.2.0"
  }
}
```

```コンテナ.
#インストール
npm install

#sequelizeの初期化
npx sequelize-cli init

#config migrations models seeders　が作成される。
```
src/config/config.json　の設定

```config.json
{
  "development": {
    "username": "root",
    "password": "（ルートパスワード）",
    "database": "(データベース名)",
    "host": "mysql",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}
```


```コンテナ.
#コンテナを抜ける（この仮コンテナは削除される)
exit
```
※この時、コンテナは削除されるが

```docker-compose.yml
    volumes:
      - ./src:/app
```
この記述により、.(docker-compose.ymlがあるディレクトリ。つまりnodoDockerディレクトリの配下のsrcディレクトリにマウントされているため、ホスト側のsrcディレクトリに作成した雛形は残っている。

コンテナを起動させる

```host.
docker-compose up
```

```docker-compose.yml
    command: npm start
```
の記載により、コンテナ起動後、自動的にExpress.jsのアプリケーションがnodemonで起動する。
http://localhost:3000/
で確認。

mysqlコンテナに入れるか確認

ターミナルを別タブで立ち上げ

```
docker exec -it コンテナID bash
mysql -uroot -p
```



完成ディレクトリ

![3add417823b27ebe6d9e5a536e15a2c9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/3cc42c93-1601-77be-b344-45b109ee5130.png)

git initialize

```アプリフォルダ.
git init

touch .gitignore

echo 'node_modules/' > .gitignore
```