تصاویر Docker ابزار قدرتمندی برای توزیع پروژههای پایتون شما هستند، اما مهم است که آنها را تا حد ممکن نازک نگه دارید.
Docker نرم افزار استاندارد صنعتی برای بسته بندی و استقرار برنامه های کاربردی در ظروف است. تصاویر Docker سنگ بنای است که می توانید برنامه های خود را بر اساس آن بسازید و اجرا کنید.
برای باز کردن پتانسیل کامل Docker، باید تصاویر خود را برای کارایی منابع، امنیت و عملکرد بهینه کنید. این اطمینان حاصل می کند که برنامه های کاربردی شما به طور یکپارچه در اکوسیستم داکر کار می کنند.
نحوه انجام این کار را با مثالی در دنیای واقعی که نشان می دهد چگونه یک برنامه ماشین حساب پایتون را محفظه بندی کنید، بیاموزید.
شروع با یک تصویر پایه حداقل
یکی از عواملی که بر کارایی یک تصویر داکر تأثیر می گذارد، انتخاب تصویر پایه است. شما باید با یک تصویر حداقلی شروع کنید که فقط شامل اجزای ضروری برای اجرای برنامه شما باشد.
تصویری که استفاده میکنید نیز باید از یک منبع معتبر باشد که بهروزرسانیها و وصلههای امنیتی را ارائه میدهد. باید جامعه فعال و مستندات خوبی داشته باشد. این هنگام عیب یابی یا درخواست کمک مفید است.
برای برنامه ماشین حساب، انتخاب python:3.11-slim-bookworm که یک تصویر حداقلی است، اندازه تصویر را کاهش می دهد. این به نوبه خود مصرف منابع را به حداقل می رساند و سرعت دانلود و استقرار تصاویر را افزایش می دهد.
# Starting With a Minimal Base Image
FROM python:3.11-slim-bookworm AS builder
با انتخاب python:3.11-alpine میتوانید از یک تصویر حتی کوچکتر آلپاین لینوکس استفاده کنید. با این حال، این تصویر شامل یک مفسر پایتون، یک مدیر بسته و کتابخانه های رایج پایتون نیست.
اجرای برنامه ها به عنوان کاربران غیر روت
اجرای کانتینرهای Docker به عنوان یک کاربر ریشه می تواند خطرات امنیتی قابل توجهی ایجاد کند. اگر یک عامل مخرب به کانتینری که به صورت روت اجرا می شود دسترسی پیدا کند، ممکن است از آسیب پذیری های نرم افزار کانتینر برای افزایش امتیازات خود سوء استفاده کند. سپس آنها می توانند از این امتیازات برای اجرای دستورات با کنترل کامل بر روی سیستم میزبان استفاده کنند.
راه حل اجرای برنامه های شما به عنوان یک کاربر غیر ریشه است. مثال ماشین حساب ماشین حساب کاربر را ایجاد و پیکربندی می کند.
# Set non-root user for security
RUN adduser calculator --system
# Add the user to the calculator group
RUN addgroup calculator && adduser calculator calculator
ایجاد یک کاربر اختصاصی برای برنامه شما، مجوزهای موجود برای مهاجمان بالقوه را محدود می کند. این کار بهره برداری از آسیب پذیری ها را دشوارتر می کند.
کپی کردن فایل های ضروری و ایجاد یک محیط مجازی
ایجاد یک محیط مجازی در ظرف Docker وابستگی ها را جدا می کند. این امر از تداخل با بسته های سراسر سیستم و سایر برنامه ها جلوگیری می کند. همچنین سازگاری نسخه را تضمین می کند زیرا می توانید نسخه های دقیق وابستگی های مورد نیاز برنامه خود را نصب کنید، بدون اینکه روی بقیه سیستم تأثیر بگذارد.
فایل های لازم را در کانتینر کپی کنید. سپس، با استفاده از ماژول venv داخلی پایتون، یک محیط مجازی برای برنامه ماشین حساب ایجاد کنید.
# Set working directory and copy necessary files
WORKDIR /app
COPY app.py .
COPY requirements.txt .
COPY config.json ./
# Copy config.json from the local directory
# Create a virtual environment and install dependencies
RUN python -m venv /venv
ENV PATH="/venv/bin:$PATH"
RUN /venv/bin/pip install --upgrade pip --no-cache-dir --requirement requirements.txt
محیطهای مجازی سبک و کارآمد هستند، زیرا بستههای کل سیستم را کپی نمیکنند. این کمک می کند تا اندازه تصویر Docker کوچکتر شود و مصرف منابع در هنگام اجرا کانتینر کاهش یابد.
به حداقل رساندن لایه ها برای کارایی
هر دستور در یک Dockerfile یک لایه جدید در تصویر حاصل ایجاد می کند. داکر از مکانیزم کپی روی نوشتن برای مدیریت این لایه ها استفاده می کند. کاهش تعداد لایه ها در تصویر داکر به میزان قابل توجهی اندازه تصویر و عملکرد ساخت را بهبود می بخشد. یکی از راههای کاهش لایهها، ادغام چند دستور در یک دستور RUN است.
# Minimizing Layers for Efficiency
# Combine commands to reduce the number of layers
RUN echo "Build process goes here" && \
/venv/bin/python -m compileall . && \
rm -rf __pycache__
ترکیب دستورات بالا تعداد لایه های میانی ایجاد شده در طول فرآیند ساخت تصویر را کاهش می دهد.
ایمن کردن مدیریت پیکربندی
دست زدن به اطلاعات حساس در یک تصویر Docker یک خطر امنیتی ایجاد می کند. برای افزایش امنیت، باید از متغیرهای محیطی و فایل های پیکربندی خارجی استفاده کنید. در مثال برنامه ماشین حساب، می توانید دایرکتوری به نام /config ایجاد کنید تا فایل پیکربندی خود را ذخیره کرده و مالکیت مناسب را تنظیم کنید.
# Securing Configuration Handling
RUN mkdir /config && chown calculator:calculator /config
سپس فایل config.json را در این دایرکتوری کپی کنید و مطمئن شوید که از کد برنامه جدا باقی می ماند.
# Copy the config.json file into the container
RUN cp config.json /config/config.json
ENV CONFIG_PATH=/config/config.json
جداسازی دادههای پیکربندی از کد و اعمال مجوزهای مناسب، امنیت کلی تصویر Docker شما را افزایش میدهد. این تضمین می کند که فقط فرآیندها یا کاربران مجاز به داده های پیکربندی حیاتی دسترسی دارند.
استفاده از ساخت های چند مرحله ای
ساخت های چند مرحله ای به شما این امکان را می دهد که محیط ساخت را از تصویر نهایی جدا کنید. این منجر به تولید تصاویر کوچکتر و متمرکزتر می شود. همچنین با حذف ابزارها و فایلهای مربوط به ساخت از تصویر نهایی، امنیت را افزایش میدهد. این سطح حمله را کاهش می دهد و خطرات امنیتی بالقوه مرتبط با اجزای غیر ضروری را به حداقل می رساند.
# Leveraging Multi-Stage Builds
FROM python:3.11-slim-bookworm
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group
COPY --from=builder /venv /venv
COPY --from=builder /config /config
COPY --from=builder /app /app
# Copy the application code
کد بالا فقط آرتیفکت های لازم را از مرحله ساخت (builder) در تصویر نهایی کپی می کند. این کار با حذف ابزارها و فایلهای مرتبط با ساخت که برای اجرای برنامه ماشین حساب مورد نیاز نیستند، اندازه تصویر را کاهش میدهد.
افزایش امنیت با اسکن تصویر
برای افزایش امنیت تصاویر Docker خود، از ابزارهای اسکن تصویر مانند Trivy یا Clair استفاده کنید. این ابزارها برای شناسایی آسیبپذیریها در لایههای تصویر و وابستگیها طراحی شدهاند. برای انجام اسکن آسیب پذیری، از Trivy برای برنامه ماشین حساب استفاده کنید.
# Install Trivy for Debian/Ubuntu
RUN apt-get update && \
apt-get install -y wget apt-transport-https gnupg lsb-release && \
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | apt-key add - && \
echo "deb https://aquasecurity.github.io/trivy-repo/deb bookworm main" \
| tee -a /etc/apt/sources.list.d/trivy.list && \
apt-get update && \
apt-get install -y trivy
افزودن اسکن آسیب پذیری Trivy به تصویر Docker شما بسیار مهم است. این به این دلیل است که از پایگاه داده مشترک آسیبپذیریها و مواجههها (CVE) استفاده میکند که به طور منظم با اطلاعات آسیبپذیریهای شناخته شده بهروزرسانی میشود. این به شما کمک می کند تا تصاویر خود را با آخرین وصله های امنیتی به روز نگه دارید و از برنامه های خود در برابر سوء استفاده های شناخته شده محافظت کنید.
برای دریافت گزارش آسیب پذیری در تصویر خود از دستور زیر استفاده کنید.
docker run --rm `
-v /var/run/docker.sock:/var/run/docker.sock `
-v $HOME/Library/Caches:/root/.cache/ `
aquasec/trivy:0.18.3 `
<your image name>
اجرای دستور بالا مدتی طول می کشد. پس از اتمام، گزارشی مانند زیر ایجاد می کند.
هرچه شدت بیشتر باشد، باید آسیبپذیری شناساییشده را سریعتر برطرف کنید.
اجرای برنامه ها به عنوان کاربران غیر روت
برای افزایش امنیت، برنامه را به عنوان کاربر ماشین حساب اجرا کنید تا آسیب پذیری های احتمالی را محدود کنید.
# Running Applications as Non-Root Users
WORKDIR /app
USER calculator
# Activate the virtual environment and run the application
CMD ["/bin/bash", "-c", "source /venv/bin/activate && python app.py"]
تغییر به یک کاربر غیر ریشه سطح حمله را به حداقل می رساند.
Containerizing برنامه های غیر پایتون
کانتینرسازی Docker برنامه های کاربردی که توسط زبان های دیگر ارائه می شوند کمی متفاوت است. شما باید با نحوه کانتینری کردن انواع مختلف برنامه ها آشنا شوید. این به شما کمک می کند تا بهترین استراتژی را بر اساس نوع زبانی که برنامه شما استفاده می کند، انتخاب کنید.