image
terminal
docker pull mongo
localhost:27017でDBに接続する場合
docker
terminal
# launch
docker run --name mongodb -p 27017:27017 -v `pwd`/db:/data/db -d mongo
# stop
docker rm -f mongodb
# shell
docker exec -it mongodb mongo
docker-compose
docker-compose.yml
version: '3.8'
services:
db:
image: mongo
container_name: mongodb
ports:
- 27017:27017
volumes:
- ./db:/data/db
terminal
# launch
docker-compose up
# stop
docker-compose down
他のdockerコンテナから直接アクセスする場合
例、dockerコンテナで動くnode.jsアプリ(localhost:3000でアクセス)から、mongodbに、mongodb://db:27017
でアクセスする
docker-compose
docker-compose.yml
version: '3.8'
services:
web:
image: node:alpine
working_dir: /home/node/app
volumes:
- ./:/home/node/app
ports:
- 3000:3000
command: ash -c "npm run build && npm start"
db:
image: mongo #portsの指定は不要.
volumes:
- ./db:/data/db
terminal
# launch
docker-compose up
# stop
docker-compose down
サンプルコード.ts
import { MongoClient, Collection } from 'mongodb'
const URL = 'mongodb://db:27017'
const NAME = 'mongodb'
export async function insertDocument(collectionName: string, document: object) {
await crudCollection(
collectionName,
async (collection) => await collection.insertOne(document)
)
}
export async function findDocuments(
collectionName: string,
filter: object
): Promise<any[]> {
return await crudCollection(
collectionName,
async (collection) => await collection.find(filter).toArray()
)
}
export async function updateDocument(
collectionName: string,
filter: object,
newDocument: object
) {
await crudCollection(
collectionName,
async (collection) =>
await collection.updateOne(filter, { $set: newDocument })
)
}
export async function deleteDocument(collectionName: string, filter: object) {
await crudCollection(
collectionName,
async (collection) => await collection.deleteOne(filter)
)
}
/**
* @private
*/
async function crudCollection(
collectionName: string,
method: (collection: Collection<any>) => Promise<any>
) {
let client: MongoClient
try {
client = await MongoClient.connect(URL, { useNewUrlParser: true })
const collection = client.db(NAME).collection(collectionName)
return await method(collection)
} finally {
client.close()
}
}