Някои от най-честите въпроси, задавани от нашите потребители, са относно поддръжката на MariaDB в Docker и по-специално как може да се използва при специфично внедряване на разработка или производство. Тази серия от статии ще се опита да покрие няколко случая на използване на Docker и MariaDB.
Защо да изберете Docker за MariaDB?
- Docker контейнерите могат да се използват за тестване, внедряване и освобождаване на приложения във всяка среда.
- Разгръщанията на Docker могат да се автоматизират лесно, като се създават среди за внедряване и лесно се възпроизвеждат в етапа и производството.
- Docker е лека виртуализация. Хипервизори не са необходими и контейнерът MariaDB Docker трябва да работи също толкова добре, колкото нормалната инсталация на MariaDB без забележими излишни разходи.
- Docker е агностичен – след като инсталирате Docker на вашата операционна система, инструкциите за стартиране на контейнери са абсолютно същите, независимо дали използвате CentOS, Debian или Ubuntu, или дори Mac OS X и Windows.
Няколко важни точки за Docker контейнерите
- Docker контейнерите са неизменни. Те не могат да бъдат лесно променени след стартиране (освен ако не прикачите към него и не счупите всичко).
- По подразбиране и поради горното данните не са постоянни. Docker използва обеми от данни, за да коригира това. Контейнерът MariaDB използва обем за запазване на данни (повече за това по-късно).
Състояние на MariaDB в Docker
MariaDB винаги е била много добре поддържана в Docker в продължение на няколко години, благодарение на много усилия на екипа и общността на Docker. До ден днешен Docker поддържа и трите версии на MariaDB:5.5, 10.0 и 10.1. Докер контейнерът MariaDB има следните особености:
- Root паролата на MariaDB може да бъде зададена или генерирана чрез променливи на средата.
- Нов потребител и празна база данни могат да бъдат създадени чрез същия процес, както по-горе.
- Екземплярът има по подразбиране /var/lib/mysql постоянен обем данни, който можете да оставите на docker да управлява вътрешно или да го монтирате в директория по ваш избор.
- Екземплярът на контейнера може да бъде монтиран върху съществуващ обем данни (например резервно копие).
- Мрежовите портове могат да бъдат обвързани с произволни портове от страната на хоста.
- Базата от знания на MariaDB има обширна документационна статия за docker. Прочетете го!
Случай на използване на Docker № 1:Многократно наемане
Често срещан случай на използване на MariaDB и Docker е изпълняването на няколко екземпляра на MariaDB на едни и същи физически хостове. Вече съществуват решения като MySQL Sandbox и други, но нито едно от тях не предоставя гъвкавостта, лекотата на използване и мощността, които Docker предлага.
За да илюстрираме нашата гледна точка, нека започнем три различни екземпляра на MariaDB, всеки от които работи с различна основна версия:
docker run -d -p 3301:3306 -v ~/mdbdata/mdb55:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 -v ~/mdbdata/mdb10:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 -v ~/mdbdata/mdb11:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb11 mariadb:10.1
Docker автоматично ще изтегли официалните изображения на mariadb от хранилището и ще ги стартира. Сега можем просто да се свържем с всеки от тези екземпляри, като използваме предоставения порт и парола:
$ mysql -u root -padmin -h 127.0.0.1 -P3302 Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 2 Server version: 10.0.22-MariaDB-1~jessie mariadb.org binary distribution
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
Имайте предвид, че всеки от нашите екземпляри ще използва постоянен обем от данни, разположен под ~/mdbdata директория – Docker автоматично ще създаде това дърво на директории за нас.
След като направихме това, нека се задълбочим в разширените функции на Docker. Docker поддържа Linux контролни групи (cgroups), които могат да се използват за ограничаване, акаунт или изолиране на използването на ресурси. Да кажем, че искаме нашия екземпляр MariaDB 10.1 (с име mdb11 ) да има по-висок приоритет на процесора от другите два екземпляра. В този случай можем да намалим дяловете на процесора на mdb10 и mdb55 . Всеки екземпляр има 1024 максимални споделяния на процесора по подразбиране, така че нека пресъздадем нашия mdb55 и mdb10 контейнери с 512 споделяния на процесора всеки.
В преамбюла казахме, че Docker контейнерите са неизменни. Ако искаме да променим параметрите на нашите контейнери, трябва да ги премахнем. Това не е проблем, защото сме дефинирали постоянни обеми данни в ~/mdbdata, така че действителното съдържание на нашата база данни ще се запази, когато пресъздаваме контейнерите.
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --cpu-shares=512 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpu-shares=512 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
Пресъздадохме двата екземпляра на MariaDB с по 512 споделяния на процесора всеки. Това обаче е мека граница и се прилага само когато процесите се конкурират за цикли на процесора. Ако другите екземпляри са неактивни, всеки екземпляр може да използва до 100% от всички процесори. На практика това означава, че ако и трите екземпляра използват процесора едновременно, всеки от двата първи контейнера, които имат по 512 споделяния всеки, (mdb55 и mdb10 ) ще може да използва до 25% от всички процесори, докато третият контейнер, който има 1024 споделяния, ще може да използва до 50% от всички процесори.
Друга възможност е да свържете екземпляра към конкретно ядро на процесора, така че нека пресъздадем контейнерите и да направим това:
docker rm -f mdb55 mdb10 mdb11
docker run -d -p 3301:3306 --cpuset-cpus=0 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpuset-cpus=1 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 --cpuset-cpus=2-3 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb11 mariadb:10.1
В примера по-горе, като се има предвид система с 4 CPU Core, моите контейнери mdb55 и mdb10 всеки ще работи на отделно, единично ядро на процесора, докато mdb11 ще и двете останали ядра.
Можем също така да контролираме начина, по който нашите контейнери имат достъп до дискови и паметови ресурси, което определено е полезно при натоварена система – не искате например заявка за разработка, използваща всички дискове на вашите екземпляри за тестване на натоварване. Докато ограниченията на паметта са ясни, блоковите IO споделяния работят по подобен начин като споделените на процесора, с изключение на това, че делът на блоково IO по подразбиране е 500 в диапазон от 10 до 1000.
Нека ограничим нашите два първи контейнера до 512M памет и 250 блокови IO споделяния:
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
Подобно на това, което видяхме в примера за споделяне на процесора, ако трите екземпляра се конкурират за IO, всеки от двата първи контейнера ще бъде ограничен до 25% от наличния IO капацитет, като третият контейнер ще бъде ограничен до оставащия капацитет, напр. 50%.
Има много повече за ограниченията по време на изпълнение на Docker от това, за което говорихме тук в тази статия. Моля, прочетете обширната справка за изпълнение на Docker за да научите за всички възможни опции.