Seize the day

POST : Backend study

docker로 mongo db + node 개발환경 만들기

mongo - Official Image | Docker Hub

Docker를 사용하여 MongoDB 설치하고 접속하기 | PoiemaWeb

도커(Docker)로 MongoDB 서버 구축하기 - 정우일 블로그 (wooiljeong.github.io)

 

vi docker-compose.yml

# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    container_name: mongo-dev
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - ~/mongo-storage:/data/db
    ports:
      - 27017:27017

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 27018:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
    depends_on:
      - mongo

호스트의 ~/mongo-storage  가 mongo서버의 데이타 폴더이다. 컨테이너가 삭제되더라도 데이타는 유지된다. 
depends_on으로 mongo 서비스가 먼저 실행되도록 한다. 

# 서버 시작
% docker-compose up -d

# localhost:27018 로 express 동작 확인

# 서버 종료
% docker-compose down

Node 서버를 붙여보자.

개발 환경에서 js 파일  변경시 서버 재시작을 위해서 nodemon을 설치한다. 

npm install nodemon --save-dev

package.json. 이전에 대충 만든것 재활용..

{
  "name": "hello_docker",
  "version": "1.0.0",
  "description": "hello docker test",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "nodemon": "^2.0.20"
  }
}

npm run dev 로 실행하면 nodemon 으로 실행한다. 

docker-compose.yml

# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - ~/mongo-storage:/data/db
    ports:
      - 27017:27017

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 27018:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
    depends_on:
      - mongo

  node:
    image: node:16.18
    command: sh -c "npm install && npm run dev"
    ports:
      - 7700:8000
    working_dir: /app
    volumes:
      - ./:/app
    depends_on:
      - mongo

node 가 추가됬다. 

node는 애플리케이션 서버이므로 나중에 mongo에 시작과 동시에 접속하므로 mongo가 먼저 실행되고 나서 실행된다.   현재 디렉토리를 컨테이너의 /app 으로 바인딩하여  app.js등 모든 앱 소스를 호스트 pc에서 관리한다. 호스트의 7700 포트를 컨테이너 8000포트로 바인딩한다.

localhost:7700 으로 확인시 동작확인하고, app.js 파일 수정후 저장시 자동으로 노드 재시작되어 바로 브라우저에서 확인할 수있다.  이런 식으로 개발한다면 호스트에 노드랑 몽고db를 설치하지 않아도 될 것 같다. 

 

Node서버에서 Mongodb에 연결해 보자

mongoose 라이브러리 설치
npm install mongoose  

node 컨테이너에서 mongo 컨테이너로 연결가능하도록 links를 추가한다.  Networking in Compose | Docker Documentation

  node:
    image: node:16.18
    command: sh -c "npm install && npm run dev"
    ports:
      - 7700:8000
    working_dir: /app
    volumes:
      - ./:/app
    depends_on:
      - mongo
    links:
      - "mongo:database"

database는 호스명으로 사용된다.  때문에 "mongodb://database:27017/testdb"  를 사용..

const http = require('node:http');
const mongoose = require('mongoose');


// Node의 native Promise 사용
mongoose.Promise = global.Promise;
const MONGO_URI = "mongodb://database:27017/testdb";

mongoose.connect(MONGO_URI)
  .then(() => console.log('Successfully connected to mongodb'))
  .catch(e => console.error(e));

const hostname = '0.0.0.0';
const port = 8000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Node Server running at http://${hostname}:${port}/`);
});

docker-compose up -d 를 실행하면 mongo 에 접속 성공했음 로그가 나온다..
[nodemon] starting `node app.js`
Node Server running at http://0.0.0.0:8000/
Successfully connected to mongodb

links 추가 없이 const MONGO_URI = "mongodb://mongo:27017/testdb"; 로 수정해도 접속이 됬다. 서비스 이름을 호스트 이름으로 사용할 수 있나보다.

이제부터 비주얼 스튜디오 코드로 열심히 개발하고,,,  js 파일 저장하면 개발 서버는 자동으로 재시작되고, localhost:27018 로 접속해서 db를 바로  확인할 수 있는 환경이 구축되었다.

 

GitHub - docker/awesome-compose: Awesome Docker Compose samples

 

GitHub - docker/awesome-compose: Awesome Docker Compose samples

Awesome Docker Compose samples. Contribute to docker/awesome-compose development by creating an account on GitHub.

github.com

 

top

posted at

2022. 10. 20. 00:57


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크