میون اینهمه جنب و جوشِ عید باستانی، با این مقاله مواجه شدم. چند خطش رو خوندم و بسیار حال کردم؛ تا انتها و خط به خطِ متن رو مطالعه کردم. کار باحالیه و خیلی خوب و اصولی نوشته شده. اگر به داکر علاقمندید و مبتدی هم نیستید، شاید خوندن این کار خیلی مفید و مطلوب باشه براتون. یک خلاصه از مواردی که در این مقاله مطرح شده رو در ادامه آوردم.
1- Multi-stage Builds for Efficient Images
✔️ با استفاده از این مورد میتوانیم ایمیجهایی بسازیم که بسیار بهینهتر باشند و موارد امنیتی را نیز به خوبی در آنها رعایت کرده باشیم. بعنوان مثال ابتدا اپی میسازیم و در مرحلهی دوم تنها خروجی اپ اول را در آن کپی میکنیم. ایمیج حاصل حداقل کدهای اجرایی ممکن را برای اجرا شدن دارد. یک نمونه از کد در این حالت را به صورت زیر مشاهده مینمائید:
# Syntax for multi-stage builds # Stage 1: Build the application FROM golang:1.15 AS builder WORKDIR /app COPY . . RUN go build -o myapp . # Stage 2: Create the final image FROM alpine:latest COPY --from=builder /app/myapp /app/myapp ENTRYPOINT ["/app/myapp"]
2- Squashing Image Layers
✔️ با کمک این آپشن میتوانیم حجم ایمیجهای خود را کاهش دهیم. نمونه کد زیر نشان میدهد که چگونه BuildKit را فعال کرده و از ویژگی squash استفاده کنیم:
# Enable Docker BuildKit export DOCKER_BUILDKIT=1 # Build and squash the image docker build --tag myapp:latest --squash .
3- Docker BuildKit Secrets
✔️ به کمک این ابزار میتوانیم از رمزهای عبور و موارد محرمانه در ایمیج و کانتینرهای داکر تا حد بسیار زیادی محافظت کنیم. کد زیر نحوهی فعالسازی این مورد را نشان میدهد:
# Enable Docker BuildKit export DOCKER_BUILDKIT=1 # Build with a secret docker build --secret id=mysecret,src=/path/to/secret/file.txt -t myapp:latest .
در داکرفایل میتوانیم به رمزها به شیوهی زیر دسترسی داشته باشیم:
# syntax=docker/dockerfile:1.2 FROM alpine # Use the secret without exposing it in the image RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret
4- Leveraging .dockerignore
✔️ مانند مورد قبل این آیتم نیز برای بحث امنیت کاربرد دارد. مواردی را که نمیخواهیم در ایمیج نهایی باشد را داخل داکرایگنور قرار میدهیم.
5- Health Checks in Dockerfiles
✔️ با کمک این مورد میتوانیم از سلامت کانتینرها بخوبی مطلع شویم.
6- Docker CLI Output Formatting
✔️ به کمک این مورد میتوانیم در خط فرمان، خروجیهای بسیار زیبا و کاربرپسندی را تولید کنیم. مثالی از داکر فرمت را در ادامه مشاهده میکنید:
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
7- Optimizing Cache Use in Builds
✔️ با کمک سیستم کش در داکر، میتوانیم زمان ساختن ایمیجها را بشدت کاهش دهیم.
8- Limiting Container Resources
✔️ به کمک این مورد میتوانیم کانتینرها را محدود نمائیم تا بخش زیادی از منابع سختافزاری ما را اشغال نکنند. مثالی از این مورد را در ادامه میبینیم:
docker run -it --cpus="1.5" --memory="500m" myapp:latest
9- Docker Events for Monitoring
✔️ به کمک این دستور و اجرای آن در خط فرمان، میتوانیم اطلاعات بسیار مهم و مفیدی را در لحظه از وضعیت کلاستر و کانتینرها کسب کنیم. نمونهای از این دستور را در ادامه میبینیم:
docker events --filter 'type=container' --filter 'event=start' --filter 'event=stop' --filter 'label=environment=prod'
10- Running Containers in Read-only Mode
✔️ این مورد از لحاظ امنیتی در محیطهای پروداکشن بسیار حیاتی است. کانتینرهایی میسازیم که به هیچ وجه نشود مورد جدیدی داخلشان نوشت و تنها میتوانیم کدهای داخل انرا بخوانیم. نحوهی بالاآوردن کانتینر بصورت read-only به این شکل است:
docker run --read-only -d myimage:latest
اگر بخواهیم یک پوشه را برای نوشتن فایلهای موقت ست کنیم از دستور زیر استفاده میکنیم:
docker run --read-only --tmpfs /tmp -d myimage:latest
11- Cleaning Up with Docker Prune
✔️ به کمک این دستور میتوانیم محیط کاری داکر خود را بطور کامل پاک و تمیز نمائیم. بعد از مدتی کار با داکر فضای بسیار زیادی از کامپیوتر و سیستم اشغال خواهد شد. دستور زیر تمامی ایمیجهای سیستم را پاک مینماید (با احتیاط استفاده کنید)
docker system prune -a --volumes
12- Overriding Entrypoint for Debugging
✔️ به کمک این مورد میتوانیم نقطه ورود به کانتینر را تغییر داده و در دیباگینگهای روزمره بسیار مفید واقع میشود. فرض کنید کانتینری را اجرا میکنیم ولی مرتب ریستارت میشود و اصلن نمیتوانیم وارد آن شویم و مشکلیابی کنیم. اینجاست که این مورد بسیار حیاتی میشود. کد زیر نحوهی استفاده از entrypoint را نشان میدهد:
docker run --entrypoint /bin/sh -it myimage:latest
13- Docker Contexts for Multi-environment Management
✔️ به کمک این مورد میتوانیم بین محیطهای تست، توسعه و پروداکشن براحتی حرکت کنیم (حتی وقتی که بخواهیم با ریموت سرورها کار کنیم). به صورت زیر از داکر کانتکست استفاده میکنیم:
docker context create remote-docker --docker "host=ssh://user@remote-server"
اگر خواستید مقالهی اصلی اینکار رو بخونید به این آدرس مراجعه کنید. بنظر من کار خیلی حوبی هست و ارزش وقت گذاشتن رو دارد.