Beyond Docker – راهنمای مهندس DevOps برای جایگزین های کانتینر

مقدمه
از زمانی که Docker نحوه بسته بندی و استقرار برنامه ها را تغییر داد، چشم انداز کانتینر کمی تغییر کرده است. در حالی که Docker هنوز یکی از پرکاربردترین گزینههای امروزی است، برخی از جایگزینهای قانعکننده ارزش در نظر گرفتن را دارند که ممکن است بهتر با نیازهای شما مطابقت داشته باشند. اجازه دهید سفرم را برای کشف این جایگزین ها و آنچه در این راه آموخته ام به اشتراک بگذارم.
تکامل زمان اجرا کانتینر
جدول زمانی
عنوان تکامل فناوری کانتینر
2013: انتشار داکر
: Unified Container Toolchain
: رجیستری داخلی و CLI
2015: تشکیل OCI
: مشخصات تصویر
: استانداردهای زمان اجرا
2016: ظرف
: Kubernetes Runtime
: تمرکز بر عملکرد
2017 : BuildKit
: ساخت های همزمان
: پشتیبانی از چند پلتفرم
2018: Undertaker 1.0
: طراحی بدون دیمون
: ظروف بدون ریشه
2020: عصر مدرن
: گزینه های دسکتاپ
: پشتیبانی چند زمانه
} />
زمانی که Docker برای اولین بار وارد این دنیا شد، این فناوری بود که قادر بود توابع ایجاد کانتینر و مدیریت با زمان اجرا را در یک ابزار جمع آوری کند. این تا حدودی انقلابی بود، اما با گذشت زمان، همانطور که استفاده از کانتینرها به بلوغ رسید، آشکار شد که تیمها به ابزارهای خاصی برای جنبههای خاص در کانتینرسازی نیاز دارند، و این همان چیزی است که منجر به تخصصیسازی جایگزین شد.
آشنایی با استانداردهای کانتینر
اکوسیستم کانتینری مبتنی بر استانداردهای باز است – به ویژه استانداردهای [Open Container Initiative (OCI)]. که استاندارد می کند:
نمودار TD
الف[OCI Standards] –> B[Image Format]A –> C[Runtime Spec]الف –> د[Distribution Spec]B –> E[How images are structured]C –> F[How containers are executed]D –> G[How images are distributed]
این استانداردسازی به این معنی است که شما در هیچ ابزار خاصی قفل نشده اید. می توانید تصاویر خود را در یک ابزار بسازید و در ابزاری دیگر اجرا کنید. این به شما این امکان را می دهد که از بهترین ابزار برای انجام یک کار خاص استفاده کنید.
Podman: The Daemon-free Alternative
در شدت کار به عنوان یک مهندس DevOps با کانتینر، Podman را به عنوان یک تغییر دهنده بازی در تیمهایی که جنبه امنیتی را جدی میگیرند، یافتم – این به معنای اجتناب از امتیازات ریشه است. در مقایسه با Docker که یک تغییر بزرگ در معماری است، بدون دیمون است. رویکرد بدون دیمون به طرز جادویی نحوه امنیت کانتینر را در محیط های تولیدی توسط تیم ها تغییر می دهد.
امنیت از طریق طراحی
اولین باری که برای یک مشتری آگاه به امنیت به Podman تغییر مکان دادم، این معماری بدون دیمون کاملاً منطقی بود. هر کانتینر با مجوزهای کاربر شما اجرا می شود – نه به عنوان یک دیمون ممتاز:
Running a container as your user
podman run nginx # No root, no daemon
# Even rootless containers can bind to privileged ports
podman run -p 80:80 nginx # Works without root!
تجربه مشابه Kubernetes در دسک تاپ
اما چیزی که واقعاً شگفتانگیز بود، پشتیبانی از pod-native در Podman بود. این اجازه می دهد تا مفاهیم مشابه Kubernetes را در یک سیستم محلی امتحان کنید:
# Create a pod with multi containers
podman pod create --name my-app
podman run --pod my-app -d nginx
podman run --pod my-app -d redis
containerd: Kubernetes Runtime
با بهره برداری از خوشه های بزرگ Kubernetes، فرد یاد می گیرد که رویکرد متمرکز کانتینر را دوست داشته باشد. یک زمان اجرا کانتینر سبک و با کارایی بالا، بسیاری از پلتفرمهای کانتینر از جمله Kubernetes را به طور غیرمستقیم تامین میکند. طبق تجربه من، Containerd واقعاً یک کار را انجام می دهد و آن را به خوبی انجام می دهد: کانتینرها را به طور موثر اجرا می کند.
ساختمان پلت فرم
این تمرکز کانتینر هنگام نگاه کردن به ساخت سکوهای کانتینری می درخشد:
// Simple integration with containerd
client, err := containerd.New("/run/containerd/containerd.sock")
container, err := client.NewContainer(ctx, "nginx",
containerd.WithNewSnapshot("nginx", image),
containerd.WithNewSpec(oci.WithImageConfig(image))
BuildKit: Reimagining Container Building
به یاد دارم زمانی که ساخت کانتینر کند بود و واقعاً کارآمد نبود و معمولاً گلوگاه خطوط لوله CI/CD ما بود. تا زمانی که BuildKit را کشف کردم و زندگی من تغییر کرد. BuildKit نسل بعدی موتور سازنده Docker است، اما میتوان از آن بهطور مستقل نیز استفاده کرد.
ساخت های همزمان و کارآمد
بهترین چیز در مورد BuildKit این است که مراحل ساخت را موازی می کند:
Dockerfile
# These stages build concurrently
FROM golang:1.21 AS backend
COPY backend.
RUN go build
FROM node:18 AS frontend
COPY frontend.
RUN npm build
FROM alpine
COPY --from=backend /app/backend.
COPY --from=frontend /app/dist ./dist
LXC/LXD: ظروف سیستم
کار با برنامههای قدیمی که نیاز به دسترسی کامل به سیستم داشتند به من آموخت که راه دیگری برای انجام کانتینریسازی استفاده از LXC/LXD است. تمرکز در کانتینرهای سیستم، به جای کانتینرهای کاربردی، می تواند مانند یک ماشین مجازی سبک در نظر گرفته شود تا آنچه که اکثراً کانتینر معمولی را در نظر می گیرند.
محیط های توسعه
LXD در محیط های توسعه ایزوله عالی عمل می کند:
# Create a full Ubuntu environment
lxc launch ubuntu:20.04 dev-env
lxc exec dev-env -- sudo apt install python3
# Share your project folder
lxc config device add dev-env code disk source=/path/to/code path=/code
نظارت بر گردشهای کاری GitHub Actions
CICube یک ابزار نظارت بر GitHub Actions است که برای بهینهسازی بیشتر خط لوله CI/CD خود، بینشهای دقیقی را در مورد گردش کارتان در اختیار شما قرار میدهد. با CICube، میتوانید گردش کار خود را ردیابی کنید، گلوگاهها را درک کنید و بهترینها را از زمانهای ساخت خود به دست آورید. اکنون به cicube.io بروید و یک حساب کاربری رایگان ایجاد کنید تا گردش کار GitHub Actions خود را بهتر بهینه کنید!
نتیجه گیری
در طول سفر من در کاوش جایگزینهای Docker، آموخته شد که اکوسیستم کانتینر بیشتر با انتخاب ابزار مناسب برای نیازهای شما در مقابل یافتن یک جایگزین عالی کار میکند. رویکرد بدون ریشه Podman امنیت را بدون فداکاری به ارمغان میآورد، سادگی Containerd خود را کاملاً در محیطهای Kubernetes قرار میدهد، BuildKit نحوه ساخت تصاویر را تغییر میدهد، و LXC/LXD یک برداشت منحصر به فرد از کانتینریسازی سیستم ارائه میدهد.
نکته جالب در مورد ابزارهای کانتینر مدرن در نحوه عملکرد آنهاست: میتوانید با BuildKit ساختهای کارآمد داشته باشید، آنها را با Podman در حال توسعه اجرا کنید و در Containerd در مرحله تولید مستقر شوید. این انعطافپذیری که توسط استانداردهای OCI فعال میشود، به ما اجازه میدهد تا به جای تطبیق نیازهای خود با یک ابزار واحد، جریانهای کاری را ایجاد کنیم که واقعاً متناسب با نیازهای ما باشد.