mysql+node.js(express)をdokcer-composeしてみた

docker-composeご存知でしょうか?何も考えずに色々なアプリをまとめて管理できる優秀な仮想環境です。

今回はサクッと mysql+node.jsの環境を作れるようにひな形を用意しましたのでかるーく紹介していきたいと思います。

ソースコードはこちらにあります。クローンしてから進んでください。

予め以下をインストールしておいてください

  • docker
  • docker-compose
  • node.js

dockerを導入してもdokcer-composeは自動で導入されませんし、dokcer-composeを導入してもdockerは自動で導入されません。各々インストールが必要です。インストール方法は割愛。

ディレクトリの構成です。appにはnode.jsのソースコードが入ってます。mysqlはデータベースですね。

docker-sample
|-app
|-mysql
|-docker-compose.yml

こちらがdocker-compose.ymlの内容です。

version: '3'
services:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_ROOT_PASSWORD: password
      TZ: "Asia/Tokyo"
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql  # mysqlのデータを永続化
      - ./mysql/init:/docker-entrypoint-initdb.d  # コンテナ起動時にSQLを発行
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf  # 設定ファイルをバインド
  nodejs:
    image: node:12
    tty: true
    ports:
      - "3000:3000"
    volumes:
      - ./app:/var/app
    command: node /var/app/index.js

各項目を簡単にご紹介します。

  • image … コンテナの名前
  • command … コンテナが立ち上がった際に実行するコマンド
  • environment … 環境変数
  • ports … 左から右へポートフォワード
  • volumes … ローカルディレクトリをコンテナ内のディレクトリにバインドします

次にappディレクトリでnpm iを実行してnodeモジュールをインストールします。

cd app
npm i

これで準備は整いました。docker-sampleディレクトリに移動しdocker-compose up ※オプションで-dをつけるとデーモンで起動させれます。

cd ..
docker-compose up

コンテナが起動したか確認してみましょう

docker ps

以下のようになっていればOKです。※CONTAINER IDは変わります

さっそくlocalhost:3000にアクセスしてみてください。Expressと表示されていれば完成です。またlocalhost:3000/usersにアクセスするとmysqlに入っているレコードが表示されます。

各コンテナに入りたいときはこちらのコマンド

docker-compose exec db bash
docker-compose exec nodejs bash

まとめ

意外とdocker-compose+mysql+node.jsの記事が見つからなくて困ったので備忘録もかねて作ってみました。

え?たったこれだけ?と思うかもしれませんがたったこれだけなんです。ちなみにappの中身はexpress-ganeratorに–view=ejsを使用して作成し、mysqlとコネクトする部分を書いただけです。ソースを作るのに30分もかかりませんでした。

あとは煮るなり焼くなり自由に使ってください。これでちょっとしたWEBサービスがいつでも作れますね!