ساخت docker-compose برای پروژه SpringBoot و MongoDB
خب برای شروع یک فایل به اسم docker-compose.yml در فولدر پروژه ایجاد میکنیم
version: "3.8
services:
mongo:
image: mongo:4.4
container_name: mongo
hostname: mongo"
یک سرویس ایجاد کردیم به نام mongo که از ایمیج mongo:4.4 استفاده میکنه میتونیم از ایمیج با هر تگ دیگه ای استفاده کنیم از لینک زیر سایر تگ های mongodb را ببینید
بعد از مشخص کردن ایمیج یک اسم برای کانتینرمون انتخاب میکنیم و هاست نیم ست کردیم
version: "3.8"
services:
mongo:
image: mongo:4.4
container_name: mongo
hostname: mongo
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root
- MONGO_INITDB_DATABASE=mydb
networks:
- mongo-network
networks
mongo-network:
name: mongo-network
در ادامه پورت mongo رو به یکی از پرت های سیستم مپ کردیم و ورودی های خودمون که environment ها هستن مشخص کردیم
همچنین یک شبکه جدید ایجاد کردیم به اسم mongo-network :)
برای ذخیزه ی دیتاهامون نیاز هستش که volumes را ست کنیم:
version: "3.8"
services:
mongo:
image: mongo:4.4
container_name: mongo
hostname: mongo
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root
- MONGO_INITDB_DATABASE=mydb
volumes:
- ./mongo/data/db/:/data/db/
- ./mongo/log/mongodb/:/var/log/mongodb/
- ./mongo/initdb.d/:/initdb.d/
networks:
- mongo-network
networks
mongo-network:
name: mongo-network
سه فولدر در مسیر جاری پروژه ایجاد میکنیم به شکل زیر
mkdir ./mongo/data
mkdir ./mongo/log
mkdir ./mongo/initdb.d
خب کارمون تقریبا با mongo تموم شد فقط یک بخش باقی مونده که یک یوزر بسازیم تا از اون در SpringBoot استفاده کنیم
برای اینکار نیازه هست یک shell اسکریپت مینویسیم به اسم create-user.sh و در فولدر initdb.d قرار میدهیم تا در زمان ساخت کانتینر اجرا شود
#!/bin/bash
mongo -u "root" -p "root" --authenticationDatabase "admin" "mydb" --eval "db.createUser({ user: 'user1', pwd: 'user1', roles: [{ role: 'dbOwner', db: 'mydb' }] })"
اسکریپت بالا یک کاربر با نام کاربری و رمز user1 که دسترسی کامل به بانک اطلاعاتی mydb دارد ایجاد میکند
دیگ بریم سراغ اسپرینگ :)
قبل هرچیز نیازه یک داکر فایل برای پروژه ایجاد کنیم،برای اینکار یک فایل به نام Dockerfile ایجاد میکنیم نمونه زیر ساده ترین حالت ممکن هستش
FROM openjdk:17.0.1-jdk-slim
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
توی این مثال چون ورژن جاوا من 17 بود از ایمیج openjdk:17.0.1-jdk-slim استفاده کردم
این داکر فایل jar فایل موجود در فولدر target را داخل کانتینر ما کپی میکند و بعد اونو اجرا میکنه
اما مشکلی که داره اینه که نیازه که پروژه از قبل build شده باشد
میتونیم داکر فایلمونو به شکل زیر تغییر بدیم تا خودش package برامون بسازه
FROM maven:3.8.3-openjdk-17 AS builder
ADD . /app
WORKDIR /app
RUN mvn -f /app/pom.xml clean package
FROM openjdk:17.0.1-jdk-slim
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
حال فایل docker-compose.yml ویرایش میکنیم و یک سرویس جدید بهش اضافه میکینم
version: "3.8"
services:
mongo:
image: mongo:4.4
...
web:
build:
context: .
dockerfile: Dockerfile
container_name: app
restart: always
depends_on:
- mongo
ports:
- "8080:8080"
environment:
- SERVER_PORT=8080
- SPRING_PROFILES_ACTIVE=prod
- SPRING_APPLICATION_NAME=myapp
- SPRING_DATA_MONGODB_AUTHENTICATION_DATABASE=admin
- SPRING_DATA_MONGODB_AUTO_INDEX_CREATION=true
- SPRING_DATA_MONGODB_HOST=mongo
- SPRING_DATA_MONGODB_PORT=27017
- SPRING_DATA_MONGODB_USERNAME=user1
- SPRING_DATA_MONGODB_PASSWORD=user1
- SPRING_DATA_MONGODB_DATABASE=mydb
networks:
- mongo-network
networks:
mongo-network:
name: mongo-network
نیازه که environmentهارو بر اساس پروژه خودمون تنظیم کنیم :)
کارمون دیگ تمومه کافیه دستور زیر رو اجرا کنیم تا پروژه و mongo روی داکر راه اندازی بشن
docker-compose up
همین :)
مطلبی دیگر از این انتشارات
آموزش مقدمات AOP در Spring
مطلبی دیگر از این انتشارات
معرفی DTO, Java Bean و POJO در جاوا
مطلبی دیگر از این انتشارات
RabbitMQ چیست؟ استفاده از RabbitMQ در Spring Boot