docker node expressの開発環境を作る

windows10でdocker toolboxがインストール済みが前提です。

VirtualBoxのdockerホストを構築してある

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v17.03.1-ce

プロジェクトのディレクト作成

mkdir sample && cd sample

docker-composeでnodeのコンテナを起動する

docker-compose.ymlを作成する

version: '2'

services:

    sample:
      container_name: sample
      image: node:7.10
image: node:8.10
      ports:
        - "3000:3000"
      tty: true
      working_dir: /app/sample
      volumes:
        - ./:/app/sample
        - /app/sample/node_modules

nodeのコンテナを確認

$ docker ps
CONTAINER ID   IMAGE      COMMAND  CREATED              STATUS         PORTS                   NAMES
b8d8b6eb8494   node:7.10  "node"   About a minute ago   Up 25 seconds  0.0.0.0:3000->3000/tcp  sample

sampleフォルダには、空のnode_modulesフォルダが生成される。
node_modulesをホストとマウントするとモジュールインストールがうまくいかなかったのでコンテナ内に「/app/sample/node_modules」指定する

コンテナにログイン

docker exec -it sample /bin/bash

package.jsonの作成

npm init -y

sampleフォルダにpackage.jsonが追加される

express-generatorをインストールする

npm install -D express-generator

package.jsonを編集する

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "express": "express"
},

scriptのところに「”express”: “express”」を追加する

expressの雛形を作成する

npm run express . -f

「y」を入力して雛形を作成

sample
  bin/
  node_modules/
  public/
  routes/
  views/
  app.js
  docker-compose.yml
  package.json

フォルダはこんな感じになる

express-generatorはもう使わないので削除する

npm rm express-generator

依存モジュールのバージョンも固定もしたいのnpm-shrinkwrap.jsonを作成

npm shrinkwrap --dev

npmインストール

npm install && npm cache clean

起動して確認

npm start

http://192.168.99.100:3000/

次回コンテナを起動したときアプリが起動するようにする

docker-compose.ymlを修正する

version: '2'

services:

    sample:
      container_name: sample
      image: node:7.10
      ports:
        - "3000:3000"
      tty: true
      working_dir: /app/sample
      command: ["npm", "start"] 
      volumes:
        - ./:/app/sample
        - /app/sample/node_modules

command: [“npm”, “start”] を追加する

コンテナを停止する

docker stop sample

コンテナを起動する

docker-compose up -d

確認する

http://192.168.99.100:3000/

コンテナを共有するときのためDockerfileを作成する

しかしながら、package.jsonとnpm-shrinkwrap.jsonがある状態で共有

Dockerfile

FROM node:7.10
ENV APP_ROOT /app/sample

WORKDIR $APP_ROOT
COPY package.json $APP_ROOT
COPY npm-shrinkwrap.json $APP_ROOT
RUN npm install && npm cache clean

COPY . $APP_ROOT
EXPOSE 3000
CMD ["npm", "start"]

Dockerfileを使うときのdocker-compose.ymlのimageをbuildにする

version: '2'

services:

    sample:
      container_name: sample
      build: ./
      ports:
        - "3000:3000"
      tty: true
      working_dir: /app/sample
      command: ["npm", "start"] 
      volumes:
        - ./:/app/sample
        - /app/sample/node_modules

参考サイト

http://qiita.com/togana/items/40b50426d511327238af