امیرحسین امانی
امیرحسین امانی
خواندن ۶ دقیقه·۲ ماه پیش

نحوه نصب Geoserver به کمک docker


نیاز به اجرای جئوسرور در محیط لینوکس و سختی نصب پلاگین هایی مانند gdal که برای لود عکس هایی با فرمت ecw استفاده میشود باعث شد تا برای اجرای جئوسرور ، از Docker کمک بگیرم

در ادامه سعی میکنیم کلیه دستورات docker و linux و همچنین توضیحات تکمیلی را در قالب نصب و ساخت ایمیج جئوسرور دلخواهمان ، توضیح و بررسی کنم

هدف از ساخت docker image برای جئوسرور چیست؟

قطعا همان طور که در ابتدای این مقاله گفته شد ، سادگی و قابل حمل بودن و سرعت deploy توسط docker باعث شد برای سهولت کار جئوسرور را تبدیل به یک docker image کنییم . برای مثال ما میخواستیم جئوسرورمان دارای دو پلاگین oracle و GDAL باشد که به صورت پیش فرض بر روی جئوسرور نصب نیستند و نصب آن ها بر روی سیستم عامل های مختلف دارای پیچیدگی های مختلفی هست اما با انجام کلیه این تنظیمات و ساخت یک docker image ، دیگه نیازی نیست که هر بار تنظیمات را انجام دهیم و با ساخت هر container از ایمیج جئوسرور تنظیمات ما به صورت پیشفرض در جئوسرور اعمال میشوند.

در صورت تغییر در تنظیمات ، اضافه کردن لایه ها ، استایل ها ، تنظیمات cache نقشه و ... آیا هربار که container ما پاک شود و دوباره راه اندازی شود ، اطلاعات از بین میرود ؟

جواب منفی است ، در docker امکان volume کردن یا به زبان ساده تر امکان شنود کردن اتفاقاتی که در container در حال رخ دادن است وجود دارد و ما میتوانیم با استفاده از این قابلیت اتفاقات مورد نظرمون را شنود کنیم و در host خودمون نگه داریم . به عنوان مثال در ایمیج جئوسرور ، ما کلیه محتویات پوشه data_dir را که شامل کلیه تنظیمات و تغییرات جئوسرور هست را از طریق volume (( که در ادامه توضیح خواهیم داد)) در هاست خود ذخیره میکنیم تا هربار که یک instance جدید ساخته میشود آخرین تغییرات در جئوسرور وجود داشته باشد و نیازی به دوباره کاری برای بارگزاری اطلاعات جئوسرور نباشد.

مرحله اول

اولین مسئله ای که باید به آن دقت کرد این است که قبل از تلاش برای ساختن یک ایمیج از صفر تا صد بهتر است که سری به dockerhub بزنیم. چون در بیشتر مواقع مواردی مشابه به تنظیماتی که در نظر شما وجود دارد را میتوان از آنجا پیدا کرد با همین رویکرد ما توانستیم با جستجوی geoserver در ایمیج ها و بررسی امکانات آنها یکی را انتخاب کنیم تا به عنوان اولین قدم روی آن کار کنیم تا در نهایت base image خود را آماده کنیم

winsent/geoserver

ایمیج انتخابی ما که آدرسش در اسم ایمیج لینک شده است ، ایمیج winsent بود چون به صورت پیشفرض دارای پلاگین GDAL بود که البته برای این کار باید چند مرحله انجام میدادیم

با بررسی repository ایمیج و دانلود source آن متوجه شدیم برای اینکه بخواهیم ایمیجی با پلاگین از قبل آماده شده GDAL داشته باشیم باید از روی Dockerfile موجود در پوشه ورژن 2.12 و پوشه libecw یک ایمیج تهیه کنیم.

در ابتدا برای اینکه اگر کاربر ادمین نباشید و نخواهید هر بار دستور sudo را قبل از دستورات docker بیاورید میتوانید از کد زیر در terminal استفاده کنید. بعد از enter کردن رمز عبور یوزر خود را تایپ کنید و enter کنید حالا شما به عنوان یوزر ادمین شناخته شده اید

1$ sudo –i

نحوه ساخت یک Docker Image از روی Dockerfile

1$ docker build –t imageName .

توجه : در انتها بعد از اسم ایمیج باید یک space زده و ].[ را بگذارید تا دستور عمل کند. البته در دستور بالا چون دقیقا اسم فایل Dockefile بوده ما اسم فایل را نیاوردیم ولی اگر اسم Dockerfile امون فرق میکنه دستور به شکل زیر میشه

1$ docker build -f dockerfileName -t imageName .

بعد از ساخته شدن image یکسری دستورات لازمه را مرور میکنیم

نحوه pull کردن یک image از docker hub

1$ docker pull image_name

دیدن لیستی از همه Image های داکری که روی هاست قرار دارد

1$ docker images

حذف docker image

وقتی دستور docker images رو اجرا میکنیم کل اطلاعات ایمیج شامل Id ، نام و ... رو به ما نشون میده

1$ docker rmi <imageId>

ساخت یک container از روی image

برای این منظور از دستور زیر استفاده میکنیم

1$ docker run –d –p 8087:8080 –v path/to/host:/opt/geoserver/data_dir <imageName>

-d

یعنی container رو در background اجرا کنه

-p 8087:8080

یعنی پورت 8080 در container رو به پورت 8087 در هاست خودتون مپ میکنه . یعنی برای دسترسی بهش کافیه توی هاست خودتون از آدرس زیر استفاده کنید

127.0.0.1:8087/geoserver

-v

وظیفه volume کردن را بر عهده دارد یعنی محتویات داخل پوشه /opt/geoserver/data_dir که در container قرار دارد را میریزه داخل مسیر سمت چپی که در هاست شماست.

نمایش لیست تمامی container های فعال

1$ docker ps

نمایش لیست تمامی container های فعال و غیر فعال

1$ docker ps –a

حذف container

1$ docker rm <containerName/Id>

Stop و start کردن container ها

1$ docker stop/start <container Name/Id>

Stop کردن همه container ها به صورت دسته جمعی و حذف آنها

روش اول

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 ها را و بعد پاکشون میکنه

دستور رفتن به داخل container

1$ docker exec –it <containerName/Id> /bin/bash

خروج از یک container بدون stop شدن

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 میسازیم تا همیشه از آن استفاده کنیم

ساخت Docker Image از روی Container

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 فایل ازش میسازیم تا هرجایی که میخواهیم ازش استفاده کنیم اون رو لود کنیم

ساخت tar فایل از imge

1$ docker save <image_name> yourImageName.tar

مثال:

1$ docker save sample/geoserver:1.1.0 sample-geoserver.tar

لود کردن tarFile

حالا برای لود کردن این Image باید از دستور زیر استفاده کرد

1$ docker load tarFileAddress

توجه : در volume ای که در هاست خود داریم باید پوشه ای به نام data بسازیم و فایل های ecw را درون آن پوشه بارگذاری کنیم . این باگ پلاگین GDAL میباشد که حتما باید دیتا های رستری آن داخل پوشه data در مسیر geoserver_data_dir باشد

استفاده از docker compose

برای راحتی کار میتوانیم برای ساخت container از فایل dockerCompose.yml استفاده کنیم

به عنوان مثال فایل dockerCompse جئوسرور

123456version: '2' services:   app:     image: &quotsample/geoserver:1.0.0&quot     ports:      - &quot8080:8080&quot 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
docker
سلام به همه رفقا من قصد دارم تجربیات چند سال گذشتم رو در خدمت شما بزارم #با_هم_پیشرفت_کنیم
شاید از این پست‌ها خوشتان بیاید