moh3n.niknezhad
moh3n.niknezhad
خواندن ۱۱ دقیقه·۵ سال پیش

داکر در عمل ::‌ درک انعطاف پذیری کانتینرها

بهترین راه برای فهمیدن اینکه چرا به سادگینمیتوان کانتینرها دارای محدودیت مانند NGINX را ایجاد کرد بهتر است بگذاریم خودتان با ایده خودتان که قطعاً بد خواهد بود امتحان کنید:

docker run -d --name webid nginx 1 docker run -d --name webid nginx 2

در هنگام اجرای دستور دوم به خاطر تداخل دستورات با خطایی مانند خطای زیر روبرو خواهیدشد:

FATA[0000] Error response from daemon: Conflict. The name &quotwebid&quot is already in use by container 2b5958ba6a00. You have to delete (or rename) that container to be able to reuse that name.

استفاده از اسامی کانتینر ثابت مانند وب برای آزمایش و مستندات مفید است ، اما در سیستمی با چندین کانتینر ، استفاده از نامهای ثابت مانند آن می تواند درگیری ایجاد کند.به طور پیش فرض ، داکر به هر کانتینری كه ایجاد می كند نامی منحصر به فرد (انسان دوستانه) اختصاص می دهد.با استفاده از ویژگی دیگر نیازی به استفاده از نشان --name نمی باشد.اگر شرایطی ایجاد شد که نیاز به تغییر نام یک کانتینر داشتید می توانید از دستور docker rename استفاده کنید:

docker rename webid webid-old 1 docker run -d --name webid nginx 2
  1. در دستور اول webid به webid-old تغییر نام داده می شود.
  2. در دستور دوم یک کانتینر با نام webid ایجاد می شود.

تغییر نام کانتینرها می تواند به کاهش تعارضات نامگذاری یک طرفه کمک کند اما در وهله اول کمک چندانی به جلوگیری از بروز مشکل نمی کند.علاوه بر نام ، Docker شناسه منحصر به فردی را اختصاص می دهد که در مثال اول به آن اشاره شد.این اعداد 1024 بیتی رمزگذاری شده هگز شده و چیزی شبیه به این است:

7cb5d2b9a7eab87f07182b5bf58936c9947890995b1b94f412912fa822a9ecb5

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

docker exec \ 7cb5d2b9a7eab87f07182b5bf58936c9947890995b1b94f412912fa822a9ecb5 \ echo hello docker stop \ 7cb5d2b9a7eab87f07182b5bf58936c9947890995b1b94f412912fa822a9ecb5

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

docker exec 7cb5d2b9a7ea ps docker stop 7cb5d2b9a7ea

هیچ یک از این شناسه ها به خصوص برای استفاده انسان مناسب نیستند.اما آنها با اسکریپت ها و تکنیک های اتوماسیون خوب کار می کنند.Docker برای دستیابی به شناسه یک کانتینر چندین وسیله مختلف دارد تا اتوماسیون امکان پذیر باشد.در این موارد از شناسه عددی کامل یا کوتاه استفاده می شود.

اولین روش برای بدست آوردن شناسه عددی یک کانتینر ، صرفاً شروع یا ایجاد یک مورد جدید و اختصاص نتیجه دستور به متغیر shell است.همانطور که قبلاً دیدید ، هنگامی که یک کانتینر جدید در حالت جداگانه شروع می شود ، شناسه کانتینر به ترمینال (stdout) نوشته می شود.اگر این تنها راه برای دریافت شناسه در زمان ایجاد بود، قادر به استفاده از این کانتینرهای تعاملی نخواهید بود(منظور ایجاد کانتینرها بدون اجرا ).خوشبختانه می‌توانید از یک فرمان دیگر برای ایجاد یک ظرف بدون شروع آن استفاده کنید.فرمان docker create شبیه به docker run است ، تفاوت اصلی این است که ظرف در حالت متوقف ایجاد می شود:

docker create nginx

نتیجه باید مانند این خط باشد:

b26a631e536d3caae348e9fd36e7661254a11511eb2274fb55f9f7c788721b0d

اگر از پوسته فرمان Linux مانند sh یا bash استفاده می کنید ، می توانید نتیجه را به متغیر پوسته اختصاص دهید و بعداً دوباره از آن استفاده کنید:

CID=$(docker create nginx:latest) 1 echo $CID
  1. این روی پوسته های سازگار با POSIX کار خواهد کرد.

متغیرهای شل یک فرصت جدید برای تعارض ایجاد می‌کنند، اما دامنه آن تعارض محدود به نشست پایانه یا محیط پردازش فعلی است که در آن متن راه‌اندازی شد.آن تعارضات باید به راحتی قابل اجتناب باشند چون یک برنامه یا برنامه مدیریت آن محیط را مدیریت می‌کند.مشکلی که در این رویکرد وجود دارد این است که اگر چندین کاربر یا فرآیندهای خودکار نیاز به اشتراک این اطلاعات داشته باشند، به این مساله کمک نخواهد کرد.در این موارد ، می توانید از شناسه کانتینر (CID) استفاده کنید.

هر دو دستور docker run و docker create از یک پارامتر خاص برای این منظور استفاده می کنند:

docker create --cidfile /tmp/web.cid nginx 1 cat /tmp/web.cid 2
  1. یک کانتینر متوقف شده جدید ایجاد می کند.
  2. فایل ایجاد شده را باز می کند.

بهترین راه برای فهمیدن اینکه چرا به سادگینمیتوان کانتینرها دارای محدودیت مانند NGINX را ایجاد کرد بهتر است بگذاریم خودتان با ایده خودتان که قطعاً بد خواهد بود امتحان کنید:

docker run -d --name webid nginx 1 docker run -d --name webid nginx 2

یک کانتینر با نام webid ایجاد می کندیک کانتینر دیکر با همان نام ایجاد میکند.در هنگام اجرای دستور دوم به خاطر تداخل دستورات با خطایی مانند خطای زیر روبرو خواهید شد:

FATA[0000] Error response from daemon: Conflict. The name &quotwebid&quot is already in use by container 2b5958ba6a00. You have to delete (or rename) that container to be able to reuse that name.

استفاده از اسامی کانتینر ثابت مانند وب برای آزمایش و مستندات مفید است ، اما در سیستمی با چندین کانتینر ، استفاده از نامهای ثابت مانند آن می تواند درگیری ایجاد کند.به طور پیش فرض ، داکر به هر کانتینری كه ایجاد می كند نامی منحصر به فرد (انسان دوستانه) اختصاص می دهد.با استفاده از ویژگی دیگر نیازی به استفاده از نشان --name نمی باشد.اگر شرایطی ایجاد شد که نیاز به تغییر نام یک کانتینر داشتید می توانید از دستور docker rename استفاده کنید:

docker rename webid webid-old 1 docker run -d --name webid nginx 2

در دستور اول webid به webid-old تغییر نام داده می شود.در دستور دوم یک کانتینر با نام webid ایجاد می شود.تغییر نام کانتینرها می تواند به کاهش تعارضات نامگذاری یک طرفه کمک کند اما در وهله اول کمک چندانی به جلوگیری از بروز مشکل نمی کند.علاوه بر نام ، Docker شناسه منحصر به فردی را اختصاص می دهد که در مثال اول به آن اشاره شد.این اعداد 1024 بیتی رمزگذاری شده هگز شده و چیزی شبیه به این است:

7cb5d2b9a7eab87f07182b5bf58936c9947890995b1b94f412912fa822a9ecb5

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

docker exec \ 7cb5d2b9a7eab87f07182b5bf58936c9947890995b1b94f412912fa822a9ecb5 \ echo hello docker stop \ 7cb5d2b9a7eab87f07182b5bf58936c9947890995b1b94f412912fa822a9ecb5

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

docker exec 7cb5d2b9a7ea ps docker stop 7cb5d2b9a7ea

هیچ یک از این شناسه ها به خصوص برای استفاده انسان مناسب نیستند.اما آنها با اسکریپت ها و تکنیک های اتوماسیون خوب کار می کنند.Docker برای دستیابی به شناسه یک کانتینر چندین وسیله مختلف دارد تا اتوماسیون امکان پذیر باشد.در این موارد از شناسه عددی کامل یا کوتاه استفاده می شود.اولین روش برای بدست آوردن شناسه عددی یک کانتینر ، صرفاً شروع یا ایجاد یک مورد جدید و اختصاص نتیجه دستور به متغیر shell است.همانطور که قبلاً دیدید ، هنگامی که یک کانتینر جدید در حالت جداگانه شروع می شود ، شناسه کانتینر به ترمینال (stdout) نوشته می شود.اگر این تنها راه برای دریافت شناسه در زمان ایجاد بود، قادر به استفاده از این کانتینرهای تعاملی نخواهید بود(منظور ایجاد کانتینرها بدون اجرا ).خوشبختانه می‌توانید از یک فرمان دیگر برای ایجاد یک ظرف بدون شروع آن استفاده کنید.فرمان docker create شبیه به docker run است ، تفاوت اصلی این است که ظرف در حالت متوقف ایجاد می شود:

docker create nginx

نتیجه باید مانند این خط باشد:

b26a631e536d3caae348e9fd36e7661254a11511eb2274fb55f9f7c788721b0d

اگر از پوسته فرمان Linux مانند sh یا bash استفاده می کنید ، می توانید نتیجه را به متغیر پوسته اختصاص دهید و بعداً دوباره از آن استفاده کنید:

CID=$(docker create nginx:latest) 1 echo $CID

1. این روی پوسته های سازگار با POSIX کار خواهد کرد.

متغیرهای شل یک فرصت جدید برای تعارض ایجاد می‌کنند، اما دامنه آن تعارض محدود به نشست پایانه یا محیط پردازش فعلی است که در آن متن راه‌اندازی شد.آن تعارضات باید به راحتی قابل اجتناب باشند چون یک برنامه یا برنامه مدیریت آن محیط را مدیریت می‌کند.مشکلی که در این رویکرد وجود دارد این است که اگر چندین کاربر یا فرآیندهای خودکار نیاز به اشتراک این اطلاعات داشته باشند، به این مساله کمک نخواهد کرد.در این موارد ، می توانید از شناسه کانتینر (CID) استفاده کنید.هر دو دستور docker run و docker create از یک پارامتر خاص برای این منظور استفاده می کنند:

docker create --cidfile /tmp/web.cid nginx 1 cat /tmp/web.cid 2

1. یک کانتینر متوقف شده جدید ایجاد می کند.

2.فایل ایجاد شده را باز می کند.

این ویژگی مانند استفاده از متغیرهای shell، این فرصت را برای تعارض افزایش می‌دهد. نام پرونده CID (که پس از cidfile-- ارایه شده‌است)باید شناخته شود یا ساختار شناخته‌شده‌ای داشته باشد.درست مانند نامگذاری یک کانتینر دستی، این روش از نام‌های شناخته‌شده در فضای نامی سراسری (docker - wide)استفاده می‌کند.خبر خوب این است که اگر این پرونده قبلاً وجود داشته باشد ، داکر با استفاده از پرونده CID ارائه شده ، ظرف جدیدی ایجاد نخواهد کرد.این فرمان درست مانند زمانی که شما دو کانتینر با همان نام ایجاد می‌کنید، شکست خواهد خورد.یکی از دلایل استفاده از فایلهای CID به جای اسم این است که پرونده های CID را می توان به راحتی با کانتینرها به اشتراک گذاشت و برای آن کانتینر تغییر نام داد.با استفاده از یک ویژگی Docker به نام volume ، که به آن خواهیم بعدا به آن خواهیم پرداخت.
نام پرونده CID (که پس از cidfile-- ارایه شده‌است)باید شناخته شود یا ساختار شناخته‌شده‌ای داشته باشد.درست مانند نامگذاری یک کانتینر دستی، این روش از نام‌های شناخته‌شده در فضای نامی سراسری (docker - wide)استفاده می‌کند.خبر خوب این است که اگر این پرونده قبلاً وجود داشته باشد ، داکر با استفاده از پرونده CID ارائه شده ، ظرف جدیدی ایجاد نخواهد کرد.این فرمان درست مانند زمانی که شما دو کانتینر با همان نام ایجاد می‌کنید، شکست خواهد خورد.یکی از دلایل استفاده از فایلهای CID به جای اسم این است که پرونده های CID را می توان به راحتی با کانتینرها به اشتراک گذاشت و برای آن کانتینر تغییر نام داد.با استفاده از یک ویژگی Docker به نام volume ، که به آن خواهیم بعدا به آن خواهیم پرداخت.

نکته:یک استراتژی برای رسیدگی به مشکلات تداخلات در فایل های CID عبارت است از تقسیم فضای نام با استفاده از قراردادهای معروف یا قابل‌پیش‌بینی.برای مثال، در این سناریو، شما ممکن است از مسیری استفاده کنید که شامل همه کانتینرها تحت یک دایرکتوری مشخص باشد و قسمت بعدی آن دایرکتوری را با شناسه مشتری تقسیم کنید. نتیجه این عمل چیزی شبیه این است
/containers/web/customer1/web.cid
یا
/containers/web/customer8/web.cid

در موارد دیگر ، می توانید از دستورات دیگری مانند docker ps برای دریافت شناسه یک ظرف استفاده کنید. به عنوان مثال ، اگر می خواهید شناسه مختصر آخرین ظرف ایجاد شده را بدست آورید ، می توانید از این موارد استفاده کنید:

CID=$(docker ps --latest --quiet) 1 echo $CID CID=$(docker ps -l -q) 2 echo $CID

۱. این روی پوسته های سازگار با POSIX کار خواهد کرد.
۲. مانند دستور بالا اما در فرم مختصر نوشته شده است.

نکته: اگر می خواهید شناسه کامل کانتینر را بدست آورید ، می توانید از گزینه --no-trunc در دستور docker ps استفاده کنید.

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

compassionate_swartz, hungry_goodall, distracted_turing

به نظر می‌رسد که اینها به نقطه مناسبی برای خوانایی و حافظه می‌رسند. وقتی با ابزار docker به طور مستقیم کار می‌کنید، همیشه می‌توانید از docker ps برای نگاه به نام های دوست دار انسان استفاده کنید.


داکرکانتینرdockercontainerبرنامه‌نویسی
برنامه نویسی / شبکه / لینوکس پیشه من است
شاید از این پست‌ها خوشتان بیاید