ساخت docker-compose برای پروژه SpringBoot و MongoDB

خب برای شروع یک فایل به اسم docker-compose.yml در فولدر پروژه ایجاد میکنیمversion: &quot3.8 services: mongo: image: mongo:4.4 container_name: mongo hostname: mongo&quotیک سرویس ایجاد کردیم به نام mongo که از ایمیج mongo:4.4 استفاده میکنه میتونیم از ایمیج با هر تگ دیگه ای استفاده کنیم از لینک زیر سایر تگ های mongodb را ببینید https://hub.docker.com/_/mongo/tags بعد از مشخص کردن ایمیج یک اسم برای کانتینرمون انتخاب میکنیم و هاست نیم ست کردیمversion: &quot3.8&quot services: mongo: image: mongo:4.4 container_name: mongo hostname: mongo ports: - &quot27017:27017&quot 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: &quot3.8&quot services: mongo: image: mongo:4.4 container_name: mongo hostname: mongo ports: - &quot27017:27017&quot 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 &quotroot&quot -p &quotroot&quot --authenticationDatabase &quotadmin&quot &quotmydb&quot --eval &quotdb.createUser({ user: 'user1', pwd: 'user1', roles: [{ role: 'dbOwner', db: 'mydb' }] })&quotاسکریپت بالا یک کاربر با نام کاربری و رمز user1 که دسترسی کامل به بانک اطلاعاتی mydb دارد ایجاد میکنددیگ بریم سراغ اسپرینگ :)قبل هرچیز نیازه یک داکر فایل برای پروژه ایجاد کنیم،برای اینکار یک فایل به نام Dockerfile ایجاد میکنیم نمونه زیر ساده ترین حالت ممکن هستشFROM openjdk:17.0.1-jdk-slim COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [&quotjava&quot,&quot-jar&quot,&quotapp.jar&quot]توی این مثال چون ورژن جاوا من 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 [&quotjava&quot,&quot-jar&quot,&quotapp.jar&quot]حال فایل docker-compose.yml ویرایش میکنیم و یک سرویس جدید بهش اضافه میکینمversion: &quot3.8&quot services: mongo: image: mongo:4.4 ... web: build: context: . dockerfile: Dockerfile container_name: app restart: always depends_on: - mongo ports: - &quot8080:8080&quot 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هارو بر اساس پروژه خودمون تنظیم کنیم :) https://gist.github.com/sheikhoo/dbaaf0342fe121ea5f0b1d45515e9fd5 کارمون دیگ تمومه کافیه دستور زیر رو اجرا کنیم تا پروژه و mongo روی داکر راه اندازی بشنdocker-compose upهمین :)