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į. Renkuosi šias technologijas:

Projekto Docker’izavimas tai jau atskira visai padorios apimties tema, o štai duomenų bazės Docker’izavimą aptarsime dabar. docker-compose.yml failo duomenų bazės sekcija galėtų atrodyti kaip nors panašiai:

---
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: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
    volumes:
      - ./database:/docker-entrypoint-initdb.d
      - ./data:/var/lib/mysql
...

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 pasitelkiame docker-compose’o „command“ direktyvą ir paduodame papildomus parametrus duomenų bazės sukūrimui su „utf8“ charset’u:

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

Na ir žinoma labai patogūs „volumes“ elementai (direktorijų mūsų kompiuteryje ištransliavimas į Docker konteinerį), kur pirmasis elementas:

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

užtikrina, kad visi mano projekte esančio „database“ katalogo failai su plėtiniais *.sh, *.sql, *.sql.gz būtų automatiškai įvykdyti vos tik sukūrusiame konteineryje. Tokiu būdu mes galime įgyvendinti primityvią, bet automatizuotą duomenų bazės migracijų sistemą (kad programuotojui pasikūrinėjant projektą pirmą kartą savo kompiuteryje nereikėtų rankiniu būdu paleidinėti visų DB migracijų). Sakykim pirminį DB dump’ą saugome kaip 000.sql.gz (žinoma jei reikia), o tolimesnes migracijas 001.sql, 002.sql ir t.t. Nes jos bus vykdomos iš eilės pagal bylos pavadinimą.

Kaip žinia, įvykdžius komandą docker-compose down bus pašalinami su projektu susiję konteineriai ir dings visa juose saugota informacija (taigi ir pati duomenų bazė). Kad taip nenutiktų, mes naudojame dar vieną „volumes“ elementą:

./data:/var/lib/mysql

Taip mes išsaugosime duomenų bazės failus projekte esančiame kalaloge „data“, duomenų bazė liks programuotojo kompiuteryje net ir ištrynus konteinerį bei vėliau bus vėl prijungta prie kito naujai sukurto Docker konteinerio. Dabar mūsų duomenys saugūs.

Jei projekte naudojama kokia nors versijų kontrolės sistema, kaip pvz. Git, rekomenduotina „data“ direktoriją įtraukti tarp ignoruojamųjų, kad DB failai atsitiktinai neiškeliautų ten, kur nereikia.

Galų gale 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 konteineryje esantis projektas ją matys ne kaip localhost, bet kaip some-project-db (host = duomenų bazės container_name docker-compose.yml faile).

Pavyzdyje naudoti Docker image’ai turi daug daugiau konfiguravimo galimybių, nei buvo matoma pavyzdyje, plačiau apie jas čia:

Docker Compose įrankis irgi leidžia labai daug: