وب سایت عباس باقری

وب سایت شخصی عباس باقریوب سایت شخصی عباس باقری

شروع کار با ایمیج mysql و mariadb در داکر

شروع کار با ایمیج mysql و mariadb در داکر

زمان مطالعه : 3 دقیقه

در این پست به بررسی نحوه راه اندازی دیتابیس mariadb (و mysql) بوسیله داکر پرداخته می‌شود.

دیتابیس mysql به شرکت اوراکل واگذار شد، اما خالق آن یک فورک از آن بنام mariadb ایجاد کرد که همچنان ضمانت متن باز بودن را داراست. توصیه می‌شود دیتابیس mariadb را جایگزین mysql کنید.

قبل از هرچیزی باید راه حلی برای دور زدن تحریم‌ها پیدا کرد. پیشنهاد من استفاده از سرویس docker.ir می‌باشد. ابتدا برای راه‌اندازی دیتابیس mysql، باید از ایمیج آن pull بگیریم:


docker pull mysql

و همچنین برای mariadb:


docker pull mariadb

برای استفاده از دیتابیس، باید یک container از ایمیج دریافت شده، ایجاد کرد:


docker run --detach --name CONTAINER_NAME --env MARIADB_ROOT_PASSWORD=password mariadb:latest

بجای CONTAINER_NAME یک نام دلخواه و از طریق متغیر محیطی MARIADB_ROOT_PASSWORD رمز کاربر root را تعیین کردیم. همیچنین ایمیج mariadb متغیرهای محیطی دیگری نیز دریافت میکند در ادامه به بررسی برخی از آنها پرداخته می‌شود:

متغیر محیطی MARIADB_ROOT_PASSWORD: از طریق این متغیر، رمز کاربر root دیتابیس تعیین می‌شود. این متغیر محیطی برای mysql با نام MYSQL_ROOT_PASSWORD در دسترس است.

متغیر محیطی MARIADB_ROOT_PASSWORD_HASH: مانند متغیر قبلی، برای تغیین رمز کاربر root به کار می‌رود. این متغیر محیطی برای mysql در دسترس نیست.

متغیر محیطی MARIADB_RANDOM_ROOT_PASSWORD: درصورتی که مقداری غیر از خالی دریافت کند، یک رمز رندوم برای کاربر root ایجاد می‌شود. رمز ایجاد شده به صورت لاگ در ترمینال هنگام ایجاد کانتینر برای کاربر مشخص می‌شود. همیچنین این متغیر برای ایمیج mysql با نام MYSQL_RANDOM_ROOT_PASSWORD نیز در دسترس می‌باشد.

متغیر محیطی MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: درصورتی که مقداری به غیر خالی دریافت کند، امکان مشخص کردن مقدار خالی برای رمز کاربر root را می‌دهد. این متغیر محیطی با نام MYSQL_ALLOW_EMPTY_PASSWORD برای دیتابیس mysql در دسترس می‌باشد.

برای راه‌اندازی دیتابیس mariadb مشخص کردن حداقل یکی از متغیرهای محیطی بالا ضروری است.

متغیر محیطی MARIADB_DATABASE یا MYSQL_DATABASE: این متغیر محیطی، نام دیتابیس را دریافت کرده و هنگام شروع کانتینر برای اولین بار، یک دیتابیس با آن نام ایجاد می‌کند.

متغیر محیطی MARIADB_USER یا MYSQL_USER: یک نام دریافت می‌کند و یک کاربر با این نام برای دیتابیس ایجاد شده از طریق متغیر محیطی MARIADB_DATABASE، با تمام دسترسی‌ها ایجاد می‌کند.

دقت شود این کاربر فقط برای دیتابیس ذکر شده می‌باشد و نباید برای ایجاد یک super user از آن استفاده کرد.

متغیر محیطی MARIADB_PASSWORD و MYSQL_PASSWORD:رمز کاربر ایجاد شده، در متغیر محیطی قبلی را مشخص می‌کند.

متغیر محیطی MARIADB_MASTER_HOST: هاستی را مشخص می‌کند که کانتینر قرار است به آن متصل شود و از آن یک کپی ایجاد کند.

متغیر محیطی MARIADB_REPLICTION_USER: برای مشخص کردن نام کاربری مرتبط به MARIADB_MASTER_HOST استفاده می‌شود.

متغیر محیطی MARIADB_REPLICTION_PASSWORD_HASH و MARIADB_REPLICTION_PASSWORD: برای مشخص کردن رمز عبور مرتبط به دو متغیر محیطی بالا استفاده می‌شود.

متغیر محیطی MARIADB_MYSQL_LOCALHOST: موقعی که مقداری غیر از خالی دریافت کند، کاربر mysql@localhost را ایجاد می‌کند.

متغیر محیطی MARIADB_MYSQL_LOCALHOST_GRANTS: سطوح دسترسی برای کاربر mysql@localhost را مشخص می‌کند. مقادیر این متغیر محیطی با کمک ویرگول از یکدیگر جدا می‌شوند.

پسوند FILE_ امکان لود کردن مقدار متغیرهای محیطی حساس از نظر امنیتی را فراهم می‌کند.

برای مطالعه در مورد سایر متغیرهای محیطی مرتبط با دیتابیس mariadb میتوانید از این لینک استفاده کنید.

ایجاد کانتینر از طریق docker-compose:

برای ایجاد کانتینر از docker-compose می‌توان مانند نمونه می‌توان عمل کرد:


version: '3.1'

services:
    ...
    db:
        image:mariadb
        restart: always
        environment:
            MARIADB_ROOT_PASSWORD_FILE: /run/secret/mariadb-root
    ...

برای اتصال از سایر کانتینرها باید مقدار هاست دیتابیس را برابر با db نام درنظر گرفته شده برای سرویس کانتینر mariadb قرار داد.

قرار دادن محتوای اولیه برای دیتابیس:

در صورتی که فایلی با یکی از پسوندهای sh، sql، sql.gz، sql.xz و یا sql.zst درون فولدر docker-entrypoint-initdb.d/ مربوط به کانتینر دیتابیس قرار داده شود، در موقع راه اندازی اولیه کانتینر دیتابیس، اجرا می‌شود:


version: '3.8'
    services:
        ...
        db:
            ...
            volume:
                - ./data.sql:/docker-entrypoint-initdb.d/data.sql
            ...
        ...

دسترسی به دیتابیس خارج از کانتینر:

هاست مربوط به دیتابیس به طور پیشفرض 127.0.0.1 می‌باشد ولی قابل تغییر نیز می‌باشد.

دسترسی به محیط bash کانتینر :

برای دسترسی به محیط bash مربوط به کانتینر mariadb مانند نمونه می‌توان عمل کرد:


docker exec -it CONTAINER_ID bash

برای دریافت id مربوط به هر کانتینر میتوان از دستور زیر کمک گرفت:


docker ps

اکسپورت گرفتن از دیتابیس:

درصورتی که نیاز به گرفتن اکسپورت از یکی از دیتابیس‌های کانتینر mysql دارید میتوان مانند مثال زیر عمل کرد:


docker exec -i CONTAINER_ID  /usr/bin/mysqldump -uUSER -pPASSWORD DB_NAME > DB_PATH.sql

همچنین برای mariadb:


docker exec -i CONTAINER_ID  mariadb-dump -uUSER -pPASSWORD DB_NAME > DB_PATH.sql

ایمپورت به دیتابیس:

در صورتی که نیاز به ایمپورت دیتابیس دارید:


docker exec CONTAINER_ID mysql -uUSER -pPASSWORD DB_NAME < DB_PATH.sql

همچنین برای mariadb:


docker exec -i CONTAINER_ID mariadb -uUSER -pPASSWORD DB_NAME < DB_PATH.sql