Baza Danych w Dockerze
Jak uruchomić popularne silniki bazy danych za pomocą Dockera? Ktoś powie, że to nic trudnego – z tym się absolutnie zgadzam. Wystarczy wejść na Docker Hub i w wyszukiwarce wpisać nazwę interesującej nas bazy danych.
W większości przypadków dostajemy tam gotowe polecenie docker container run
.
Wklejamy i DZIAŁA 🙂
A gdyby tak iść o krok dalej i chcieć na szybko uruchomić bazę danych wraz z jakimś UI? (narzędziami graficznymi do zarządzania bazą)
Przykład: MySQL i phpMyAdmin.
Jak do tego podejść?
Pierwsza sprawa.
Do czego potrzebujesz tej bazy danych?
Chcesz ją wykorzystać tylko do celów developerskich, a może powiedziano Ci, że jak wrzucisz bazę w Dockera, to cała Twoja aplikacja będzie szybsza? (tak jak z samochodami koloru czerwonego)
Prowadząc webinary, szkolenia i ogólnie rzecz biorąc “udzielając się w społecznośći” – jest to najcześciej pojawiające się pytanie:
Czy baza danych w Dockerze to dobry pomysł ?
Zajrzyj koniecznie do tego posta, gdzie mam nadzieję – znajdziesz odpowiedź. Odsyłam do niego wszystkich zadających podobne pytania.
A potem wróć tutaj i zacznij czytać dalej! ; )
Druga sprawa
Wszystkie omawiane w tym poście przykłady zostały przygotowane z myślą o zastosowaniach DEVELOPERSKICH.
W wielkim skrócie chcę ułatwić Ci życie i pokazać jak odpalić poszczególne silniki bazodanowe na potrzeby developmentu.
Nawet jeśli Twoja aplikacja nie jest skonteneryzowana – zamiast instalować bazę danych, możesz ją szybko uruchomić z poziomu Dockera (i nie zaśmiecać swojego komputera).
Potrzebujemy obrazu dla konkretnego silnika bazy danych. Jak wspominałem, wchodzimy więc na Docker Huba i szukamy tego, co nas interesuje.
Krok pierwszy: stworzenie nowej sieci
Zanim jeszcze wkleisz kod odpowiadający za uruchomienia kontenera z MySQL – zatrzymaj się na chwilę. Jeżeli Twoim celem jest uruchomienie również phpMyAdmin – zacznij od stworzenia nowej sieci.
docker network create -d bridge mysql-net
Dlaczego?
Więcej na temat sieci i komunikacji pomiędzy kontenerami możesz znaleźć w darmowej lekcji DEMO pochodzącej z kursu Docker Maestro.
Krok drugi: uruchomienie kontenera MySQL
Mając utworzoną sieć, przystępujemy do uruchomienia kontenera MySQL.
Uwaga: Jeśli korzystasz z Windowsa to usuń wszystkie “\” i wklej całość w jednej linii.
docker container run --name mysql --restart=always \ -e MYSQL_ROOT_PASSWORD=password123 -p 3307:3306 \ -v mysql-db-vol:/var/lib/mysql \ --network mysql-net \ mysql:5.7
Szybki komentarz do przekazanych w docker container run argumentów:
--name mysql
określa nazwę kontenerarestart=always
zapewni automatyczne uruchomienie kontenera przy każdym restarcie komputera-e MY_SQL_ROOT_PASSWORD
ustawia hasło dla roota-p 3307:3306
baza danych będzie dostępna lokalnie na porcie 3307-v mysql-db-vol:/var/lib/mysql
tworzy nowy volumen mysql-db-vol i podmontowywuje go do katalogu /var/lib/mysql w kontenerze--network mysql-net
podłącza kontener do wcześniej utworzonej sieci
Od tej pory baza działa i możemy wykorzystać ją do naszych celów developerskich – wskazując w konfiguracji połączenia (connection string) aplikacji localhost:3307.
Krok trzeci: Uruchomienie phpMyAdmin
Czas na uruchomienie kontenera phpMyAdmin.
docker container run --name phpmyadmin --restart=always \ -p 8081:80 --network mysql-net \ phpmyadmin/phpmyadmin:latest
Podobnie jak w przypadku kontenera MySQL, dodajemy parametr –restart=always oraz podłączamy kontener do sieci mysql-net.
Dzięki parametrowi-p 8081:80
phpMyAdmin będzie działać na https://localhost:8081
UWAGA: Pomimo tego, że baza danych działa lokalnie na porcie 3307, to phpMyAdmin będzie się komunikował z MySQL na porcie 3306. Wszystko dzięki temu, że obydwa kontenery są podłączone do tej samej sieci – mysql-net.
MySQL & phpMyAdmin w docker-compose
Aby uruchomić bazę danych z pomocą docker-compose, przykładowy plik docker-compose.yml
może wyglądać następująco:
Jeszcze raz podkreślam, że to wersja DEVELOPERSKA ; )
Montujemy volumen o nazwie db-vol
tak, by mieć persystencję danych – inaczej mówiąc nie stracić danych, nawet po zabiciu kontenera czy ponownym uruchomieniu komputera.

Teraz wystarczy wykonać polecenie docker-compose up -d
. Baza danych powinna uruchomić się (w tle) i być dostępna na porcie 3307.
Czas na dodanie phpMyAdmin.
W wersji podstawowej chcemy, by phpMyAdmin mógł rozmawiać TYLKO z lokalnym MySQL i był dostępny lokalnie na porcie 8081 – http://localhost:8081
Warto wspomnieć o jeszcze jednej rzeczy:
Używanie tagu “latest” w rozwiązaniach produkcyjnych to spore ryzyko.
W pełni się z tym zgadzam. Ba, tłumaczę, dlaczego tak jest i jakie to niesie ryzyko TUTAJ.
Chcę jednak przypomnieć, że prezentowany przykład ma służyć do rozwiązań testowych / developerskich. Jak wyjdzie nowa wersja phpMyAdmin, to zwyczajnie z niej skorzystasz. Może będzie miała ciekawsze funkcje.
W związku z tym phpmyadmin/phpmyadmin:latest w tym KONKRETNYM przypadku jest OK.
Jednocześnie zachęcam, by obraz MySQL był w KONKRETNEJ wersji, nawet na potrzeby developmentu. (na prezentowanym przykładzie jest to wersja 5.7)

A tutaj całość (w wersji kopiowalnej)
Odpalamy całość za pomocą docker-compose up -d
i przechodzimy na http://localhost:8081. Przypominam, że hasło do roota jest takie, jak podaliśmy w pliku docker-compose.yml – password123

PhpMyAdmin podłączył się domyślnie do lokalnego serwera bazy danych (działającego w kontenerze).

Połączenie z phpMyAdmin do zewnętrznej bazy danych
Chcąc mieć możliwość podłączania się również do innych serwerów – należy dodać zmienną środowiskową PMA_ARBITRARY=1, tak jak zostało to opisane TUTAJ.

Po zmodyfikowaniu całości i ponownym uruchomieniu ukazuje się nam pole Server. Dzięki temu mamy możliwość podłączania się zarówno do lokalnego jak i do zewnętrznych serwerów MySQL.
Aby podłączyć się do lokalnego serwera, należy wpisać db
. Wynika to z pliku docker-compose.yml, w którym tak właśnie nazwaliśmy serwis bazodanowy.

Podsumowanie
Dzisiejszy post to kolejny przykład tego, jak Docker ułatwia życie w codziennej pracy. Za pomocą kilku prostych kroków jesteśmy w stanie uruchomić bazę danych i zarządzać nią z poziomu przeglądarki.
W razie czego usuwamy tylko kontenery (i volumeny) i komputer zostaje CZYSTY.
PS. Chcesz więcej takich TUTORIALOWYCH przykładów? Napisz w komentarzu 🙂