Docker’izuota projekto MySQL duomenų bazė

Tarkim noriu prie projekto turėti MySQL duomenų bazę, bet dėl kokių nors priežasčių nenoriu MySQL instaliuoti į savo kompiuterį. Naudosime šias technologijas:

  • Docker
  • Docker Compose (Jei naujojate Mac’ą tai pastarąją greičiausiai suinstaliavote kartu su pačiu Dockeriu)
  • Oficialią Docker’izuotą MySQL ar MariaDB versiją pagal poreikį

Tiesiai prie reikalo. docker-compose.yml failo duomenų bazės sekcija galėtų atrodyti kaip nors panašiai:

# docker-compose.yml file
--- version: '3' services: db: image: mysql:8 container_name: some-project-db ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: some_project_db command: --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password volumes: - ./database:/docker-entrypoint-initdb.d - data:/var/lib/mysql
volumes: data: {}

Esant tokiai konfiguracijai rezultate mes gausime Docker konteinerį su duomenų bazės root vartotoju, kurio slaptažodis irgi root. Taipogi jei leisime konteinerį su nustatymais „pagal nutylėjimą“ gausime duomenų bazę su „Latin“ character set’u, kad šį reikalą sutvarkyti naudosime docker-compose’o „command“ direktyvą su papildomais parametrais duomenų bazės sukūrimui su „utf8“ charset’u:

--character-set-server=utf8 --collation-server=utf8_general_ci

Ir kadangi naujesniame MySQL’e buvo pakeista autentifikacija, o ne visos klientinės  programos ją palaiko, yra galimybė persijungti į ankstesnį variantą prie „command“ pridedant:

--default-authentication-plugin=mysql_native_password

Pirmasis „volumes“ skilties elementas

./database:/docker-entrypoint-initdb.d

užtikrina, kad visi projekte esančio „database“ katalogo failai su plėtiniais *.sh, *.sql ar *.sql.gz būtų įvykdyti automatiškai vos tik sukūrusiame konteineryje. Tokiu būdu galime įgyvendinti primityvią pradinę duomenų bazės migraciją (kad pasikūrinėjant projektą pirmą kartą nereikėtų rankiniu būdu paleidinėti visų DB migracijų). Sakykim pirminį DB dump’ą saugome kaip 000.sql.gz, o tolimesnes migracijas – 001.sql, 002.sql ir t.t., kad jos būtų vykdomos pageidaujamu eiliškumu.

Paleidus komandą docker-compose down bus pašalinti su projektu susiję konteineriai ir dings visa juose saugota informacija (taigi ir pati duomenų bazė). Kad taip nenutiktų, pridėkime dar vieną „volumes“ elementą:

data:/var/lib/mysql

Taip duomenų bazės failai bus apsaugoti nuo dingimo net ir konteinerio ištrynimo atveju,  bei vėliau bus prijungti prie kito naujai sukurto konteinerio. Dabar mūsų duomenys saugūs. Jei visgi prireiktų pašalinti volume’ą, kuriame išsaugoti duomenų failai, ta galima atlikti komanda docker-compose down -v.

Leidžiame mūsų projektą su komanda docker-compose up ir jei viskas gerai, turėtume gauti veikiančią duomenų bazę. Tereikia nepamiršti, kad kitame Dockerio konteineryje esantis projektas ją matys ne per localhost, o per some-project-db (host = container_name iš docker-compose.yml failo).

Pavyzdyje naudoti Docker image’ai turi daugiau konfiguravimo galimybių, plačiau apie jas čia:

Docker Compose galimybių aprašymas: