هر آنچه از Docker-Compose در پروژه های خود نیاز دارید

درباره docker composeداکر کومپوز ابزاری برای تعریف و اجرای برنامه های Docker چند کانتینری است. به شما امکان می دهد سرویس ها، شبکه ها و سایر تنظیمات برنامه خود را در یک فایل YAML (docker-compose.yml) تعریف کنید و با یک دستور، تمام کانتینرهای مشخص شده در آن فایل را اجرا کنید.در اصل، docker-compose یک محیط ایزوله برای سرویس های مختلف برنامه شما ایجاد می کند تا با هم اجرا شوند. این می تواند به ویژه برای برنامه های پیچیده ای که به چندین سرویس یا وابستگی نیاز دارند (مانند پایگاه داده ها، message queues ها و غیره) مفید باشد. علاوه بر این، docker-compose فرآیند مقیاس‌بندی برنامه‌تان را ساده‌تر می‌کند و به شما امکان می‌دهد به راحتی نمونه‌هایی از سرویس خود را در صورت نیاز اضافه یا حذف کنید.چرا باید از Docker Compose استفاده کنیم:تعریف برنامه: با استفاده از Docker Compose، توسعه‌دهندگان می‌توانند کل برنامه خود را در یک فایل مشخص کنند. این امر به اشتراک گذاری و کنترل نسخه معماری برنامه را آسان می کند.استقرار چند کانتینر: با Docker Compose، می‌توانید برنامه‌های چند کانتینری را با تعریف هر سرویس به طور جداگانه اجرا کنید. کانتینرها قادر خواهند بود به طور یکپارچه با یکدیگر ارتباط برقرار کنند.سادگی: Docker Compose فرآیند مدیریت کانتینرها را ساده می‌کند. توسعه دهندگان می توانند با یک فرمان کل برنامه خود را شروع، متوقف یا مجددا راه اندازی کنند.همانند سازی: با استفاده از ویژگی مقیاس‌بندی در Docker Compose، توسعه‌دهندگان می‌توانند به راحتی سرویس برنامه خود را به صورت افقی تکرار کنند تا ظرفیت را افزایش دهند.سازگاری: Docker Compose کمک می‌کند تا اطمینان حاصل شود که محیط‌های توسعه در ماشین‌های مختلف سازگار هستند. این مسئله «روی دستگاه من کار می‌کند» را حذف می‌کند و اشکال‌زدایی مشکلات را آسان‌تر می‌کند.به طور کلی، Docker-compose توسعه و استقرار برنامه‌های کاربردی چند کانتینری را ساده می‌کند و در عین حال ثبات و تکرارپذیری را در محیط‌های مختلف حفظ می‌کند.نصب داکر در ابونتوبرای نصب Docker دستورات زیر را مرحله به مرحله در ترمینال خود اضافه کنید:برای افزودن کاربر به گروه docker در لینوکس، می‌توانید این مراحل را دنبال کنید:یک پنجره ترمینال باز کنید و دستور زیر را وارد کنید:sudo usermod -aG docker <username>نام کاربری واقعی خود را جایگزین <username> کنید.یکبار لوگ اوت کنید و دوباره وارد شوید تا تغییرات اعمال شوند.همین! اکنون، باید بتوانید دستورات Docker را بدون نیاز به استفاده از sudo هر بار اجرا کنید.نصب داکر کومپوز در ابونتو1. باینری Docker Compose را با استفاده از curl دانلود کنید:این دستور آخرین نسخه Docker Compose را دریافت می‌کند، بنابراین همیشه به‌روز خواهید بود.sudo curl -L "[https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname](https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname) -s)-$(uname -m)" -o /usr/local/bin/docker-compose2. داکر کومپوز باینری را اجرایی کنید:sudo chmod +x /usr/local/bin/docker-compose3. با اجرای دستور زیر مطمئن شوید که Docker Compose به درستی نصب شده است:docker-compose --versionشما باید خروجی مشابه این را ببینید: docker-compose version 1.27.+0 build unknownهمین! اکنون هم Docker و هم Docker Compose را روی سیستم اوبونتو خود نصب کرده اید.دستورات docker composeدر اینجا برخی از دستورات متداول Docker Compose آورده شده است:docker-compose up: ساخت، (دوباره) ایجاد، راه اندازی و اتصال به کانتینرها برای یک سرویسdocker-compose build: سرویس را می سازد یا بازسازی می کندdocker-compose start: کانتینرهای موجود را برای یک سرویس شروع می کندتوقف و حذف کانتینر هاdocker-compose down: کانتینرها، شبکه‌ها، ایمیج ها و والیوم ها را متوقف و حذف می‌کندdocker-compose stop: اجرای کانتینرها را بدون حذف آنها متوقف می کندفهرست بندی و مدیریت کانتینرهاdocker-compose ps: کانتینر هایی را فهرست میکند که توسط داکرکمپوز استفاده شده در پروژه فعلی اجرا شده باشندdocker-compose logs: خروجی گزارش از سرویس ها را نمایش می دهدdocker-compose exec: یک دستور را در یک کانتینر در حال اجرا اجرا می کنددستوراتی که در داخل فایل yml داکرکمپوز استفاده میشودفایل پیکربندی Docker Compose با فرمت YAML نوشته شده است. در اینجا چند نمونه از دستورات مورد استفاده در فایل‌های docker-compose.yml آمده است:version: نسخه نحو فایل Compose.services: کانتینرها را تعریف کنیدimage: نام ایمیج را که باید برای ایجاد کانتینر استفاده شود را مشخص می کندports: پورت های کانتینر(ها) را در معرض دید میزبان قرار دهیدvolumes: مکان های ذخیره سازی داده های مشترک یا دائمی را بین کانتینرها یا ماشین میزبان تعریف کنیدlinks: وابستگی های بین سرویس ها را پیوند می دهدenvironment: متغیرهای محیطی را تنظیم می کند...اینها تنها چند نمونه از دستورات متعدد ارائه شده توسط Docker Compose هستند. برای اطلاعات بیشتر، می‌توانید اسناد رسمی را بررسی کنید.نحوه استفاده از داکر کمپوزبیایید پروژه کوچکی را که در این مقاله نوشتیم به پایگاه داده متصل کنیم و از DockerCompose برای اجرای کانتینر Fast API و پایگاه داده استفاده کنیم.در مسیر پروژه Dockerfile را تغییر ندهید. فایل main.py و requirements.txt را با محتویات زیر تغییر دهید:#requirements.txtfastapiuvicorndatabasespsycopg2-binaryasyncpg- کتابخانه databases پایتون است که یک رابط آسان و ساده برای تعامل با پایگاه‌های داده رابطه‌ای با استفاده از دستور async/wait فراهم می‌کند. عملیات رایج پایگاه داده مانند query، insert، update و delete داده‌ها از انواع پایگاه‌های داده رابطه‌ای مانند SQLite، MySQL، PostgreSQL، Oracle و غیره را ساده می‌کند. کتابخانه databases همچنین شامل پشتیبانی از SQLAlchemy Core است که به توسعه‌دهندگان اجازه می‌دهد از آن استفاده کنند.- کتابخانه psycopg2-binary بستر اتصال پایگاه داده PostgreSQL به برنامه‌های پایتون را فراهم می‌کند.- کتابخانه asyncpg برای دسترسی به پایگاه‌های داده PostgreSQL به صورت ناهمزمان استفاده می‌شود. این کتابخانه یک API با کاربری آسان برای مدل‌های برنامه‌نویسی همزمان و ناهمزمان ارائه می‌کند که ایجاد برنامه‌های پایگاه داده با کارایی بالا در پایتون را ممکن می‌سازد.کد بالا یک اتصال پایگاه داده را با استفاده از کتابخانه databases در پایتون تنظیم می کند. متغیر DATABASE_URL نشانی اینترنتی را که پایگاه داده در آن میزبانی می‌شود، مشخص می‌کند، و کلاس Database از databases یک کلاینت برای اتصال به آن ایجاد می‌کند.پایگاه داده مورد استفاده یک پایگاه داده PostgreSQL است که در postgres:5432 قرار دارد، با نام کاربری db_user و رمز عبور db_password. نام پایگاه داده ای که به آن متصل می شود db است.هنگامی که کلاینت ایجاد شد، می توان از آن برای اجرای Query SQL در برابر پایگاه داده متصل استفاده کرد.1- async def startup(): ...: این تابع با راه اندازی برنامه FastAPI به پایگاه داده متصل می شود2- async def shutdown(): ...: این تابع با خاموش شدن برنامه FastAPI اتصال پایگاه داده را می بندداکنون زمان استفاده از docker-compose فرا رسیده است. به پوشه پروژه بروید و یک فایل yml ایجاد کنید:cd ~/Desktop/simplefastapi && touch docker-compose.ymlاین یک فایل docker-compose است که دو سرویس postgres و fastapi را تعریف می‌کند.دستور: image: postgres:latest مشخص می کند که می خواهیم از آخرین نسخه ایمیج رسمی PostgreSQL از Docker Hub استفاده کنیم.دستور: Container_name: postgres نام کانتینر را روی "postgres" تنظیم می کند تا شناسایی در لاگ ها و دستورات آسان تر شود.دستور: volumes: - db_data:/var/lib/postgresql/data والیومی با نام به نام db_data ایجاد می‌کند که برای ذخیره فایل‌های داده PostgreSQL به طور مداوم استفاده می‌شود. همچنین این والیوم را در دایرکتوری کانتینر /var/lib/postgresql/data/ قرار می‌دهد، جایی که PostgreSQL فایل‌های پایگاه داده خود را به‌طور پیش‌فرض ذخیره می‌کند.دستور ports: - "5432:5432 پورت 5432 ماشین میزبان را به پورت 5432 کانتینر وصل می کند، به طوری که PostgreSQL می تواند اتصالات را از خارج از کانتینر دریافت کند.دستور environment متغیرهای محیطی را در کانتینر PostgreSQL تنظیم می‌کند. در این مورد، متغیرهای POSTGRES_USER، POSTGRES_PASSWORD و POSTGRES_DB را برای ایجاد یک کاربر و پایگاه داده PostgreSQL جدید با این متغیر ها تنظیم می شود.سرویس Fastapi یک ایمیج Docker را از Dockerfile ارائه شده می‌سازد و آن را به عنوان یک کانتینر اجرا می‌کند.دستور build : برای ساخت ایمیج استفاده میشود. context نشان دهنده مسیر Dockerfile هست و dockerfile برای دریافت نام داکر فایل است برای مثال داکر فایل میتواند اسم متفاوتی داشته باشد مانند old.Dockerfileدستور container_name: fastapi نام کانتینر FastAPI را روی “fastapi” تنظیم می کند.دستور "ports: - "80:80: پورت 80 ماشین میزبان (HTTP) را به درگاه 80 کانتینر وصل می کند و به ما امکان می دهد از طریق درخواست های HTTP به API خود دسترسی داشته باشیم.دستور depends_on: - postgres: به داکر می‌گوید که سرویس postgres را قبل از شروع سرویس fastapi راه‌اندازی کند.در نهایت، volumes: db_data: والیوم db_data را که قبلاً برای PostgreSQL تعریف شده بود، اعلام می‌کند تا اطمینان حاصل شود که هنگام استقرار فایل compose به درستی ایجاد شده است.کانتینرها را بسازید و اجرا کنیداکنون همه کانتینرها را با دستور docker-compose up --build -d شروع می کنیم.اجرای دستور docker-compose up --build -d، ایمیج Docker تعریف شده در فایل docker-compose را قبل از شروع کانتینرها می سازد.