اجرای داکر در داکر (Docker-in-Docker یا DinD) روشی است که به شما امکان میدهد یک محیط Docker جداگانه را درون یک کانتینر راهاندازی و مدیریت کنید. این قابلیت برای سناریوهایی مانند تست موقت، CI/CD و محیطهای ایزولهسازیشده مفید است. برای این کار معمولا از ایمیج رسمی docker:dind همراه با دسترسی –privileged استفاده میشود تا بتوان Docker daemon را در داخل کانتینر راهاندازی کرد.
در این مطلب، مراحل مورد نیاز برای اجرای داکر در docker را با استفاده از سه روش مختلف بررسی خواهیم کرد.
- اجرای داکر با نصب docker.sock (متد DooD)
- متد Docker dind
- استفاده از Nestybox sysbox Docker runtime
در ادامه هر گزینه را با جزئیات بررسی میکنیم. برای امتحان کردن این تنظیمات، مطمئن شوید که داکر را در هاست خود نصب کردهاید.
روش ۱: داکر در داکر با استفاده از [/var/run/docker.sock]
/var/run/docker.sock چیست؟
var/run/docker.sock/ سوکت پیشفرض یونیکس است. سوکتها برای ارتباط بین فرآیندها در یک هاست در نظر گرفته شدهاند.
دیمن داکر به طور پیشفرض به docker.sock گوش میدهد. اگر در همان هاستی هستید که سرویس داکر در آن اجرا میشود، میتوانید از var/run/docker.sock/ برای مدیریت کانتینرها استفاده کنید. به این معنی که میتوانید سوکت داکر را از هاست به کانتینر متصل کنید.
برای مثال، اگر دستور زیر را اجرا کنید، نسخه docker engine را برمیگرداند.
curl --unix-socket /var/run/docker.sock https://localhost/version
حالا که کمی با docker.sock آشنا شدید، بیایید ببینیم چگونه میتوان داکر را در داکر با استفاده از docker.sock اجرا کرد.
برای اجرای داکر در داکر، تنها کاری که باید انجام دهید این است که داکر را با سوکت یونیکس پیشفرض docker.sock به عنوان یک volume اجرا کنید.
به عنوان مثال،
docker run -v /var/run/docker.sock:/var/run/docker.sock \ -ti docker
حالا، از درون کانتینر، باید بتوانید دستورات داکر را برای ساخت (build) و ارسال (push) ایمیجها به رجیستری اجرا کنید.
در اینجا، عملیات داکر واقعی (actual ) روی هاست ماشین مجازی که کانتینر داکر پایه را اجرا میکند، اتفاق میافتد، نه از درون کانتینر. یعنی، اگرچه شما دستورات داکر را از داخل کانتینر اجرا میکنید، اما به کلاینت داکر دستور میدهید که از طریق docker.sock به docker-engine میزبان ماشین مجازی (VM) متصل شود.
برای آزمایش تنظیمات، از ایمیج رسمی داکر از هاب داکر استفاده کنید. این ایمیج شامل فایل باینری داکر است.
برای آزمایش تنظیمات، مراحل زیر را دنبال کنید.
مرحله ۱: کانتینر داکر را در حالت تعاملی با نصب docker.sock به عنوان یک volume اجرا کنید. ما از ایمیج رسمی داکر استفاده خواهیم کرد.
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti docker
مرحله ۲: هنگامی که داخل کانتینر هستید، دستور داکر زیر را اجرا کنید.
docker pull ubuntu
مرحله ۳: وقتی ایمیج داکر را لیست میکنید، باید ایمیج اوبونتو را به همراه سایر ایمیجهای داکر در ماشین مجازی میزبان خود مشاهده کنید.
docker images
مرحله ۴: اکنون یک Dockerfile در داخل دایرکتوری test ایجاد کنید.
mkdir test && cd test vi Dockerfile
محتویات Dockerfile زیر را برای آزمایش ساخت ایمیج از داخل کانتینر کپی کنید.
FROM ubuntu:18.04 LABEL maintainer="Bibin Wilson <bibinwilsonn@gmail.com>" RUN apt-get update && \ apt-get -qy full-upgrade && \ apt-get install -qy curl && \ apt-get install -qy curl && \ curl -sSL https://get.docker.com/ | sh
ساخت Dockerfile
docker build -t test-image
خطای پرمیشن docker.sock
هنگام استفاده از docker.sock ممکن است با خطای permission denied مواجه شوید. در این صورت، باید پرمیشن docker.sock را به صورت زیر تغییر دهید.
sudo chmod 666 /var/run/docker.sock
همچنین، ممکن است لازم باشد برای دادن دسترسی امتیاز دار، فلگ –privileged را اضافه کنید.
پرمیشن docker sock باعث ریستارت شدن سرور میشود. برای جلوگیری از این امر، باید permission را به اسکریپتهای راهاندازی سیستم (starts up) اضافه کنید.
به عنوان مثال، میتوانید دستور را به /etc/rc.local اضافه کنید تا هر بار که سرور شما راهاندازی میشود، به طور خودکار اجرا شود.
همچنین، به خاطر داشته باشید که استفاده پرمیشنهای ۶۶۶ یک حفره امنیتی ایجاد میکنند. قبل از پیادهسازی در پروژههای پروداکشن، با تیم امنیتی خود مشورت کنید.
روش ۲: داکر در داکر با استفاده از DinD
این روش در واقع یک کانتینر فرزند (child ) درون یک کانتینر داکر ایجاد میکند. فقط در صورتی از این روش استفاده کنید که واقعا میخواهید کانتینرها و ایمیجها را درون کانتینر داشته باشید. در غیر این صورت، پیشنهاد میکنم از روش اول استفاده کنید.
برای این کار، فقط باید از ایمیج رسمی داکر با تگ dind استفاده کنید. ایمیج dind با ابزارهای مورد نیاز برای اجرای داکر درون یک کانتینر داکر ساخته شده است.
مراحل را برای آزمایش تنظیمات دنبال کنید.
توجه: این امر مستلزم آن است که کانتینر شما در حالت privileged mode اجرا شود.
مرحله ۱: ایجاد یک کانتینر با نام dind-test با ایمیج docker:dind
docker run --privileged -d --name dind-test docker:dind
مرحله ۲: ورود به کانتینر با استفاده از exec
docker exec -it dind-test /bin/sh
حالا، مراحل ۲ تا ۴ روش قبلی را انجام دهید و دستورالعملهای خط فرمان docker و ساخت ایمیج را اعتبارسنجی کنید.
–privileged دسترسی کامل به منابع میزبان (که برای کار داکر در داخل آن لازم است) را میدهد که برای سیستمهای CI یا محیطهای ایزوله مناسب است. به دلیل ریسک امنیتی ناشی از دسترسی کامل، برای راهاندازی در محیط عملیاتی، ایمن نیست.
روش ۳: داکر در داکر با استفاده از Sysbox Runtime
روشهای ۱ و ۲ به دلیل اجرای کانتینرهای پایه در حالت privileged ، از نظر امنیتی دارای معایبی هستند. Nestybox سعی میکند با داشتن یک sysbox Docker runtime این مشکل را حل کند.
اگر یک کانتینر با استفاده از Nestybox sysbox runtime ایجاد نمائید، میتواند محیطهای مجازی را درون یک کانتینر ایجاد کند که قادر به اجرای systemd، docker، kubernetes بدون دسترسی privileged به سیستم میزبان اصلی باشد.
Sysbox یک محیط اجرای کانتینر متنباز و رایگان (یک runc تخصصی) است که در ابتدا توسط Nestybox (که در تاریخ ۰۵/۲۰۲۲ توسط Docker خریداری شد) توسعه داده شد و کانتینرها را از دو طریق کلیدی بهبود میبخشد:
ایزولاسیون کانتینر را بهبود میبخشد:
- فضای نام کاربری لینوکس در تمام کانتینرها (یعنی کاربر root در کانتینر هیچ امتیازی روی میزبان ندارد).
- بخشهایی از procfs و sysfs را درون کانتینر مجازیسازی میکند.
- اطلاعات میزبان را درون کانتینر پنهان میکند.
- نصبهای اولیه کانتینر را قفل میکند و موارد دیگر.
کانتینرها را قادر میسازد تا بارهای کاری مشابه ماشینهای مجازی را اجرا کنند:
- با Sysbox، کانتینرها میتوانند نرمافزارهای سطح سیستم مانند systemd، Docker، Kubernetes، K3s، buildx، برنامههای قدیمی، برنامههای چند معماری و موارد دیگر را به طور یکپارچه و ایمن اجرا کنند.
- این نرمافزار میتواند بدون تغییر و بدون استفاده از نسخههای خاص نرمافزار، درون کانتینرهای Sysbox اجرا شود.
- بدون کانتینرهای privileged ، بدون ایمیجهای پیچیده، بدون نقاط ورودی پیچیده، بدون mount حجم ویژه و غیره.
آن را به عنوان یک تقویتکننده کانتینر (container supercharger) در نظر بگیرید که به مدیران و هماهنگکنندگان کانتینر موجود (مثل Docker، Kubernetes و غیره) این امکان را میدهد تا کانتینرهایی را مستقر کنند که دارای ایزولهسازی سخت هستند و میتوانند تقریبا هر حجم کاری را که در ماشینهای مجازی اجرا میشود، اجرا کنند.
Sysbox این کار را با شبیه کردن کانتینر به محیطی شبیه به ماشین مجازی تا حد امکان، با استفاده از تکنیکهای پیشرفته مجازیسازی سیستم عامل، انجام میدهد.
برای آشنایی اجمالی، بیایید یک مثال را امتحان کنیم.
مرحله ۱: sysbox runtime environment را نصب کنید.
مرحله ۲: پس از اینکه sysbox runtime را در دسترس قرار دادید، تنها کاری که باید انجام دهید این است که کانتینر docker را با یک پرچم sysbox runtime همانطور که در زیر نشان داده شده است، شروع کنید. در اینجا ما از ایمیج رسمی docker dind استفاده میکنیم.
docker run --runtime=sysbox-runc --name sysbox-dind -d docker:dind
مرحله ۳: اکنون یک جلسه exec را به کانتینر sysbox-dind منتقل کنید.
docker exec -it sysbox-dind /bin/sh
اکنون میتوانید همانطور که در روشهای قبلی نشان داده شده است، سعی کنید ایمیجها را با Dockerfile بسازید.
ملاحظات کلیدی
- فقط در صورت نیاز از Docker در داکر استفاده کنید. قبل از انتقال هرگونه گردش کار به روش Docker-in-Docker، POCها و آزمایشهای کافی را انجام دهید.
- هنگام استفاده از کانتینرها در حالت privileged ، مطمئن شوید که تاییدیههای لازم را از تیمهای امنیتی سازمانی در مورد کاری که قصد انجام آن را دارید، دریافت کردهاید.
- هنگام استفاده از Docker در داکر با kubernetes pods، چالشهای خاصی وجود دارد که باید آنها را در نظر بگیرید.
- اگر قصد استفاده از Nestybox (Sysbox) را دارید، مطمئن شوید که توسط معماران و تیمهای امنیتی سازمانی تست و تایید شده است.
با خرید وی پی اس از پارسدو، میتوانید از قدرت و پایداری یک ماشین مجازی اختصاصی در ۵ موقعیت جهانی بهرهمند شوید.
موارد استفاده Docker در داکر
در این بخش چند مورد استفاده برای اجرای docker درون یک کانتینر docker آورده شده است.
- یک مورد استفاده بالقوه برای docker در داکر برای خط لوله CI/CD است، جایی که باید ایمیجهای docker را پس از ساخت موفقیتآمیز کد، build و به رجیستری کانتینر push کنید.
- سیستمهای مدرن CI/CD از ایجنتها (agents) یا اجراکنندههای (runners ) مبتنی بر Docker پشتیبانی میکنند که در آن میتوانید تمام مراحل ساخت را درون یک کانتینر اجرا و ایمیجهای کانتینر را درون یک agent کانتینر بسازید.
- ساخت ایمیجهای داکر با یک ماشین مجازی بسیار ساده است. با این حال، وقتی قصد دارید از ایجنتهای داینامیک مبتنی بر داکر جنکینز برای خطوط لوله CI/CD خود استفاده کنید، داکر در داکر به عنوان یک قابلیت ضروری ظاهر میشود.
- محیطهای سندباکس.
- برای اهداف آزمایشی در تحقیق و توسعه.
نتیجهگیری
در این مطلب، ما به سه روش مختلف برای اجرای داکر در داکر نگاهی انداختیم. هنگام استفاده از این روشها در محیطهای عملیاتی، همیشه برای انطباق با قوانین با تیم امنیتی سازمانی خود مشورت کنید.