نیاز به اجرای جئوسرور در محیط لینوکس و سختی نصب پلاگین هایی مانند gdal که برای لود عکس هایی با فرمت ecw استفاده میشود باعث شد تا برای اجرای جئوسرور ، از Docker کمک بگیرم
در ادامه سعی میکنیم کلیه دستورات docker و linux و همچنین توضیحات تکمیلی را در قالب نصب و ساخت ایمیج جئوسرور دلخواهمان ، توضیح و بررسی کنم
قطعا همان طور که در ابتدای این مقاله گفته شد ، سادگی و قابل حمل بودن و سرعت deploy توسط docker باعث شد برای سهولت کار جئوسرور را تبدیل به یک docker image کنییم . برای مثال ما میخواستیم جئوسرورمان دارای دو پلاگین oracle و GDAL باشد که به صورت پیش فرض بر روی جئوسرور نصب نیستند و نصب آن ها بر روی سیستم عامل های مختلف دارای پیچیدگی های مختلفی هست اما با انجام کلیه این تنظیمات و ساخت یک docker image ، دیگه نیازی نیست که هر بار تنظیمات را انجام دهیم و با ساخت هر container از ایمیج جئوسرور تنظیمات ما به صورت پیشفرض در جئوسرور اعمال میشوند.
جواب منفی است ، در docker امکان volume کردن یا به زبان ساده تر امکان شنود کردن اتفاقاتی که در container در حال رخ دادن است وجود دارد و ما میتوانیم با استفاده از این قابلیت اتفاقات مورد نظرمون را شنود کنیم و در host خودمون نگه داریم . به عنوان مثال در ایمیج جئوسرور ، ما کلیه محتویات پوشه data_dir را که شامل کلیه تنظیمات و تغییرات جئوسرور هست را از طریق volume (( که در ادامه توضیح خواهیم داد)) در هاست خود ذخیره میکنیم تا هربار که یک instance جدید ساخته میشود آخرین تغییرات در جئوسرور وجود داشته باشد و نیازی به دوباره کاری برای بارگزاری اطلاعات جئوسرور نباشد.
اولین مسئله ای که باید به آن دقت کرد این است که قبل از تلاش برای ساختن یک ایمیج از صفر تا صد بهتر است که سری به dockerhub بزنیم. چون در بیشتر مواقع مواردی مشابه به تنظیماتی که در نظر شما وجود دارد را میتوان از آنجا پیدا کرد با همین رویکرد ما توانستیم با جستجوی geoserver در ایمیج ها و بررسی امکانات آنها یکی را انتخاب کنیم تا به عنوان اولین قدم روی آن کار کنیم تا در نهایت base image خود را آماده کنیم
ایمیج انتخابی ما که آدرسش در اسم ایمیج لینک شده است ، ایمیج winsent بود چون به صورت پیشفرض دارای پلاگین GDAL بود که البته برای این کار باید چند مرحله انجام میدادیم
با بررسی repository ایمیج و دانلود source آن متوجه شدیم برای اینکه بخواهیم ایمیجی با پلاگین از قبل آماده شده GDAL داشته باشیم باید از روی Dockerfile موجود در پوشه ورژن 2.12 و پوشه libecw یک ایمیج تهیه کنیم.
در ابتدا برای اینکه اگر کاربر ادمین نباشید و نخواهید هر بار دستور sudo را قبل از دستورات docker بیاورید میتوانید از کد زیر در terminal استفاده کنید. بعد از enter کردن رمز عبور یوزر خود را تایپ کنید و enter کنید حالا شما به عنوان یوزر ادمین شناخته شده اید
1$ sudo –i
1$ docker build –t imageName .
توجه : در انتها بعد از اسم ایمیج باید یک space زده و ].[ را بگذارید تا دستور عمل کند. البته در دستور بالا چون دقیقا اسم فایل Dockefile بوده ما اسم فایل را نیاوردیم ولی اگر اسم Dockerfile امون فرق میکنه دستور به شکل زیر میشه
1$ docker build -f dockerfileName -t imageName .
بعد از ساخته شدن image یکسری دستورات لازمه را مرور میکنیم
1$ docker pull image_name
1$ docker images
وقتی دستور docker images رو اجرا میکنیم کل اطلاعات ایمیج شامل Id ، نام و ... رو به ما نشون میده
1$ docker rmi <imageId>
برای این منظور از دستور زیر استفاده میکنیم
1$ docker run –d –p 8087:8080 –v path/to/host:/opt/geoserver/data_dir <imageName>
یعنی container رو در background اجرا کنه
یعنی پورت 8080 در container رو به پورت 8087 در هاست خودتون مپ میکنه . یعنی برای دسترسی بهش کافیه توی هاست خودتون از آدرس زیر استفاده کنید
127.0.0.1:8087/geoserver
وظیفه volume کردن را بر عهده دارد یعنی محتویات داخل پوشه /opt/geoserver/data_dir که در container قرار دارد را میریزه داخل مسیر سمت چپی که در هاست شماست.
1$ docker ps
1$ docker ps –a
1$ docker rm <containerName/Id>
1$ docker stop/start <container Name/Id>
1$ dcoker stop $(docker ps –a –q ) 1$ docker rm $(docker ps –a –q)
$ docker ps –a –q این دستور id (-q) همه کانتینر ها (-a) را بر میگردونه
1$ docker rm –f $(docker ps –a –q)
-f به معنی force یا اجبار میباشد ، پس بدون نیاز به stop کردن خودش اول stop میکنه همه container ها را و بعد پاکشون میکنه
1$ docker exec –it <containerName/Id> /bin/bash
1Ctrl + d
حالا که container ما ساخته شده میخواهیم پلاگین های oracle را هم بهش اضافه کنیم . برای این منظور باید jar فایل های oracle و ojdbc را در مسیر زیر داخل container کپی کنیم
1$ docker cp ojdbc.jar myContainer:/opt/geoserver/webapps/geoserver/WEB-INF/lib/
حالا که این کار را انجام دادیم پلاگین های ما اضافه میشوند و در حقیقت base image ما ساخته شده است به همین منظور از container موجود یکImage میسازیم تا همیشه از آن استفاده کنیم
1$ docker commit <container_id> <container_name>:<tag_version>
مثال :
1$ docker commit 2fg4805485ad sample/geoserver:1.0.0
اگر :tag_version رو نگذاریم خودش latest در نظر میگیره
اعداد 2fg4805485ad به معنی id کانتینر مورد نظر است
برای نگهداری Image خودمون یک tar فایل ازش میسازیم تا هرجایی که میخواهیم ازش استفاده کنیم اون رو لود کنیم
1$ docker save <image_name> yourImageName.tar
مثال:
1$ docker save sample/geoserver:1.1.0 sample-geoserver.tar
حالا برای لود کردن این Image باید از دستور زیر استفاده کرد
1$ docker load tarFileAddress
توجه : در volume ای که در هاست خود داریم باید پوشه ای به نام data بسازیم و فایل های ecw را درون آن پوشه بارگذاری کنیم . این باگ پلاگین GDAL میباشد که حتما باید دیتا های رستری آن داخل پوشه data در مسیر geoserver_data_dir باشد
برای راحتی کار میتوانیم برای ساخت container از فایل dockerCompose.yml استفاده کنیم
به عنوان مثال فایل dockerCompse جئوسرور
123456version: '2' services: app: image: "sample/geoserver:1.0.0" ports: - "8080:8080" 1 volumes: 1- /home/nariman/Desktop/…/geoserverData:/opt/geoserver/data_dir
البته برای استفاده از docker compose باید آن را به صورت جداگانه نصب کنید که این لینک توضیح داده شده و نیازمند چند دستور است
1sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 1sudo chmod +x /usr/local/bin/docker-compose
برای اجرا کردن از طریق docker compose کافیه به مسیری که فایل در اون قرا داره برید و دستور زیر را اجرا کنید
1$ docker-compose –f dockerComposefile.yml up -d