Node, express, mongoDbを勉強したかったので、Dockerで開発環境を作ってみた。
ディレクトリ構造
docker-compose.yml
docker-configs/lerning-node/Dockerfile
docker-configs/mongo/mongod.conf
docker-configs/mongo/Dockerfile
apps/Learning_Node/package.json
apps/Learning_Node/app.js
docker-compose.yml
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
ports:
- '80:80'
- '443:443'
mongo:
build: ./docker-configs/mongo
restart: always
ports:
- "27017:27017"
volumes:
- ./data/mongodb/db:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: admin
learning-node:
build: docker-configs/learning-node
volumes:
- ./apps/Learning_Node:/var/www/html
depends_on:
- mongo
environment:
- VIRTUAL_HOST=learning-node.local.host
- COLUMNS=200
docker-configs/learning-node/Dockerfile
FROM node:10.16.3
WORKDIR /var/www/html
EXPOSE 80
CMD [ "npm", "start" ]
docker-configs/mongo/Dockerfile
FROM mongo:4.2.0
COPY ./mongod.conf /etc/mongod.conf
docker-configs/mongo/mongod.conf
security:
authorization: enabled
package.json
{
"name": "learning-node",
"version": "1.0.0",
"description": "For learning Node Js.",
"author": "Shintaro Nitta",
"license": "MIT",
"main": "app.js",
"keywords": [
"nodejs",
"bootstrap",
"express"
],
"dependencies": {
"express": "^4.16.4"
},
"scripts": {
"start": "node app.js"
}
}
Install Node Js
nodebrew install v10.16.3
nodebrew use v10.16.3
node --version
npm install, run docker-compose
cd apps/Learning_Node
npm install
cd ../
docker-compose up -d
Add a host to /etc/hosts, access the host
127.0.0.1 learning-node.local.host
app.js
const express = require('express');
const { config, engine } = require('express-edge');
const router = express.Router();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
require('date-utils');
const viewFolder = __dirname + '/views/';
const documentRoot = __dirname + '/public/';
const port = 80;
const app = new express();
const Post = require('./database/models/Post');
// Initialize Middlewares.
mongoose.connect('mongodb://node-blog:password@mongo:27017/node-blog', { useNewUrlParser: true, auth:{authdb: "node-blog"}})
.then(() => 'You are now connected to Mongo!')
.catch(err => console.error('Something went wrong', err))
app.use(express.static('public'));
app.use(engine);
app.set('views', viewFolder);
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: true
}));
// Configure Edge if need to.
config({ cache: process.env.NODE_ENV === 'production' });
// Load middleware function that will log requests.
router.use(function (req, res, next) {
let date = new Date();
console.log('Time:', date.toFormat("YYYY/MM/DD HH24:MI:SS"));
// Take over to a router.
next();
});
router.get('/', (req, res) => {
res.render('index');
});
router.get('/about', (req, res) => {
res.render('about');
});
router.get('/contact', (req, res) => {
res.render('contact');
});
router.get('/post', (req, res) => {
res.render('post');
});
router.get('/posts/new', (req, res) => {
res.render('create');
});
app.post('/posts/store', (req, res) => {
console.log(req.body);
Post.create(req.body, (error, post) => {
console.log(error, post);
res.redirect('/posts/new');
});
});
app.use(express.static(documentRoot));
app.use('/', router);
app.listen(port, function () {
console.log('Example app listening on port 80!')
});
Run docker-compose & create mongodb user
docker-compose up -d
docker exec -it <mongo_container_name> bash
# mongo -u root
MongoDB shell version v4.2.0
Enter password:
> use node-blog
> db.grantRolesToUser('node-blog', [{role: 'readWrite', db: 'node-blog'}])
> db.grantRolesToUser('node-blog', [{role: 'dbAdmin', db: 'node-blog'}])
Note: Basically readWrite
provides CRUD, dbAdmin
provides database management ability.