はじめに
この記事は最近Dockerをよく使うようになってきて、
開発環境を作っては捨て作っては捨てを繰り返しつつ、いろいろ試しているうちに
個人的によく使いそうな構成が見えてきたので、それをメモとして残しておく目的で記載しています。
アーキテクチャ
NodeJS + Redis + MySQLによる構成で作っていきます。
主な内訳は以下の通りです。
利用目的 | |
---|---|
NodeJS | webアプリケーション |
MySQL | ユーザー等の主なデータ |
Redis | セッション,キャッシュ |
今回セッションとキャッシュをどちらもRedisで管理してしまっていますが、
分けるソリューションもあると思います。
一例としては、キャッシュとかはDynamoDBでセッション管理はRedisに保存みたいな感じですかね。
自分が作る程度の環境だとそこまで分ける必要性を感じなかったので、すべてRedisで管理してました。
ディレクトリ構成
このあとdocker-compose.ymlを記載しますが、
今回は以下のディレクトリ構成を前提で進めています。
├── data
│ ├── mysql
│ └── redis
├── docker-compose.yml
├── mysql
│ └── Dockerfile
├── app
│ ├── Dockerfile
│ ├── app.js
│ ├── bin
│ │ └── www
│ ├── node_modules
│ ├── package-lock.json
│ ├── package.json
│ ├── public
│ │ ├── images
│ │ ├── javascripts
│ │ └── stylesheets
│ │ └── style.css
│ ├── routes
│ │ ├── index.js
│ │ └── users.js
│ └── views
│ ├── error.jade
│ ├── index.jade
│ └── layout.jade
└── redis
└── Dockerfile
docker-compose.yml
今回は、Docker-Composeを使ってNodeJS、MySQL、Redisのそれぞれでコンテナ立ち上げていく形にしていきます。
docker-composeの内容は以下の通りです。
version: '3'
services:
app:
build:
context: .
dockerfile: ./app/Dockerfile
depends_on:
- mysql
- redis
ports:
- '3000:3000'
tty: true
container_name: node_app
mysql:
build:
context: .
dockerfile: ./mysql/Dockerfile
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: user
MYSQL_PASSWORD: hogehoge
MYSQL_DATABASE: testdb
volumes:
- ./data/mysql:/var/lib/mysql
container_name: mysql
redis:
build:
context: .
dockerfile: ./redis/Dockerfile
restart: always
volumes:
- ./data/redis:/data
container_name: redis
servicesに対してwebアプリケーションや他のミドルウェアのDockerイメージに関する設定内容を記載しています。
appのところにはdepends_onがありますが、これは記載されている他のイメージとの依存関係を示すものになっています。依存関係のあるものが解決してからappの内容が動作します。
それぞれbuildのところで、どのDockerfileを使用してDockerイメージをbuildするかを設定しているのがわかると思うので、Dockerfileも記載しましょう。
./app/Dockerfile
FROM node:latest
WORKDIR /home/app
COPY ./app/package*.json ./
RUN npm install
COPY ./app ./
EXPOSE 3000
./mysql/Dockerfile
FROM mysql:5.7
# ADD ./mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
EXPOSE 3306
./redis/Dockerfile
FROM redis
# COPY redis.conf /usr/local/etc/redis/redis.conf
EXPOSE 6379
実行
docker-compose.ymlのあるディレクトリで実行します。
build
$ docker-compose build
起動
$ docker-compose up -d
exec
# nodeのコンテナ
$ docker-compose exec app bash
# redisのコンテナ
$ docker-compose exec redis bash
# mysqlのコンテナ
$ docker-compose exec mysql bash
ここに記載していないコマンドはこちらの方の記事が参考になります。
docker-compose コマンドまとめ
おわりに
個人的に利用することの多そうな環境をメモがてら書いていきましたが、
間違いやよりよい方法があればぜひ教えてください🙇♀️