داکر عجیب است
آدرس مقاله: https://codeandcake.dev/posts/2026-10-22-docker-is-weird آدرس نظرات: https://news.ycombinator.com/item?id=50202681 امتیاز: 445 # نظرات: 209
من تصمیم گرفتم زمان اجرا کانتینر خود را برای سرگرمی بسازم، و با وجود اینکه هنوز در سنین اولیه هستم، متوجه شده ام که Docker عجیب است. در اینجا چیزهای عجیبی در مورد Docker یاد گرفتم.
برخلاف VM ها، کانتینرها فقط فرآیندهایی هستند که محدودیت های خاصی روی آنها وجود دارد. هسته شما همچنان این فرآیند را اجرا می کند! و اگر می دانید کجا باید جستجو کنید، حتی می توانید آن فرآیند را در /proc پیدا کنید.
واقعا یک ویژگی لینوکس که فقط "ظروف" باشد نیز وجود ندارد. در عوض، کانتینرها واقعا 5 ویژگی هسته لینوکس مختلف در ترنچ کت هستند.
فضاهای نام چیزی را که میزبان و کانتینر میتوانند ببینند پنهان میکنند، cgroupها استفاده از منابع کانتینر را محدود میکنند، و یک سری جادوی شبکه وجود دارد که من نمیفهمم که به شما امکان میدهد شبکه یک کانتینر را ایزوله کنید.
تصاویر فقط پوشههایی هستند که داکر در جایی قرار میدهد و سپس chroot (یا pivot_root) را فراخوانی میکند تا آن پوشه را به دایرکتوری ریشه جدید فرآیند کانتینر شما تبدیل کند. بنابراین اگر docker run -it --rm ubuntu /bin/bash را اجرا کنید، Docker میخواهد:
زمان اجرای کانتینر Docker، runc، در Go نوشته شده است، و Go دارای برخی از انتخابهای طراحی است که آن را برای زمان اجرا کانتینر مناسبتر میکند. زمان اجرا Go به صورت بومی چند رشته ای است. این یک ویژگی واقعا جالب است، اما منجر به چالشهایی در runc میشود.
بسیاری از سیستمهای لینوکس که یک زمان اجرا کانتینر باید بسازد، باید در یک محیط تک رشتهای انجام شوند، بنابراین runc یک ماژول C دیوانه دارد که قبل از شروع زمان اجرا Go اجرا میشود تا بتواند آن syscals را اجرا کند.
برو چنگال هم نداره! فورک فقط نخ اصلی را چنگال میکند، بنابراین در زمان اجرا مانند Go به نوعی یک تفنگ پایی است. اما یک Container Runtime واقعا میخواهد فورک کند، مجموعهای از محدودیتها را تنظیم کند و سپس فرآیندی را که در واقع در اجرای docker قرار دادهاید، اجرا کند. برای دور زدن این موضوع، runc execs /proc/self/exe را با یک استدلال خط فرمان خاص که آن را به عنوان یک فرآیند فرزند برای تقریب یک فورک شناسایی میکند، اجرا میکند.
اگر شما نیز مانند من، Docker را در MacOS اجرا کنید، به راحتی از دست میدهید. بسیاری از APIهای هسته لینوکس که در زمان اجرا کانتینر استفاده میشوند، نیاز دارند، یا حداقل قبلا استفاده میشوند، بهصورت روت اجرا شوند، بنابراین Daemon Docker معمولا بهعنوان روت اجرا میشود. من فقط می توانم تصور کنم که امنیت کانتینر کار بسیار سختی است.
این روزها بهتر به نظر می رسد. به نظر می رسد استثنای بزرگ شبکه است. اگر یک زمان اجرا کانتینر بدون ریشه اجرا میکنید، به نظر میرسد که باید کل پشته شبکه را در فضای کاربری دوباره پیادهسازی کند تا در واقع همان ویژگیها را به شما بدهد!
من به تازگی زمان اجرای کانتینر خود را شروع کرده ام و از قبل احساس می کنم چیزهای زیادی در مورد Docker یاد گرفته ام. نوشتن نسخه خود از ابزاری که استفاده میکنید راهی عالی برای یادگیری در مورد آن است!
متن اصلی (انگلیسی)
Docker is weird
Article URL: https://codeandcake.dev/posts/2026-10-22-docker-is-weird Comments URL: https://news.ycombinator.com/item?id=50202681 Points: 445 # Comments: 209