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