Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۱۷ دقیقه·۴ سال پیش

ایجاد سرویس تو داکر توسط docker API

نکته مهم: اگه از نود.جی‌اس برای وصل شدن به داکر میخوای استفاده بکنی بهتره قبل از اینکه به فکر استفاده مستقیم از API خود داکر باشی یه نگاهی به پکیج dockerode بندازی.

میخوای با داکر API کار بکنی؟ اینم یه آموزش قشنگ
میخوای با داکر API کار بکنی؟ اینم یه آموزش قشنگ

برای ایجاد یه سرویس تو داکر شما می‌تونی از طریق کامند لاین اقدام بکنی ولی اگه میخوای از RESTful API داکر استفاده بکنی باید اول یکسری تنظیماتی رو اانجام بدی و بعدش می‌تونی به اندپوینت /services/create یه درخواست POST بفرستی.

مقادیر موجود در request body

ست کردن command

ست کردن Args

اجرای یه دستور هنگام ساختن کانتینر، اینجا باس دستوراتی میخوای تو کانتینرت اجرا بشه رو بزنی مثل npm i

آرگومان های کامندات رو تو این مورد ست می‌کنی.

ست کردن Hostname

مشخص کردن hostname کانتینری که ساخته میشه. اگه replica رو ۱۰ بزاری و hostname رو ست بکنی همشون hostname یکسانی می‌گیرند. وقتی hostname رو تو نتورک overlay مشخص میکنی، یه اتفاقی که میفته اینه:

دیگه سرویس ها همدیگه رو با نام هم میشناسن و نیازی نیست که بگی پورتش چیه. البته این رو وقتی ست میکنی باید به این موضوع هم توجه بکنی که hostname باید توی کل شبکه overlay تو unique باشه.

ست کردن env

برای ست کردن متغیر های محیطی، اینجا جایی هست که باید اونا رو ست بکنی.

ست کردن Dir

اینجا می‌تونی دایرکتوری کاری (محل ذخیره تنظیمات و فایل های کانتینر) کانتینر رو مشخص بکنی. محلشون رو این پایین آورده ایم:

  • nginx: /usr/share/nginx/html
  • wordpress: /var/www/html/wp-content
  • ghost: /var/lib/ghost/content
  • drupal: /var/www/html
  • joomla:
  • mysql: /var/lib/mysql
  • nodejs: /app

ست کردن User

ست کردن سطح دسترسی کاربر. ما اینجا مشخص می‌کنیم که سطح دسترسی کاربر برای read و write چقدر هست. برای اینکه موضوع رو بهتر بفهمید می‌تونید فایل /etc/passwd رو cat کنید تا یه خروجی مشابه خروجی زیر رو بهتون نشون بده:

root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin systemd-timesync:x:101:102:systemd Time ynchronization,,,:/run/systemd:/usr/sbin/nologin systemd-network:x:102:103:systemd Network anagement,,,:/run/systemd:/usr/sbin/nologin systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin messagebus:x:104:110::/nonexistent:/usr/sbin/nologin dnsmasq:x:105:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin avahi-autoipd:x:106:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin usbmux:x:107:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin rtkit:x:108:114:RealtimeKit,,,:/proc:/usr/sbin/nologin sshd:x:109:65534::/run/sshd:/usr/sbin/nologin pulse:x:110:118:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin speech-dispatcher:x:111:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false avahi:x:112:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin saned:x:113:121::/var/lib/saned:/usr/sbin/nologin colord:x:114:122:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin hplip:x:115:7:HPLIP system user,,,:/var/run/hplip:/bin/false lightdm:x:116:123:Light Display Manager:/var/lib/lightdm:/bin/false mjbkhorasani:x:1000:1000:mjbkhorasani,,,:/home/mjbkhorasani:/bin/bash systemd-coredump:x:999:999:systemd Core Dumper:/:/sbin/nologin postgres:x:117:124:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash geoclue:x:118:126::/var/lib/geoclue:/usr/sbin/nologin _rpc:x:119:65534::/run/rpcbind:/usr/sbin/nologin statd:x:120:65534::/var/lib/nfs:/usr/sbin/nologin

وقتی شما یک سرویس جدید مثل postgres رو روی سیستم عاملتون نصب می‌کنید براش یه کاربر جدید ساخته میشه با سطح دسترسی مشخص. این سطح دسترسی سطح دسترسی کاربر root نیست و هر کاری نمیتونه و فقط در همون حوزه ای که براش تعریف شده می‌تونه وارد عمل بشه.

این بخث بیشتر به این موضوع بر میگرده که یه سرویس جدید که میای نصب می‌کنی نیاد به همه چی دسترسی داشته باشه. یجورایی بحث امنیت هست. برای دیتای بیشتر این article رو مطالعه بکن. تو اینجا عددی که اول نوشته میشه همون UID هست.

ست کردن groups

مشخص کردن گروه کاربری یوزری که برای اون سرویس ساخته میشه. این گروه کاربری مشخص کننده سطوح دسترسی اون یوزر است. فرضا سرویس داکری mysql میسازی و توش یه یوزر تعریف میشه به اسم mysql

همون طوری که میبینید وقتی داخل کانتینر exec کردم و فایل مربوطه رو cat کردم.

ست کردن ست کردن TTY

فکر می‌کنم اینجا میاد یه ترمینال میسازه.

ست کردن OpenStdin

نمیدونم

ست کردن ReadOnly

میاد دسترسی به فایل سیستم روت اون کانتینر رو readonly میکنه.

ست کردن Mounts

برای مونت کردن دو روش داریم:

  • روش volume که تو این روش میایم یه تیکه از حافظه رو کنده و آن را به سرویس اختصاص میده

مثلا تو روش NFS میای یه استوریج مرکزی رو پارتیشن بندی میکنی بعد یکی از اون پارتیشن ها رو به یه جایی مونت می‌کنی. یعنی میایم هارد رو تیکه تیکه می‌کنیم و بعد روش فایل سیستم می‌کشیم، بعدش میای همون مسیر مونت شده رو، به یه دایرکتوری تو کامپیوتر کلاینت مونت می‌کنی.

نکته: اگه اون volume وجود نداشته باشه میاد برات ایجادش میکنه.

یعنی یک بار، وقتی فایل سیستم روی هارد می‌کشی مونت می‌کنی و بار دیگر روی سیستم کلاینت هم مونت می‌کنی. جهت مطالعه بیشتر.

  • روش bind که تو این روش یک مسیری از host داکر به مسیر Dir پیشفرض سرویس متصل میشه.

در این روش هم می‌تونی از NFS استفاده بکنی.

این بخش رو کامل نمیدونم

ست کردن Target توی Mounts

اینجی میایم target رو مشخص می‌کنیم. target همون مسیری هست که قراره فایل های پروژه توش نگهداری بشن و همین target هست که به volume مونت میشه. البته نکته قضیه اینه که نمیتونی کل / رو مونت بکنی.

/usr/share/nginx/html

ست کردن Source توی Mounts

اینجی میایم محل فیزیکی volume یا اسم volume ای که توی داکر ساختیم رو مشخص می‌کنیم که اگه مشخص نکنیم میاد طبق VolumeOptions برات یه volume میسازه و اسمشو هم یه چیز رندم میزاره.

ست کردن Type توی Mounts

اینجا هم نوع volume رو مشخص می‌کنیم. دو نوع volume و bind اینجا اومده

دو نوع دیگه volume اینان: tmpfs و npipe

ست کردن ReadOnly توی Mounts

کاربردشو نمیدونم ولی چیزی که مشخصه volume ای که به کانتینر میده رو readonly میکنه.

ست کردن Consistency توی Mounts

نمیدونم

ست کردن BindOptions توی Mounts

اگه نوع volume رو bind بزاری اینجا تنظیمات بیشتری می‌تونی اعمال بکنی. ولی ما از نوع volume استفاده می‌کنیم، به همین خاطر به این بخش زیاد پرداخته نمیشه.

نمیدونم

ست کردن VolumeOptions توی Mounts

تو این قسمت میای تنظیمات volume رو مشخص می‌کنی.

برای زمانی کاربرد داره که شما فرضا اول کانتینر/سرویس رو ساختی و حالا تو مسیر target یسری فایل داریم ولی بعد از یه مدتی میای بهش volume مونت کنی. حالا نمیخوای فایل/دایرکتوری هایی که توی target هستن توی volume کپی بشن. پس میای NoCopy رو true میکنی. رفرنس

ست کردن Label توی Mounts

نمیدونم

ست کردن Name و Options

توی Name میایم driver رو مشخص میکنیم. مثلا local ،convoy ،flocker ،vieux/sshfs ،cio و ...

توی Options میایم آپشن هایی که اون درایور قبول میکنن رو بهش میدیم. مثلا اگه از cio استفاده میکنی میتونی توش اینا رو بزاری:

Options: { &quotcapacity&quot: &quot1&quot, &quottype&quot: &quotssd&quot, &quotiopsmin&quot: &quot1000&quot, &quotiopsmax&quot: &quot2000&quot }

نمیدونم

نمیدونم.

مشخص کردن سیگنال ارسالی به سرویس وقتی که میخواد سرویس رو stop بکنه. البته هنوز درک نمیکنم وقتی که دستوری برای stop کردن سرویس های داکری نداریم کاربرد این بخش کجاست؟

CONT INT QUIT SIGHUP SIGKILL SIGSTOP SIGUSR1 STOP USR1

HUP KILL SIGCONT SIGINT SIGQUIT SIGTERM SIGUSR2 TERM USR2

مدت زمانی که صبر میشه قبل از kill کردن

...

ست کردن Hosts

فهماندن resolver داخلی. یعنی کانتینر ها بتونن از طریق اسم همدیگه رو ping بکنن.

ست کردن DNSConfig

تو اینجا resolver کل سیستم رو مشخص می‌کنیم. اینجی یا cloudflare استفاده می‌کنیم یا از DNS server داخلی.

فرض کن یه ssh-key تولید می‌کنی و می‌خوای اونو به صورت امن اینور و اونور بکنی تو بستر شبکه‌ی داکری. پس میای یه secret تو داکر create میکنی.

این هم یه آموزش برای ساخت secret

این هم یه آموزش برای تولید ssh key

فعلا نمیدونیم

نمیدونم. مقدار Container ID رو میگیره.

ست کردن Resources

این جا می‌تونی ریسورس رو مشخص بکنی

اینجا میای limit رو مشخص می‌کنی

  • ست کردن سی پی یو به نانو:هر یک میلیون مساوی با یک core
  • ست کردن مموری به بایت: هر یک میلیون مساوی با یک گیگ

نمیدونم

ست کردن Resources

تنظیم کردن راه اندازی مجدد

  • وقتی پروسه پروژه‌ی نود.جی‌اسیت به هر دلیلی exit میشه داکر سریعا میاد یه کانتینر جدید میسازه و بعدش قبلی رو که exit شده پاک می‌کنه.
  • توی اولی میای مشخص می‌کنی کی restart کنی.
  • توی دومی میای مدت زمانی که صبر بکنه تا کانتینر بیاد بالا و stable بشه رو مشخص می‌کنی
  • توی سوی تعداد دفعاتی رو که باید تلاش بکنه رو مشخص می‌کنی.

ست کردن Placement

تو اینجا میایم مشخص می‌کنیم که کانتینر های سرویس روی کدوم نود سوار بشه.

نمیدونم

نمیدونم

نمیدونم

اینجا میایم تنظیمات نتورک سرویس رو مشخص می‌کنیم. آرایه‌ای از آبجکت ها می‌گیره.

  • توی target میای نتورکی که مورد نظرت هست رو مشخص می‌کنی. مثلا یه وردپرس میاری بالا که که میخوای به یه دیتابیس وصلش کنی. اینجی باید وردپرس و دیتابیس تو یه شبکه باشن. یعنی اگه تو Env ها رو درست ست کنی و بیای hosts رو هم ست بکنی ولی تو یه شبکه نباشن همدیگه رو نمی‌فهمن
  • توی Aliases اسم سرویس تو شبکه رو مشخص می‌کنیم شاید یه چیزی شبیه فایل /etc/hosts
  • بخش DriverOpts هم نمیدونم.

اینجا میایم تعداد replica ها رو مشخص می‌کنیم تو مد Replicated.

تنظیم کردن نحوه‌ی آپدیت سرویس که تنظیماتش ایناس:

  • اولین مورد Parallelism : میاد میگه چند تا چند تا کانتینرا رو با هم آپدیت بکنیم
  • دومین مورد Delay : میاد بین آپدیت کردن کانتینرای سری اول با سری دوم و همین طور الی آخر فاصله میندازه. به نانو ثانیه.
  • سومین مورد FailureAction : میاد میگه اگه آپدیت کردن سرویس fail شد چکار بکنه. سه تا مقار داره: pause، continue و rollback
  • چهارمین مورد Monitor : شاید. تو اینجا میای میگی که تا کی مانیتور بکنه، اگه fail شد. برگرده.
  • پنجمین مورد MaxFailureRatio: نمیدونم ولی فکر کنم میزان خطا پذیری رو هنگام آپدیت کردن مشخص می‌کنه.

تو اینجا میای تنظیمات rollback رو مشخص می‌کنی

  • اولین مورد Parallelism : میاد میگه چند تا چند تا کانتینرا رو برگردونم
  • دومین مورد Delay : میاد بین برگردوندن کانتینرای سری اول با سری دوم و همین طور الی آخر فاصله میندازه. به نانو ثانیه.
  • سومین مورد FailureAction : میاد میگه اگه آپدیت کردن سرویس fail شد چکار بکنه. سه تا مقار داره: pause، continue و rollback
  • چهارمین مورد Monitor : شاید. تو اینجا میای میگی که تا کی مانیتور بکنه، اگه fail شد. برگرده.
  • پنجمین مورد MaxFailureRatio: نمیدونم ولی فکر کنم میزان خطا پذیری رو هنگام آپدیت کردن مشخص می‌کنه.

این Networks قبلا تو TaskTemplate هم اومده بود. اینجی چکار می‌کنه؟ چه فرقی با اون داره؟ همونه یا نه؟

اینجی میای پورت رو مشخص می‌کنی. سه تا بخش داره:

  • پروتکل رو مشخص می‌کنی. دو نوع بیشتر نمیتونه باشه: tcp یا udp
  • پورت برنامه رو مشخص می‌کنی (داخل خود کانتینر به کدوم پورت وصل بشه) مثلا تو Nginx پورت ۸۰ اشغال میشه.
  • پورت سرویس رو مشخص می‌کنی (از داخل خود داکر به کدوم پورت وصل بشه) ولی از بیرون با پورت ۸۹۸۹ میاد بیرون

sample json:

{ &quotName&quot: &quotsub.test.ir&quot, &quotLabels&quot: { &quotfoo&quot: &quotbar&quot }, &quotTaskTemplate&quot: { &quotContainerSpec&quot: { &quotImage&quot: &quotnginx:1.15.9&quot, &quotCommand&quot: [&quot&quot], &quotArgs&quot: [&quot&quot], &quotHostname&quot: &quot&quot &quotEnv&quot: [ &quotTEST1=1&quot, &quotTEST2=2&quot ], &quotDir&quot: &quot/usr/share/nginx/html&quot, &quotUser&quot: &quot33&quot, &quotGroups&quot: &quot33&quot, &quotTTY&quot: &quot?&quot, &quotOpenStdin&quot: &quot?&quot, &quotReadOnly&quot: &quot?&quot, &quotMounts&quot: [ { &quotReadOnly&quot: true, &quotSource&quot: &quotweb-data&quot, &quotTarget&quot: &quot/usr/share/nginx/html&quot, &quotType&quot: &quotvolume&quot, &quotLogDriver&quot: { &quotName&quot: &quotjson-file&quot, &quotOptions&quot: { &quotmax-file&quot: &quot3&quot, &quotmax-size&quot: &quot10M&quot } }, &quotVolumeOptions&quot: { &quotDriverConfig&quot: {}, &quotLabels&quot: { &quotcom.example.something&quot: &quotsomething-value&quot } } } ], &quotStopSignal&quot: &quot&quot, &quotStopGracePeriod&quot: 123, &quotHealthCheck&quot: [ { &quotcomming soon&quot: &quot&quot } ], &quotHosts&quot: [ &quot10.10.10.10 host1&quot, &quotABCD:EF01:2345:6789:ABCD:EF01:2345:6789 host2&quot ], &quotDNSConfig&quot: { &quotNameservers&quot: [ &quot8.8.8.8&quot ], &quotSearch&quot: [ &quotexample.org&quot ], &quotOptions&quot: [ &quottimeout:3&quot ] }, &quotSecrets&quot: [ { &quotFile&quot: { &quotName&quot: &quotwww.example.org.key&quot, &quotUID&quot: &quot33&quot, &quotGID&quot: &quot33&quot, &quotMode&quot: 384 }, &quotSecretID&quot: &quotfpjqlhnwb19zds35k8wn80lq9&quot, &quotSecretName&quot: &quotexample_org_domain_key&quot } ] }, &quotNetworkAttachmentSpec&quot: &quot&quot, &quotResources&quot: { &quotLimits&quot: { &quotNanoCPUs&quot: &quot30000000&quot, &quotMemoryBytes&quot: 104857600 }, &quotReservations&quot: {} }, &quotRestartPolicy&quot: { &quotCondition&quot: &quoton-failure&quot, &quotDelay&quot: 10000000000, &quotMaxAttempts&quot: 10 }, &quotPlacement&quot: {}, &quotForceUpdate&quot: 123, &quotRuntime&quot: &quot&quot, &quotNetworks&quot: [ { &quotTarget&quot: &quotnetwork name or id&quot, &quotAliases&quot: [&quotservice name in docker network&quot] } ], &quotLogDriver&quot: { &quotName&quot: &quotjson-file&quot, &quotOptions&quot: { &quotmax-file&quot: &quot3&quot, &quotmax-size&quot: &quot10M&quot } } }, &quotMode&quot: { &quotReplicated&quot: { &quotReplicas&quot: 1 } }, &quotUpdateConfig&quot: { &quotParallelism&quot: 1, &quotDelay&quot: 1000000000, &quotFailureAction&quot: &quotrollback&quot, &quotMonitor&quot: 15000000000, &quotMaxFailureRatio&quot: 0.15 }, &quotRollbackConfig&quot: { &quotParallelism&quot: 1, &quotDelay&quot: 1000000000, &quotFailureAction&quot: &quotrollback&quot, &quotMonitor&quot: 15000000000, &quotMaxFailureRatio&quot: 0.15 }, &quotEndpointSpec&quot: { &quotPorts&quot: [ { &quotProtocol&quot: &quottcp&quot, &quotPublishedPort&quot: 8080, &quotTargetPort&quot: 80 } ] } }

نکته: همه سرویس های دیتابیسی بهتره روی یک نود مشخص ساخته بشن. چرا که برای وصل شدن بهشون راحت تر هستیم و مدیریت آن‌ها ساده می‌شود. توجه کنید که مهم نیست IP کدوم نود رو میدهی چرا که حتی اگر IP یک نودی را بدهید که سرویس روی آن نیست (کانتینر روی آن ساخته نشده ولی manager هست) درخواست را سمت نودی ارسال می‌کند که کانتینر روی آن قرار دارد.

اگر چیزی میدانید به اشتراک بگذارید

dockerdocker apiswarmservicecreate service
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید