Jakub Jedelský
Dění kolem lehkých linuxových kontejnerů jde spíše kolem mě. Až na Docker - čím déle jej sleduju, tím víc se mi líbí. A konečně jsem se dopracoval i k tomu si s ním trošku pohrát.
Chvilka nezajímavého povídání: Potřeboval jsem testovat a upravovat SQL dotazy nad MySQL. Už jsem vyrostl z toho, že si všechno nainstaluju do svého systému a pak nevím, co mi kde běží - snažím se jej naopak udržovat tak nějak v čistotě. Taky se mi s daty nechtělo pracovat na vzdáleném serveru - třeba ve vlaku je připojení dost mizerný. A v neposlední řadě se mi nechtělo kvůli MySQL serveru rozcházet KVM virtualizaci. Takže ideální čas pro Docker. Konec nezajímavého povídání. Teda jak pro koho...
Znám pouze základy, takže tu nečekejte připravený Dockerfile (to třeba později, hehe), ale jen "tupý" postup, jak si rozběhnout jednoduchý MySQL server. Zároveň jsem dost línej rozepisovat, co jednotlivé příkazy přesně znamenají. Naštěstí u každého můžete použít --help
nebo nakouknout do dokumentace.
Vše začíná stažením obrazu (image) systému, který chcete použít. Já vyrůstal s rpm, takže CentOS byla jasná volba:
$ docker pull centos
Zkusíme kontejner nastartovat a hned se přepnout do příkazové řádky:
$ docker run -t -i centos /bin/bash
bash-4.1#
Systém si zaktualizuju, nainstaluju balíčky, které potřebuju ...
bash-4.1# yum -y update
bash-4.1# yum -y install mysql mysql-server
... a zkusím pustit MySQL server (což mi skončilo chybou).
bash-4.1# service mysqld start
/etc/init.d/mysqld: line 23: /etc/sysconfig/network: No such file or directory
Tento soubor se načítá jen pro dodatečné funkce; init skript uspokojíme i prázným souborem. Služba pak naběhne jak má:
bash-4.1# touch /etc/sysconfig/network
bash-4.1# service mysqld start
Initializing MySQL database: ...
(...)
Starting mysqld: [ OK ]
Funguje! Jen po odhlášení z kontejneru zjistíte, že nic neběží a že i vytvoření network souboru bylo zbytečné.
Abych si upravený obraz mohl spustit a připojit se na něj, je potřeba změny commitnout (omlouvám se za to cizí slovo, ale nějak mě nenapadá český ekvivalent). Docker pracuje s otisky podobně jako git (odtud ten commit) - nazývá je jednoduše ID. Poslední změněný obraz ukáže příkaz ps:
$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5055fbceaec centos:6.4 /bin/bash 9 minutes ago Exit 0 cocky_brown
A o commit se postará příkaz ... wait for it ... commit:
$ docker commit e5055fbceaec centos/mysql
Tímto jsme řekli, že změny, které jsou v otisku e5055fbceaec
chceme uložit pod centos/mysql
.
Teď už zbývá jen MySQL v kontejneru spustit a přesměrovat si porty:
docker run -d -p :3306:3306 centos/mysql /usr/bin/mysqld_safe
A to je vše. Teď se jen musíme ze systému připojit ...
# mysql -u root -h 0.0.0.0
ERROR 1130 (HY000): Host '172.17.42.1' is not allowed to connect to this MySQL server
... a zjistíme, že to vlastně úplně nejde. Proč? To nechám na pozorném čtenáři, případně do dalšího článku.
Závěrem snad jen - běžící kontejnery vypíše příkaz ps
a zastaví stop
:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
beae68f2b5a3 centos/mysql:latest /usr/bin/mysqld_safe About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp focused_nobel
$ docker stop beae68f2b5a3