ساخت 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

همین :)