docker上でnestjsとmysqlを接続する
table of contents
- nestjsのアプリケーションを作成する
- localhostで立ち上げる
- nestjsのアプリケーションをdockerniseする
- docker-containerでmysqlを利用する
- typeormを用いてapplicationを接続する
0. 環境
- docker
- nestjs
1. nestjsのアプリケーションを作成する
nest g をコマンドを用いてアプリケーションを作成するため、@nest/cliをインストールします。
$npm i -g @nestjs/cli
成功すると、
$nest --version6.12.9
でインストールされたバージョンが表示されます。
コマンドが利用できる状況になったところで新規のアプリケーションを作成します。
$nest g application my-app
おそらくこんな感じでログが表示されます。
CREATE /my-app/.prettierrc (51 bytes)
CREATE /my-app/README.md (3370 bytes)
CREATE /my-app/nest-cli.json (64 bytes)
CREATE /my-app/package.json (1689 bytes)
CREATE /my-app/tsconfig.build.json (97 bytes)
CREATE /my-app/tsconfig.json (336 bytes)
CREATE /my-app/tslint.json (426 bytes)
CREATE /my-app/src/app.controller.spec.ts (617 bytes)
CREATE /my-app/src/app.controller.ts (274 bytes)
CREATE /my-app/src/app.module.ts (249 bytes)
CREATE /my-app/src/app.service.ts (142 bytes)
CREATE /my-app/src/main.ts (208 bytes)
CREATE /my-app/test/app.e2e-spec.ts (630 bytes)
CREATE /my-app/test/jest-e2e.json (183 bytes)
一応プロジェクトができているかの確認も込めて、現状のディレクトリ構成を確認
$ tree -L 1
.
├── README.md
├── nest-cli.json
├── package.json
├── src
├── test
├── tsconfig.build.json
├── tsconfig.json
└── tslint.json
2. localhostで立ち上げる
1.で作成されたアプリケーションを用いて、依存packageのインストール、local serverの立ち上げを実施します。
プロジェクトディレクトリに移動して、packageのインストールを実施します。
$ cd my-app
$ npm install
次にlocalhostを立ち上げます。
$npm run start:dev
12:52:27 AM - Starting compilation in watch mode...
12:52:35 AM - Found 0 errors. Watching for file changes.
[Nest] 51819 - 2020-01-27 12:52:36 AM [NestFactory] Starting Nest application...
[Nest] 51819 - 2020-01-27 12:52:37 AM [InstanceLoader] AppModule dependencies initialized +19ms
[Nest] 51819 - 2020-01-27 12:52:37 AM [RoutesResolver] AppController {/}: +5ms
[Nest] 51819 - 2020-01-27 12:52:37 AM [RouterExplorer] Mapped {/, GET} route +3ms
[Nest] 51819 - 2020-01-27 12:52:37 AM [NestApplication] Nest application successfully started +3ms
localhost:3000にアクセスすると以下のページが表示されてると思います。
次にdockerniseします。
3. nestjsのアプリケーションをdockerniseする
最初にdokcer-compose fileとDockerfileを追加します。
$touch docker-compose.yml
$touch Dockerfile
特段初期装備レベルなので説明は割愛します。
version:'3.7'services:api-server:build:.tty:truerestart:alwaysports:-'3000:3000'volumes:-type:bindsource:.target:/api-server
FROM node:13.7RUN npm i -g @nestjs/cli
WORKDIR /api-serverCOPY package*.json /api-server/RUN npm i
CMD [ "npm", "run", "start:dev"]
上記の対応で問題ないのですが、一応nodejsのdockerniseにあるので.dockerignoreファイルも追加します。
$touch .dockerignore
node_modules
dist
上記完成するとディレクトリは以下のようになります。
$tree -L 1
.
├── Dockerfile
├── README.md
├── dist
├── docker-compose.yml
├── nest-cli.json
├── node_modules
├── package-lock.json
├── package.json
├── src
├── test
├── tsconfig.build.json
├── tsconfig.json
└── tslint.json
次にdocker-composeでdocker-container内のnest serverを立ち上げます。
$docker-compose up --build
localhost:3000にアクセスすると以下のページが表示されてると思います。
上記のように表示されたら、mysqlのdocker-containerを立ち上げます。
4. docker-containerでmysqlを利用する
docker-containerを追加するため、MySQLを追加していきます。
現状のdocker-compose.ymlはこの通り。
version: '3.7'
services:
api-server:
build: .
tty: true
restart: always
ports:
- '3000:3000'
volumes:
- type: bind
source: .
target: /api-server
あたらしく、serviceにmysqlを追加します。(5.X系統なのはまだtypeormが新しいものに対応していなかったからorz)
version: '3.7'
services:
api-server:
container_name: api-server
build: .
tty: true
restart: always
ports:
- '3000:3000'
volumes:
- type: bind
source: .
target: /api-server
#ここから追記
depends_on:
- db-server
db-server:
container_name: db-server
image: mysql:5.7.29
restart: always
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: develop
MYSQL_USER: develop
MYSQL_PASSWORD: password
#ここまで追記
そして、立ち上げてdocker-container2つがたちあがるか確認します。
$docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64ec79216641 my-app_api-server "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3000->3000/tcp api-server
0bfe9c3bc2e1 mysql:5.7.29 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp db-server
で上記2つのcontainerがたちあがっていることを確認します。
次は、container同士を接続します。
5. typeormを用いてapplicationを接続する
実施するのはこの章のため、公式ドキュメントで対応したい方はこっちの方がいいと思います。
やることは一緒で、
1. TypeORMのinstall
2. TypeORMの有効化
を実施していきます。
5-1. TypeORMのinstall
依存関係のmoduleをinstallします。
$npm install--save @nestjs/typeorm typeorm mysql
5-2. TypeORMの有効化
src/app.module.tsを編集して、TypeORMを有効化していきます。
現状のapp.module.tsは以下です。
import{Module}from'@nestjs/common';import{AppController}from'./app.controller';import{AppService}from'./app.service';@Module({imports:[],controllers:[AppController],providers:[AppService],})exportclassAppModule{}
ここにTypeOrmの設定を追記します。
import{Module}from'@nestjs/common';import{TypeOrmModule}from'@nestjs/typeorm';##ここを追記import{AppController}from'./app.controller';import{AppService}from'./app.service';@Module({imports:[##ここから追記TypeOrmModule.forRoot({type:'mysql',host:'db-server',port:3306,username:'develop',password:'password',database:'develop',entities:[],synchronize:true,}),##ここまで追記],controllers:[AppController],providers:[AppService],})exportclassAppModule{}
これでnestjsとmysqlのdockerniseは終わりです。
個人的にはentity系は毎回いらっとするのでいつかちゃんと書きます。