زمانی که شما container مورد نظر خودتون رو پیدا کردید قطعا میخواهید اون رو customize کنید و dependency های خودتون رو بهش اضافه کنید . اینجا جاییه که Dockerfile میاد سر کار.
داکر فایل (Dockerfile) به طور خلاصه توضیح میده که شما از داکر میخواین چطور برای بار اول container اتون رو بالا بیاره
به عنوان مثال یک نمونه از Dockerfile رو در زیر براتون قرار میدم.
12# Use the official Node.js runtime as a base image FROM node:alpine 12# Set the directory of my web application to /app WORKDIR /app 12# Copy over my project’s directory into the container /app folder Add . /app 12# Install all the dependencies for my web application RUN yarn install 12# Make the port 3000 accessible outside of Docker EXPOSE 3000 123# Execute the command yarn start CMD ["yarn", "start"]
این Dockerfile هر وقت که یک instance ازش ساخته بشه اجرا میشه . هنوز برای ساخت یک container شما نیازمند docker image هستید . هر وقت شما یک Image بسازید متوانید از روی اون به هر تعدادی که دلتون میخواد container بسازید.
در حقیقت شما از داکر هاب ایمیج های داکری آماده را دانلود میکنید که میتوانید به کمک آن ها هر تعداد container ای که لازم دارید را بسازید . همچنین میتوانید تنظیمات شخصی خود را بر روی کانتینری که ساخته اید اعمال کنید و دوباره از آن container یک Image جدید بسازید تا برای ساخت کانتینر هر بار نیازمند انجام تنظیمات قبلی نباشید و container های خودتون رو بر اساس Image جدیدی که ساخته اید ، تولید کنید.
وقتی قابلیت ساخت کانتینر های مختلف وجود داره یک best practice اینه که بخش های مختلف اپلیکیشنمون رو ایزوله کنیم به container های مختلف
برا مثال فرض کنید یه وب اپلیکیشن که به یک دیتابیس و یک وب سرور پایتون نیازمنده به دو تا container نیازمنده . یکیش برای سرور پایتون و یکیشم برای دیتابیس
شاید بپرسید چرا ؟ چون اداره اپلیکیشنتون رو ماژولار تر میکنه و اینکه وقتی در آینده اپلیکیشنتون رشد کنه یا گیر های ترافیکی داشته باشه شما میتوانید از چند تا instance از pyton server برای مدیریت ترافیک استفاده کنید.
دقیقا اینجا جاییه که داکر یه ابزار دیگه رو معرفی میکنه به عنوان docker compose . این ابزار به شما این امکان رو میده که میتونید کانفیگ container هایی که به هم مرتبط هستند رو در یک فایل yml مشخص کنید . یه فایل Docker-compose.yml به شکل زیر است
123456789101112131415version: '2' services: server: build: . ports: - "3000:3000" volumes: - .:/app database: image: "mariadb:10.3" environment: - MYSQL_ROOT_PASSWORD=MyPassword - MYSQL_DATABASE=MyDatabase ports: - "3306:3306"
همین طور که در بالا مشاهده میکنید ما دو تا سرویس (container) داریم یکی به اسم server و یکی به اسم database که در اون متغیر ها و پورت ها و volume ها رو تعریف کردیم . وقتی فایل Docker-compose آماده میشه ، مدیریت گروهی از container ها که مربوط به یک اپلیکیشن هستند خیلی ساده میشه.