はじめに
NestJS + PostgreSQL(+ pgAdmin4)の開発環境を、dockerで構築する手順を紹介します。
バージョン情報
-
Docker : 19.03.13
-
Docker Compose : 1.27.4
-
Node.js : 14
-
PostgreSQL : 11.2
-
pgAdmin4 : 4.2
ディレクトリ構成
以下のような構成で作成します。
$ tree -L 2
.
├── api
│ └── Dockerfile
├── app // コンテナ共有ディレクトリ
│ └── [ project directory ]
├── db
│ ├── pgadmin4 // DBサーバ接続永続化用ディレクトリ
│ └── postgres // DBサーバデータ永続化用ディレクトリ
└── docker-compose.yml
Dockerfileの作成
公開されているNode.jsのdockerイメージを使い、PostgreSQLのライブラリを導入します。
ついでにちょっとしたファイル編集用にvimをインストールしておきます。
(主要なファイルは共有フォルダに置くので無くてもよい)
FROM node:14
# share directory
ENV ROOT="/app"
# add path env
ENV PATH $PATH:/usr/local/bin
# set home directory
RUN mkdir ${ROOT}
WORKDIR ${ROOT}
RUN apt-get update && apt-get upgrade -y
# install lib (opt : vim)
RUN apt-get install -y build-essential libpq-dev postgresql-client vim
# install NestJS
RUN npm install -g @nestjs/cli
docker-compose.ymlの作成
NestJSアプリケーションを構成するコンテナ情報を記載します。
データベース操作用にpgAdmin4を入れてますが、端末に既に入ってたり、使用しないのであれば要らないです。
version: "3.7"
services:
api:
build: api
container_name: nest_api
tty: true
ports:
- "3000:3000"
volumes:
- ./app:/app:delegated # share directory
links:
- db
restart: always
db:
image: postgres:11.2
container_name: nest_db
ports:
- "5432:5432"
volumes:
- ./db/postgres/init.d:/docker-entrypoint-initdb.d
- ./db/postgres/pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: root # DB USER
POSTGRES_PASSWORD: root # DB Password
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
hostname: postgres
user: root
restart: always
pgadmin4:
image: dpage/pgadmin4:4.2
container_name: pgadmin4
ports:
- "8000:80"
volumes:
- ./db/pgadmin4:/var/lib/pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: root # pgAdmin Address
PGADMIN_DEFAULT_PASSWORD: root # pgAdmin Password
hostname: pgadmin4
links:
- db
restart: always
postgreSQL(pgAdmin4)に設定しているアドレス、パスワードはrootにしてますけど、そこは各自お任せします。
コンテナを作成&起動する
早速コンテナを作成、および起動します。
docker-compose build
docker-compose up -d
起動後は、一応エラーがないか調べましょう。
(立ち上がらなかったら、原因調査に時間がかなり取られます)
docker ps -a
// 立ち上がってなかった場合、ログを見て原因調査
docker-compose logs
コンテナにログインする
起動後はコンテナにログインし、プロジェクト作成の準備をします。
docker-compose exec api bash
// 以下はログインした後にやってます。作業がやりやすいようにしてるだけなので必須ではないです。
echo 'export LS_OPTIONS='\''--color=auto'\' >> ~/.bashrc
echo 'alias ll='\''ls $LS_OPTIONS -l'\' >> ~/.bashrc
source ~/.bashrc
PostgreSQLに接続できるか確認
一応、ちゃんと設定できているか確認。
psql -h db -U root -d postgres
// rootを入力
Password for user root:
psql (9.6.19, server 11.2 (Debian 11.2-1.pgdg90+1))
WARNING: psql major version 9.6, server major version 11.
Some psql features might not work.
Type "help" for help.
// postgresのテーブルにログインできたら成功
postgres=#
ん?なんか警告出てる。
クライアントとサーバ間のバージョン差異での警告みたい。
警告が出るだけで、特に問題ないからヨシ!
※ ヨシじゃねーだろ!って人は以下のコマンドでアップグレードしてください。
sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-cache search postgresql | grep ^postgresql
// postgresqlのバージョンが増えてるはずなので、対象のパッケージをインストールします。
// サーバ側を11で入れてるのでクライアントも11をインストールします。
apt-get install -y postgresql-client-11
NestJS新規プロジェクトを作成する
コンテナ内でコマンドを発行します。
nest new [ New Project Name]
// npm か yarn どっちを使用するか聞かれるので好みの方を選択する。
NestJS起動
作成したプロジェクトのディレクトリに移動して、NestJSを起動します。
cd [ Project directory ]
// npm
npm run start
// yarn
yarn run start
起動した後は、実際にブラウザで確認します。
localhost:3000
にアクセスします。Hello Worldが表示されていたらOK
おまけ: pgAdmin4の確認
pgAdmin4も接続確認してみます。
localhost:8000
でアクセスできます。
アドレスとパスワードは、docker-compose.ymlに書いたrootで入ります。
ログインすると下記のような画面になります。
サーバを登録するための設定を行います。
Serversを選択した状態で右クリック→サーバの設定を行います。
Connectionタブでホスト名、ユーザ名、パスワードを入力して保存。
最後に
dockerコンテナでNestJSの開発環境を構築しました。
NestJSはAngularに似てるらしいです。
(触ったことがないので私は分かりません。ControllerとServiceはSpringに似てるなぁと思いました)
ここからHTMLを返せるようにするもよし、TypeORMを入れるもよし。
どんどん使っていきましょ〜!