Docker-composeを使い、PostgreSQLに接続するNodeJsアプリケーションの環境構築方法を説明します。
また、Dockerで難しい永続化されるファイル、されないファイルの違いを確認する事も出来ます。
成果物は以下の通り。手っ取り早く確認したい人もこちら
https://github.com/fushihara/docker-pgsql/tree/qiita-1
linuxで以下のコマンドを入力
$ git clone https://github.com/fushihara/docker-pgsql.git
$ cd ./docker-pgsql
$ git checkout qiita-1
$ docker-compose up -d
その後、対象マシン上で以下のURLを開く http://localhost:20006/
サーバー部分はnodejsのexpress、アクセスログはpostgresqlを使用しています。サーバー部分はcronで定期的なジョブが実行されています。ファイル永続化の部分はdocker-compose.ymlでvolumesの項目の指定方法の違いです。
最終的なDocker関連のファイルは以下の通り
docker-compose.yml
version: '2'
volumes:
vl:
driver: 'local'
services:
pgsql_aaa:
build: ./pgsql/
restart: always
nodejs_xxx:
build: .
ports:
- "20006:20006"
volumes:
- /usr/src/sample-node/node_modules
- .:/usr/src/sample-node
- /usr/src/volume-a/
- vl:/usr/src/volume-b/
depends_on:
- pgsql_aaa
restart: always
Dockerfile
FROM node:8.5.0
ENV TZ=Asia/Tokyo
ENV APP_ROOT /usr/src/sample-node
RUN groupadd -g 500 ec2-user && useradd -g ec2-user -u 500 --create-home ec2-user
COPY . $APP_ROOT
RUN chown -R ec2-user:ec2-user $APP_ROOT
RUN mkdir /usr/src/volume-a && chown -R ec2-user:ec2-user /usr/src/volume-a
RUN mkdir /usr/src/volume-b && chown -R ec2-user:ec2-user /usr/src/volume-b
USER ec2-user
WORKDIR $APP_ROOT
RUN npm install
ENTRYPOINT ["npm","start"]
docker-compose.ymlでのpgsql_aaa
やnodejs_xxx
はdocker ps
等で識別しやすくするための表記です。
Volumeについて。
- /tmp/test.txtは設定ファイルに記載が無いので、Dockerで何も指定しない場合の挙動となります。
- /usr/src/volume-a/test.txt は
docker-compose.yml
で/usr/src/volume-a/
とだけ指定されています。正直、この場合は何も指定していない/tmp/test.txtとの違いが分かりませんでした。(ハイライトしていませんが、すぐ上の/usr/src/sample-node/
では指定する意味があります) - /usr/src/volume-b/test.txtは
docker-compose.yml
でvi:/usr/src/volume-b/
と書かれており、viというのは別の箇所でも指定されています。この表記ですと、上記の二つよりデータが消える場合が少なくなります。データボリュームの名前が固定されるので、コンテナを作り直してもデータが引き継がれます。
最低限これさえ把握していれば、自分で作る分の簡単なツールは不自由なく作れると思います