node プロジェクトの docker image をつくってみる。

社内でAWS ECS を使うことになったが、そもそも dokcer image を作ったことがなかったので
調べてみた。

目次

  1. node プロジェクトの用意
  2. Dockerfile の作成と build
  3. image からコンテナ起動
  4. docker-compose 起動

1. node プロジェクトの用意

typescript & Express を利用した簡単な web サーバを用意する。 port 番号で 3000 で起動して、localhost:3000/api に HTTP GET リクエストするとslack に通知がくるものだ。

フォルダ構成は以下の通り

.
├── __test__
├── jest.config.js
├── node_modules
├── nodemon.json
├── package-lock.json
├── package.json
├── src
└── tsconfig.json

2. Dockerfile とコンテナイメージの作成

alpine という軽量 Linux ディストリビューションを利用する。 この上に nodejs と npm をインストールし、ローカルで開発した node プロジェクトを含めるようにする。そして、npm installnpm startを起動させている。

touch Dockerfileでカレントディレクトリにファイルを作成して次の通り記述する。

Dockerfile

FROM alpine:latest

# instal llatest nodejs and npm
RUN apk add --update nodejs nodejs-npm

# make entry directory
RUN mkdir myapp
WORKDIR /myapp

# copy localfile to images
ADD src/ src/
ADD nodemon.json .
ADD package.json .
ADD tsconfig.json .
RUN npm set progress=false && \
  npm install
CMD npm start

npm set progress=falseは本質的ではないので、なくてもよい。
これはnpm installの進捗報告を出力しない設定で起動を速くしているために記述している。

Dockerfile があるディレクトリから以下を実行する
docker build -t tsweb .

-t オプションはイメージに名前をつける。tag の略称だ。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tsweb               latest              1a656139af79        6 seconds ago       32.9MB
alpine              latest              4d90542f0623        3 days ago          5.58MB

3. コンテナ起動

以下のコマンドを叩く。 docker run -d --name web -p 8000:3000 tsweb

curl localhost:8000/apiと叩けば、次の通りslack通知がくる。 f:id:poppon555:20190623220312p:plain

4. docker-compose 起動

蛇足になるが、docker-compose を利用して同じようにコンテナを起動してみる。

docker-compse.yml

web:
  image: tsweb
  ports:
    - '8000:3000'

docker-compose up -dでバックグラウンドでコンテナ起動。

最後に

ローカル環境で docker image を作成してコンテナ起動までの手順を紹介した。
今度は ECR に image を登録して、ECS で利用してみるところまで紹介したい。

参考にしたサイト