MySQL w kontenerze i zdalny dostęp, czyli Docker w akcji

Docker to bardzo fajne narzędzie. Jednym z przypadków użycia jest budowanie aplikacji w oparciu o architekturę mikroserwisów. Zobacz jak chce wykorzystać dobrodziejstwa dockera w swoim projekcie.

Docker w akcji

Każda aplikacji będzie miała osobną bazę danych. Obecna aplikacja korzysta MySQL, dlatego też właśnie na nim się skupię. Za pomocą komendy poniżej zaciągam oficjalny obraz dockera z MySQL.

sudo docker pull mysql

Chwilę potrwa ściągniecie wszystkich zależności.

Teraz mogę postawić pierwszy kontener z MySQL.

Najprostsza komenda, która to zrobi to:

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

my-secret-pw zastępujemy oczywiście swoim hasłem dla roota

Masz kontener i co teraz?

W sumie nic, nie zrobiłeś mapowania portów, więc ten serwer mysql nie będzie widoczny ani w twoim komputerze host (komputer na którym uruchamiasz kontenery) ani w innych kontenerach. Możesz jednak odpalić basha na kontenerze oraz podpiąć jego konsole i sprawdzić, że serwer rzeczywiście działa.

sudo docker exec -it id_kontenera /bin/bash

Chcąc stworzyć trochę bardziej użyteczny kontener, przekieruj porty z kontenera na hosta. Aby to zrobić musisz stworzyć kontener na nowo.

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 9001:3306 mysql

dodałem -p 9001:3306 mówi to tyle, że otwórz port 9001 na hoście i przekieruj na porty 3306 w kontenerze (3306 to domyślny port mysql).

Masz teraz kontener i przekierowane porty. Aby jednak móc podłączyć się do mysql z zewnątrz musisz skonfigurować jeszcze sam serwer bazodanowy.

Przejdź do konsoli dockera.

sudo docker exec -it id_kontenera /bin/bash

Zainstaluj w kontenerze VIM’a, przyda się do edycji.

apt-get update

apt-get install vim 

Edytuj plik /etc/mysql/my.cnf

vim /etc/mysql/my.cnf

Odkomentuj bind-address i zmień na:

bind-address = 0.0.0.0

Zaloguj się do mysql:

mysql -u root -p

Zostaniesz poproszony o hasło.

Musisz jeszcze dać uprawnienia dla użytkownika root aby mógł logować się z dowolnego hosta. Wykonaj:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

To już prawie wszystko. Musisz jeszcze zresetować kontener.

2x CRTL + D aby wyjść z MySQL i konsoli kontenera

sudo docker restart id-kontenera

Powinno już wszystko działać. Jednak ja głowiłem się jeszcze przez godzinę bo jednak mi nie działało. Na hoście próbowałem się zalogować do mysql w taki sposób:

mysql -u root -P 9001 -p

Podawałem poprawne hasło i nic. Nie wiem jeszcze czemu ale zadziało dopiero, gdy wpisałem:

mysql -u root -P 9001 -p -h lokalne-ip-maszyny