Pernahkah merasa sulit dan repot saat dipaksa beradaptasi dengan integrasi baru di suatu aplikasi atau projek? Misalnya penerapan database jenis baru yang menggunakan mongodb. Mungkin kebanyakan developer pemula atau junior developer yang sering meresakannya. Penyebabnya tidak lain karena minimnya tingkat pengalaman terkait tools tersebut. Ribetnya adalah instalasi tools di lokal komputer kita, sebagai perangkat yang digunakan untuk berperang dalam proses pengerjaan aplikasi.
Dipercaya kehadiran docker di sini menjadi salah satu solusi untuk memudahkan di bagian instalasinya, baik pada tahap development maupun deployment. Cukup satu perintah saja banyak tools yang dibutuhkan dapat dilakukan instalasinya. Lebih tepatnya memaksimalkan penggunaan docker compose yang menjadi salah satu fitur penting di dalam docker.
Kesempatan kali ini akan dibahas proses melakukan containerize mongodb, dengan bonus database client tools. Sehingga memudahkan kita untuk tidak membuka atau melakukan instalasi aplikasi database client yang kompatibel untuk mongodb. Faktanya pilihan melakukan dockerize terhadap database tidak terlalu urgent. Namun menjadi penting saat aplikasi kita memerlukan banyak sekali integrasi tools. Mungkin saja keperluan dalam proses caching, message broker dan lainnya.
Persiapan awal
Agar lebih dimudahkan terkait pemahaman proses containerize mongodb dan client tools-nya, akan diberikan contoh aplikasi yang melakukan koneksi terhadap database. Dalam kasus ini aplikasi ditulis menggunakan nodejs dengan simpel proses query terhadap mongodb.
Disclaimer:
Aplikasi dan tools lain tidak termasuk ke dalam proses dockerize.
Kebutuhan library:
Berikut potongan code yang akan diimplementasikan menggunakan docker container dari mongodb:
const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const Todo = require('./todo');
dotenv.config();
const app = express();
const PORT = parseInt(process.env.PORT) || 3000;
const DB_HOST = process.env.DB_HOST;
const DB_PORT = process.env.DB_PORT;
const DB_USER = process.env.DB_USER;
const DB_PASSWORD = process.env.DB_PASSWORD;
const DB_NAME = process.env.DB_NAME;
const DB_URI = `mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}`;
app.use(express.json());
app.get('/todo', async (_req, res) => {
const allTodos = await Todo.find();
return res.status(200).json(allTodos);
});
app.post('/todo', async (req, res) => {
const newTodo = new Todo({ ...req.body });
const created = await newTodo.save();
return res.status(201).json(created);
});
const start = async () => {
try {
await mongoose.connect(DB_URI);
app.listen(PORT, () => console.log('Server started on port 3000'));
} catch (error) {
console.error(error);
process.exit(1);
}
};
start();
Projek ini membuat aplikasi todo list, menggunakan framework expressjs dan mongoose library. Hanya dibuat 2 endpoints yaitu, list data todo dan tambah data todo. Konfigurasi value yang digunakan pada database dan aplikasi disimpan di dalam file .env. Berikut susunan isi di dalam file .env:
PORT=3000
DB_NAME=domingo_db
DB_USER=domingo_user
DB_PASSWORD=domingo_pass
DB_PORT=27020
DB_HOST=localhost
Selain digunakan di dalam aplikasi, file .env ini digunakan juga saat build & run pada docker. Khusus konfigurasi mongodb membutuhkan file javascript
untuk inisialisasi database user, database password & database name. Berikut file javascript
yang dibutuhkan sebagai inisialisasi mongodb:
db.createUser({
user: 'domingo_user', // disesuaikan dengan value di file .env => DB_USER
pwd: 'domingo_pass', // disesuaikan dengan value di file .env => DB_PASSWORD
roles: [
{
role: 'readWrite',
db: 'domingo_db', // disesuaikan dengan value di file .env => DB_NAME
},
],
});
Dockerize mongodb & Client Tools
Selanjutnya membuat file docker-compose.yaml pada directory root projek. Untuk aplikasi di sini tidak disertakan proses dockerize-nya, sehingga untuk melakukan running aplikasi menggunakan perintah di nodejs. Berikut potongan code untuk melakukan dockerize:
version: '3.8'
services:
mongodb:
image: mongo:6.0
container_name: mongodb-domingo
environment:
MONGO_INITDB_DATABASE: '${DB_NAME}'
MONGO_INITDB_ROOT_USERNAME: '${DB_USER}'
MONGO_INITDB_ROOT_PASSWORD: '${DB_PASSWORD}'
volumes:
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
- mongo_vol:/data/db
ports:
- ${DB_PORT:-27017}:27017
networks:
- domingo
healthcheck:
test: echo 'db.runCommand("ping").ok | mongo localhost:27017/test --quiet'
interval: 1m
timeout: 10s
retries: 3
restart: always
mongo-express:
image: mongo-express
container_name: mongo-express-domingo
restart: always
environment:
ME_CONFIG_MONGODB_SERVER: mongodb-domingo
ME_CONFIG_MONGODB_AUTH_DATABASE: '${DB_NAME}'
ME_CONFIG_MONGODB_AUTH_USERNAME: '${DB_USER}'
ME_CONFIG_MONGODB_AUTH_PASSWORD: '${DB_PASSWORD}'
ports:
- 8081:8081
networks:
- domingo
depends_on:
- mongodb
networks:
domingo:
driver: bridge
volumes:
mongo_vol:
driver: local
Image docker mongodb yang digunakan adalah mongo:6.0. Sedangkan Image docker mongodb client tools (mongo-express) menggunakan mongo-express. Di dalam file docker-compose.yaml sudah menggunakan env value secara otomatis, karena default-nya membaca value jika ada file .env pada direktori yang sama.
Perintah yang digunakan untuk menjalankan proses dockerize adalah docker-compose up -d
. Otomatis akan melakukan download sekaligus build dan menjalankannya. Untuk mematikan running proses docker adalah docker-compose down
. Disarankan untuk mempunyai pengetahuan basic terkait docker, sehingga dapat memahami dan melakukan handle terhadap proses docker.
Melakukan test menggunakan postman
Sebelum melakukan pengetesan, pastikan docker container telah dijalankan dan aplikasi todo-nya. Pastikan mongodb client tools berhasil dijalankan dengan mengaksesnya melalui browser seperti berikut:
Untuk hasil test dari get list todo di postman sebagai berikut:
Untuk hasil test dari tambah data todo di postman seperti berikut:
Selanjutnya penggunaan docker bergantung berdasarkan improvisasi masing-masing sesuai kebutuhan. Untuk source code lengkapnya bisa dicek di sini. Sekian.
Credits:
Image cover by Rubaitul Azad on Unsplash.Support me on:
saweria
Top comments (0)