برنامه نویسی

تفاوت بین “افشای” و “انتشار” در داکر چیست؟

Docker ابزاری بسیار مفید برای اجرای برنامه های کاربردی در ظروف است. در بسیاری از پروژه ها شما از Docker برای اجرای کد خود در محیط های جدا شده استفاده می کنید. در این مقاله ، ما در مورد دو مفهوم مهم صحبت خواهیم کرد: افشای وت منتشر کردن در داکر من سعی می کنم از کلمات ساده و جملات کوتاه استفاده کنم. این راهنما به شکلی نوشته شده است که یک مبتدی بتواند آن را درک کند. من یک انگلیسی انگلیسی غیر بومی هستم و زبان خود را ساده نگه می دارم.

مقدمه

ظروف در توسعه نرم افزار فواید زیادی دارند. آنها به همان روش در رایانه های مختلف اجرا می شوند. Docker به شما در ساخت ، ارسال و اجرای ظروف کمک می کند. هنگامی که یک ظرف را اجرا می کنید ، ممکن است بخواهید نحوه صحبت با سایر ظروف یا دستگاه میزبان خود را کنترل کنید. دو راه برای انجام این کار با استفاده از دستورات است افشای وت منتشر کردن (یا -p پرچم). اگرچه به نظر می رسد مشابه هستند ، اما به روش های مختلفی کار می کنند.

بسیاری از افراد در مورد زمان استفاده از افشای و زمان استفاده از انتشار اشتباه گرفته می شوند. در این مقاله هر دو ایده با جزئیات توضیح داده خواهد شد. ما همچنین نمونه هایی با قطعه کد خواهیم دید. اگر می خواهید در مورد نحوه افشای پورت ها در Docker اطلاعات بیشتری کسب کنید ، می توانید این راهنما را در مورد قرار گرفتن درگاه ها در ظروف Docker بخوانید. نمای روشنی از مراحل مورد نیاز ارائه می دهد.

چه چیزی در Docker قرار دارد؟

دستورالعمل Expose در یک dockerfile استفاده می شود. این فرمان است که به Docker می گوید که ظرف در زمان اجرا روی یک درگاه خاص گوش می دهد. وقتی یک dockerfile می نویسید ، می توانید خطی مانند:

EXPOSE 8080
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این دستور فقط اطلاعاتی است. در واقع بندر را منتشر نمی کند. در عوض ، این به عنوان مستنداتی برای افرادی که به Dockerfile شما نگاه می کنند ، خدمت می کند. آنها می توانند ببینند که ظرف شما از کدام پورت انتظار دارد از آن استفاده کند.

Expose نحوه اجرای کانتینر را تغییر نمی دهد. این پورت را روی دستگاه میزبان شما باز نمی کند. این به سادگی به Docker و سایر توسعه دهندگان می گوید که این کانتینر در پورت 8080 گوش می دهد. این می تواند به شما در هنگام برنامه ریزی شبکه کانتینر یا هنگام استفاده از ابزارهای ارکستراسیون کمک کند. این یک یادداشت ساده و مفید در Dockerfile شماست.

اگر ظرف شما از درگاه های زیادی استفاده می کند ، ممکن است بیش از یک دستورالعمل در معرض اضافه کنید. هر خط پورت متفاوتی را می گوید که برنامه در آن گوش می دهد. به عنوان مثال:

EXPOSE 8080
EXPOSE 443
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این خطوط به این معنی است که ظرف شما برای یک نوع ترافیک و پورت 443 برای اتصالات ایمن در بندر 8080 گوش می دهد. توجه داشته باشید که حتی اگر این درگاه ها در معرض دید قرار بگیرند ، تا زمانی که آنها را منتشر نکنید ، از دستگاه میزبان در دسترس نیستند.

انتشار در Docker چیست؟

انتشار پورت یک فرایند متفاوت است. این اتفاق می افتد وقتی یک ظرف را اجرا می کنید. وقتی از شما استفاده می کنید -p پرچم ، Docker نقشه ای را بین یک درگاه روی میزبان و یک درگاه روی ظرف ایجاد می کند. به عنوان مثال:

docker run -d -p 8080:8080 my_image
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این دستور به داکر می گوید که پورت 8080 از ظرف را به بندر 8080 در میزبان منتشر کند. حال اگر مرورگر خود را باز کرده و به http: // localhost: 8080 بروید ، می توانید برنامه را در ظرف مشاهده کنید.

عملیات انتشار یک تغییر فعال است. این درگاه ظرف را به درگاه روی دستگاه میزبان وصل می کند. این بدان معنی است که برنامه در خارج از محیط کانتینر قابل دسترسی است. انتشار هنگامی که می خواهید سرویس کانتینر شده خود را با سایر سیستم ها یا کاربران به اشتراک بگذارید ، لازم است.

وقتی پورت را منتشر می کنید ، می توانید شماره پورت را روی میزبان نیز تغییر دهید. به عنوان مثال:

docker run -d -p 9090:8080 my_image
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این حالت ، کانتینر هنوز در پورت 8080 گوش می دهد. این مفید است اگر شما قبلاً چیزی را در پورت 8080 در میزبان اجرا کنید. این انعطاف پذیری بیشتری را در نحوه ترتیب تنظیمات شبکه خود به شما می دهد.

تفاوت های کلیدی بین افشای و انتشار

درک این موضوع مهم است افشای وت منتشر کردن اهداف مختلفی را ارائه دهید:

  • افشای در Dockerfile استفاده می شود. این فقط اطلاع می دهد که ظرف از درگاه خاصی استفاده می کند. این پورت را به خودی خود از میزبان در دسترس قرار نمی دهد. مانند یک یادداشت در Dockerfile است.
  • منتشر کردن در زمان اجرا استفاده می شود. این یک درگاه کانتینر را به درگاه روی دستگاه میزبان نقشه می کند. این باعث می شود برنامه از خارج از ظرف قابل دسترسی باشد.

به عبارت دیگر ، افشای اعلامیه است. این به توسعه دهندگان و ابزارهای Docker می گوید که به کانتینر نیاز دارد. انتشار یک عمل است. این درب را بین ظرف و دستگاه میزبان باز می کند.

یک توضیح خوب در مورد درگاه های کانتینر Docker نشان می دهد که درگاه ها نقش مهمی در ارتباطات کانتینر دارند. بدون قرار گرفتن صحیح یا انتشار بنادر ، ظروف نمی توانند به خوبی با یکدیگر یا با دنیای خارج ارتباط برقرار کنند.

چگونه کار را با هم در معرض نمایش و انتشار قرار دهید

هنگامی که یک Dockerfile می نویسید ، در معرض نمایش قرار می دهید تا پورت هایی را که از برنامه شما استفاده می کند نشان دهد. بعداً ، هنگامی که ظرف خود را اجرا می کنید ، تصمیم می گیرید که آیا می خواهید آن پورت ها در دستگاه میزبان شما در دسترس باشد. در بسیاری موارد ، در صورت نیاز به دسترسی به برنامه شما توسط کاربران یا سایر خدمات ، ممکن است بخواهید پورت را منتشر کنید.

به عنوان مثال ، یک برنامه وب را در نظر بگیرید که در پورت 80 گوش می دهد. در Dockerfile شما ، ممکن است داشته باشید:

FROM nginx:latest
EXPOSE 80
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این نشان می دهد که سرور NGINX در داخل کانتینر در پورت 80 گوش می کند. سپس ، وقتی ظرف خود را اجرا می کنید ، ممکن است استفاده کنید:

docker run -d -p 8080:80 my_nginx_image
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در حال حاضر ، Docker Port 8080 را روی میزبان خود به پورت 80 در ظرف نقشه می کند. بدون پرچم انتشار (-P) ، حتی اگر بندر در Dockerfile در معرض دید قرار گیرد ، ظرف از خارج قابل دسترسی نخواهد بود. یک آموزش در مورد قرار گرفتن درگاه های کانتینر Docker در میزبان جزئیات بیشتری در مورد نحوه تنظیم این نقشه برداری ارائه می دهد.

نمونه های کد و سناریوهای عملی

بگذارید به برخی از نمونه های عملی نگاه کنیم. فرض کنید برای یک برنامه وب ساده یک dockerfile دارید:

FROM node:14
WORKDIR /app
COPY . /app
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این Dockerfile ، دستور Expose می گوید که برنامه در پورت 3000 گوش می کند. با این حال ، اگر تصویر را بسازید و بدون انتشار آن را اجرا کنید ، نمی توانید از مرورگر خود به برنامه وب دسترسی پیدا کنید. برای انتشار بندر ، شما اجرا می کنید:

docker run -d -p 3000:3000 my_node_app
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، این برنامه در میزبان شما در پورت 3000 موجود است. این مثال نشان می دهد که چگونه کار را به طور همزمان منتشر و منتشر می کند. قرار گرفتن در Dockerfile مانند یک راهنما است. پرچم انتشار در دستور Docker Run همان چیزی است که آن را در واقع در دسترس قرار می دهد.

بعضی اوقات ، مردم گیج می شوند و فکر می کنند که استفاده از قرار گرفتن در Dockerfile به طور خودکار پورت را باز می کند. این کار نمی کند اگر می خواهید دسترسی خارجی داشته باشید ، همیشه باید پورت را منتشر کنید. بینش در مورد ارتباطات کانتینر می تواند به شما کمک کند درک کنید که چگونه ظروف با یکدیگر صحبت می کنند و چرا به نقشه برداری پورت نیاز است.

چه زمانی از Expose استفاده کنید و چه موقع از انتشار استفاده کنید

به عنوان یک مبتدی ، ممکن است تعجب کنید که چه موقع از یکی یا دیگری استفاده کنید. در اینجا چند دستورالعمل آورده شده است:

  1. برای اسناد و مدارک در Dockerfile از Expose استفاده کنید:

    همیشه دستورالعمل افشا را در dockerfile خود وارد کنید. این به عنوان یادآوری اینکه کدام پورت از برنامه شما استفاده می کند عمل می کند. همچنین به دیگران که Dockerfile شما را می خوانند کمک می کند. آنها می توانند به سرعت ببینند که ارتباطات شبکه انتظار می رود.

  2. هنگام اجرای کانتینر از انتشار استفاده کنید:

    هنگامی که به برنامه خود نیاز دارید تا در دسترس سایر سیستم ها باشد ، از پرچم -p در دستور docker run استفاده کنید. این دستور به Docker می گوید که یک درگاه کانتینر را به درگاه میزبان وصل کند. اگر می خواهید کاربران یا خدمات به برنامه خود دسترسی پیدا کنند ، لازم است.

  3. توسعه و آزمایش:

    در توسعه ، شما فقط ممکن است به کانتینر نیاز داشته باشید تا با سایر ظروف در همان شبکه صحبت کنید. در این حالت ، شما ممکن است بدون انتشار به دستور Expose اعتماد کنید. اما اگر نیاز به آزمایش برنامه از مرورگر خود دارید ، باید پورت را منتشر کنید.

  4. استقرار تولید:

    در تولید ، شما معمولاً بنادر را منتشر می کنید. همچنین ممکن است از ابزارهای ارکستراسیون استفاده کنید که دستورالعمل Expose را برای تنظیم شبکه می خوانند. با این حال ، اتصال نهایی با انتشار انجام می شود.

مقاله در مورد ایجاد Dockerfile مثال خوبی از نحوه نوشتن Dockerfile با دستور Expose ارائه می دهد. این دستورالعمل های گام به گام را نشان می دهد که برای مبتدیان مفید است.

تفاوت در جزئیات

بگذارید تفاوتهای کلیدی را خلاصه کنیم:

  • ماهیت بهره برداری:

    Expose یک اعلامیه استاتیک در dockerfile شماست. این هیچ تغییر در زمان اجرا ایجاد نمی کند. انتشار یک عملیات پویا است که در استارتاپ کانتینر انجام می شود.

  • دسترسی:

    با قرار گرفتن در معرض ، این بندر فقط به Docker شناخته شده است و برای پیوند دادن ظروف در دسترس است. با انتشار ، بندر روی میزبان باز است. این باعث می شود برنامه شما از خارج از شبکه کانتینر در دسترس باشد.

  • مستندات در مقابل عمل:

    Expose مانند یک یادداشت در پروژه شماست. این به دیگران می گوید که کانتینر شما را در چه مواردی گوش می دهد. انتشار یک عمل واقعی است که یک شبکه را تنظیم می کند.

  • پیکربندی استفاده:

    هنگامی که از سیستم های ارکستراسیون مانند Docker Compose یا Kubernetes استفاده می کنید ، دستور Expose را می توان به عنوان بخشی از پیکربندی خوانده کرد. با این حال ، شما هنوز هم باید نقشه برداری پورت (انتشار) را پیکربندی کنید تا از خارج از ظرف استفاده شود.

این اختلافات ممکن است در ابتدا کوچک به نظر برسد اما هنگام طراحی سیستم های کانتینر شده بسیار مهم است. استفاده صحیح از آنها می تواند به شما در جلوگیری از مشکلات مربوط به اتصال شبکه کمک کند. همچنین باعث می شود پیکربندی کانتینر شما واضح تر و قابل حفظ باشد.

ملاحظات اضافی

هنگام کار با Docker ، ممکن است با سایر اصطلاحات و دستورات مرتبط با شبکه نیز روبرو شوید. به عنوان مثال ، Docker به شما امکان می دهد شبکه های سفارشی ایجاد کنید تا ظروف بتوانند به راحتی با یکدیگر ارتباط برقرار کنند. این به ویژه هنگامی که بسیاری از ظروف را با هم اجرا می کنید مفید است. درک نحوه افشای و انتشار پورت ها تنها بخشی از شبکه Docker است.

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

علاوه بر این ، پورت منتشر شده را می توان در یک درگاه میزبان متفاوت از درگاه کانتینر ترسیم کرد. اگر در میزبان خود درگیری داشته باشید ، این مفید است. به عنوان مثال ، اگر دو ظرف هر دو درگاه 80 را در معرض دید خود قرار دهید ، می توانید یک ظرف را با آن منتشر کنید -p 8080:80 و دیگری با -p 8081:80بشر این تکنیک به مدیریت چندین سرویس در یک میزبان کمک می کند.

نمونه های دنیای واقعی

بگذارید یک سناریوی در دنیای واقعی را در نظر بگیریم. تصور کنید که شما یک معماری میکروسرویس دارید. یک سرویس یک سرور وب و دیگری یک پایگاه داده است. سرور وب ممکن است پورت 80 را در داخل ظرف قرار دهد. این پایگاه داده ممکن است در پورت 3306 گوش کند. در Dockerfile شما برای سرور وب ، شما را شامل می شود:

EXPOSE 80
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای پایگاه داده ، ممکن است شامل موارد زیر شوید:

EXPOSE 3306
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

هنگام اجرای ظروف ، می خواهید وب سرور در دسترس مشتریان باشد. شما اجرا می کنید:

docker run -d -p 8080:80 web_image
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در اینجا ، بندر 8080 روی میزبان به پورت 80 در ظرف وب نقشه برداری می شود. این بانک اطلاعاتی فقط توسط سرور وب قابل استفاده است. در این حالت ، شما پورت پایگاه داده را منتشر نمی کنید. سرور وب و پایگاه داده می توانند با استفاده از شبکه Docker در داخل ارتباط برقرار کنند. این تنظیم به محافظت از پایگاه داده در برابر دسترسی خارجی کمک می کند.

در مورد دیگر ، اگر می خواهید از خارج برای آزمایش به پایگاه داده دسترسی پیدا کنید ، ممکن است اجرا کنید:

docker run -d -p 3307:3306 db_image
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، بندر 3307 روی میزبان شما به بندر 3306 در ظرف پایگاه داده نقشه برداری می شود. می توانید با استفاده از این درگاه میزبان به پایگاه داده متصل شوید. این مثالها نشان می دهد که چگونه پورت های انتشار نحوه دسترسی به خدمات را تغییر می دهد.

بهترین روشها برای استفاده از افشای و انتشار

در اینجا برخی از بهترین روشها برای دنبال کردن وجود دارد:

  • همیشه در Dockerfile خود را در معرض نمایش قرار دهید:

    این یک عادت خوب است که مستند کنید که درگاه شما از برنامه استفاده می کند. این امر درک دیگران را برای دیگران آسان تر می کند.

  • فقط در صورت لزوم منتشر کنید:

    اگر نیازی به دسترسی خارجی ندارید ، پورت ها را منتشر نکنید. این می تواند امنیت را بهبود بخشد. از انتشارات فقط برای خدماتی که باید از خارج به آنها دسترسی پیدا کنید استفاده کنید.

  • از نقشه های بندر روشن استفاده کنید:

    وقتی پورت را منتشر می کنید ، بنادر میزبان را انتخاب کنید که با سایر خدمات مغایرت ندارند. این از سردرگمی و درگیری های بندری جلوگیری می کند.

  • پیکربندی خود را ساده نگه دارید:

    از استفاده از درگاه های بیش از حد خودداری کنید مگر اینکه لازم باشد. تنظیمات ساده برای مدیریت و عیب یابی آسان تر است.

  • تنظیمات شبکه خود را آزمایش کنید:

    همیشه در صورتی که پورت های منتشر شده مطابق انتظار کار می کنند ، آزمایش کنید. از دستوراتی مانند استفاده کنید curl یا یک مرورگر وب برای بررسی دسترسی. این کمک می کند تا زود هنگام خطا کنید.

چگونه این گزینه ها بر ارتباط کانتینر تأثیر می گذارد

درک افشای و انتشار برای ارتباطات کانتینر بسیار مهم است. هنگامی که ظروف در همان شبکه اجرا می شوند ، می توانند با استفاده از نام کانتینر یا آدرس IP خود ارتباط برقرار کنند. دستور Expose به مستند کردن این پورت ها کمک می کند. با این حال ، هنگامی که شما می خواهید دستگاه های خارجی یا کاربران به یک کانتینر دسترسی پیدا کنند ، انتشار لازم است.

در بسیاری از موارد ، ظروف بدون درگاه های منتشر شده ارتباط برقرار می کنند. به عنوان مثال ، در یک مجموعه آهنگسازی Docker ، خدمات می توانند با استفاده از نام سرویس با یکدیگر صحبت کنند. این ارتباط داخلی نیازی به انتشار بندر ندارد. با این حال ، اگر شما نیاز به دسترسی به یکی از این خدمات از خارج از شبکه دارید ، باید بندر را منتشر کنید.

این ایده در توضیح مفصلی در مورد درگاه های کانتینر Docker به خوبی توضیح داده شده است. این نشان می دهد که درگاه های کانتینر و درگاه های میزبان می توانند در هدف و تنظیم آنها بسیار متفاوت باشند.

با استفاده از Expose and Publish in Docker Compose

بسیاری از پروژه ها برای مدیریت چندین ظروف از آهنگسازی Docker استفاده می کنند. در یک فایل آهنگسازی ، می توانید تنظیمات Expose و Publish را تعریف کنید. اگرچه دستورالعمل افشای معمولاً در dockerfile است ، می توانید نقشه برداری پورت را در پرونده آهنگسازی مانند این تنظیم کنید:

version: "3"
services:
  web:
    image: my_web_image
    ports:
      - "8080:80"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این پیکربندی پورت 80 را از ظرف تا پورت 8080 در میزبان منتشر می کند. دستور Expose در Dockerfile می گوید که کانتینر در پورت 80 گوش می کند و پرونده آهنگسازی نقشه برداری را انجام می دهد. این جداسازی پیکربندی را انعطاف پذیر و واضح می کند.

عیب یابی مسائل مربوط به بندر

بعضی اوقات ، ممکن است کارها همانطور که انتظار می رفت کار نکند. در اینجا چند نکته برای عیب یابی آورده شده است:

  1. Dockerfile خود را بررسی کنید:

    اطمینان حاصل کنید که دستورالعمل افشای صحیح را دارید. اگر شماره پورت اشتباه دارید ، می تواند باعث سردرگمی شود.

  2. دستور Docker Run را مرور کنید:

    هنگام اجرای کانتینر ، بررسی کنید که از پرچم انتشار صحیح استفاده کرده اید. به عنوان مثال ، آن را تأیید کنید -p 8080:80 درگاه های مناسب را نقشه برداری می کند.

  3. از بازرسی Docker استفاده کنید:

    دویدن docker inspect برای دیدن تنظیمات شبکه. این دستور اتصال پورت را به شما نشان می دهد.

  4. تست با دستورات ساده:

    در داخل یک ظرف ، از دستوراتی مانند استفاده کنید curl localhost:80 برای دیدن اینکه آیا این سرویس در پورت مورد انتظار کار می کند یا خیر.

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

خلاصه و افکار نهایی

به طور خلاصه ، افشای وت منتشر کردن دو روش مختلف برای رسیدگی به درگاه ها در Docker هستند. Expose یک اعلامیه استاتیک در Dockerfile است. این به دیگران می گوید که از کدام درگاه استفاده می کند. انتشار در زمان اجرا استفاده می شود. این پورت های کانتینر را برای میزبانی درگاه ها نقشه می کند و برنامه را در خارج از کشور قابل دسترسی می کند.

استفاده از Expose مانند اضافه کردن نظر در Dockerfile است. برای اسناد و ارتباطات داخلی خوب است. انتشار درگاه ها یک عمل فعال است که باعث ایجاد یک شبکه می شود. لازم است وقتی می خواهید سرویس شما توسط کاربران یا سیستم های دیگر استفاده شود.

هنگامی که شما در حال ساخت برنامه های کانتینر هستید ، هر دو دستور مهم هستند. آنها با هم کار می کنند تا اطمینان حاصل شود که برنامه شما به درستی در محیط های مختلف اجرا می شود. اگر به نمونه های بیشتری از نحوه کار Docker نیاز دارید ، ممکن است یک راهنمای جامع در مورد ایجاد Dockerfile را نیز مرور کنید. این نشان می دهد که چگونه دستورالعمل های ساده می توانند یک ظرف مفید بسازند.

درک این تفاوت ها به شما در ایجاد برنامه های بهتر کمک می کند. همیشه به یاد داشته باشید که پیکربندی خود را ساده و روشن نگه دارید. آزمایش تنظیمات شما تضمین می کند که در صورت لزوم برنامه شما در دسترس باشد.

امیدوارم این مقاله به شما در درک تفاوت بین قرار گرفتن در معرض و انتشار بنادر در داکر کمک کرده باشد. با تمرین ، با این تنظیمات راحت تر خواهید شد. Docker ابزاری قدرتمند است و دانستن این اصول اولیه به شما در سفر یادگیری کمک می کند.

برای اطلاعات بیشتر در مورد نحوه نقشه برداری درگاه ها و بهبود ارتباطات کانتینر ، ممکن است راهنمای قرار گرفتن درگاه ها در ظروف داکر بسیار مفید باشد. این نمونه های گام به گام را ارائه می دهد که می تواند به شما در تنظیم صحیح ظروف خود کمک کند.

با تشکر از شما برای خواندن این مقاله من امیدوارم که کلمات ساده و نمونه های واضح من این موضوع را برای درک شما آسانتر کرده باشد. به تمرین و آزمایش ظروف Docker خود ادامه دهید. با کسب تجربه ، یاد خواهید گرفت که از Expose استفاده کرده و به طور مؤثرتری در پروژه های خود منتشر کنید. کانتینر شدن مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا