داکر کومپوز ابزاری برای تعریف و اجرای برنامه های Docker چند کانتینری است. به شما امکان می دهد سرویس ها، شبکه ها و سایر تنظیمات برنامه خود را در یک فایل YAML (docker-compose.yml) تعریف کنید و با یک دستور، تمام کانتینرهای مشخص شده در آن فایل را اجرا کنید.
در اصل، docker-compose یک محیط ایزوله برای سرویس های مختلف برنامه شما ایجاد می کند تا با هم اجرا شوند. این می تواند به ویژه برای برنامه های پیچیده ای که به چندین سرویس یا وابستگی نیاز دارند (مانند پایگاه داده ها، message queues ها و غیره) مفید باشد. علاوه بر این، 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-compose
2. داکر کومپوز باینری را اجرایی کنید:
sudo chmod +x /usr/local/bin/docker-compose
3. با اجرای دستور زیر مطمئن شوید که Docker Compose به درستی نصب شده است:
docker-compose --version
شما باید خروجی مشابه این را ببینید: docker-compose version 1.27.+0 build unknown
همین! اکنون هم Docker و هم 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: یک دستور را در یک کانتینر در حال اجرا اجرا می کند
فایل پیکربندی 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.txt
fastapi
uvicorn
databases
psycopg2-binary
asyncpg
- کتابخانه 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 را قبل از شروع کانتینرها می سازد.