Blog (17)
Komentarze (120)
Recenzje (0)

Docker part two — Docker-compose, Dockerfile

Strona główna@themamuthDocker part two — Docker-compose, Dockerfile
09.07.2018 13:17

W poprzednim moim wpisie o docker, zatytułowanym docker part one. W środowisku docker, wspólnie uruchomiliśmy kontener zawierający stronę www z WordPress. Nasz CMS wykorzystywał też bazę danych MySQL, uruchomioną na innym kontenerze. Zastanawiać nas może na ile takie rozwiązanie jest wydajne w porównaniu do środowiska które, to byśmy uruchomili bezpośrednio na naszej maszynie. Bez konteneryzacji czy wirtualizacji. Przyjrzyjmy się zatem testom porównawczym naszego środowiska. Zapraszam, miłej lektury

Posprzątajmy po poprzednim zadaniu (oczywiście nie musisz tego robić). Usuńmy nasze kontenery:

user@piotrskoska1:~$ docker container rm $(docker ps -aq)edb3432afb3a96d2d93ad06f
bDUfsbFj

Teraz obrazy:

user@piotrskoska1:~$ docker image rm $(docker images -q)Untagged: wordpress:latestUntagged: wordpress@sha256:7122e8924cfb8bc1f4bc0d5a01f6df7d8186f5661c385511079c60c4feca5019Deleted: sha256:1d3cc82944da303e17b2fa48b5fa04d69acec1a0f4bd15d76a94d1004b84b232Deleted: sha256:88db234a03bf4ad13b083cfb123aa615d62222461374751ce7331088ff08fcc1Deleted: sha256:74697bb528e0642d88f3de7877209cc78bf5f69698646c419b1b1d6bc64dd1e1Deleted: sha256:0caded870cec018bf959198a31dca58e971ea61b73fc4092af2d330939bf8b9fDeleted: sha256:0d50b480bddfbc8ada4b1491d1362928c46c4f0ab10a2ef22d43c35f75c017a6Deleted: sha256:d7bacdcf48a705692458f4a179771b03cda1295fb2ae9bc4ea98fe28094a908fDeleted: sha256:a718d503c157a426eaa689c2f68ae559d4cb14b13d15e55397415885f4d4ff4fDeleted: sha256:988609d9c0c86b7009b1e5b8f3ee9e8bc21e4924a7ee744c9f72684253a52f77Deleted: sha256:a512a51be99cce43c5d09c8acef49e476750fa2fad8158e34a0e5b4d270df9a2Deleted: sha256:4c576a78131867f44bcca53842b71f6177f4995b1aed5cd3c90c3c392a6a6655Deleted: sha256:6d1656c531823c4d642fca70a9c68064c67ab1681185edeb8bc40644d4e9a277Deleted: sha256:327cf04f6a364c92f3d81e145af7bb1abef97c0c599a7bde0032abd7c50c3e8cUntagged: php:7.1.19-apache-stretchUntagged: php@sha256:5be4aaa759a3ce5e615bdb870ec75d833bb7a3dd8d4c379220fbf82da6a5e45aDeleted: sha256:9a8614ec9b1c5b29bdf0b4e0de93a39ef0ef80b43c321acbe0085e4c6e9f6131Deleted: sha256:684d1d1e38089c6574d771864ed5055fd0ae0dbcc515994c9af4225a3d6f22b0Deleted: sha256:cd554c64ce4cdf6e8d3cfd691040a577676c2608a77ceb5bae8351bf26696a1cDeleted: sha256:a83b1fdac804c3db78e098fbf225ed639a3edeb110156fd17cc95f5a4ba51ed3Deleted: sha256:ab384881c32ca22a6b055d1aa4cd32fb13414187f2947d8a28cd0917a8355ff0Deleted: sha256:f074816ecc1eaa60645b46cd4df89f602d5daeb042fd3aa8a633f4176198144cDeleted: sha256:0086afcff0b2a1fd02c1c4d85dedfe14ba9806440a06d167db207e8eb6a415aaDeleted: sha256:ce1045ecd636ce094cd8b7e096dbb3cba29f36f20225faceb973ad551ffdd91bDeleted: sha256:4c0b8b3e286f6d5f1d9948f47e282ba3363769288509fe39877b07ee4659e140Deleted: sha256:bd4f1fc037fbaecfef37720c56db7020a4da60a5d258ff57d476fc07cef34940Deleted: sha256:e405616e9966e660f73d8c440aa53b10c2f1fac5dc32ed734f33dabd188fca38Deleted: sha256:d7b9430142428e5576b372eff134bdec3224ddf262ca0ea86642370ae19892a2Deleted: sha256:902cf35f1f491062dda3941dd168e1286158d7742dee7b116aaeac9837e0a487Deleted: sha256:07eaea308725a6305dae826ccd39ce73afe742c2503efa093c471dab49f3d5e9Untagged: mysql:5.7.22Untagged: mysql@sha256:1203dfba2600f140b74e375a354b1b801fa1b32d6f80fdee5f155d1e9f38c841Deleted: sha256:66bc0f66b7af6ba3ea96582685d3afcd6dff93c2f8999da0ffadd67b280db548Deleted: sha256:e011b4529a892ab54f15200c43d85ac4b9feb4b3dca14d129d23aba434bfca4fDeleted: sha256:8c1cd5fbd44434aff000f30595af979244ecfdedb54033d2822aa7f1764c7d41Deleted: sha256:b3c692a6ea0dcc16eee1282e32522d7906f5bd35ad2d2b8e2a1a3f2a322d80e8Deleted: sha256:e9233555be2dca57164cda0d8cda82bdfd7e585b8281cf53f954fba9b55e25ebDeleted: sha256:c0dcf468053a84ab7e4d982267d6423737752582acc1688f98b59950d3c3409aDeleted: sha256:e2221c9439fec64bbc63a4394aa09fb07285f4a9860833dfd0186b58dd4b03a4Deleted: sha256:7ddf06c0d571150fd0770f0cacc7781da3fb66c8c1b0fef6bbde93f5527a7705Deleted: sha256:52187c3153b1efb7fd75f052fe00d80f2b271a62f42aa91d50146e954eb9ea4aDeleted: sha256:ae038d900eb36ccbe2a2f552a3ab2ab2f09bd7661ac767ee6516d2682a54efa6Deleted: sha256:772e498d907ce04162231d1c2361e5ae8e4ae26712ab0c72fea5f1eae4a28182Deleted: sha256:9c46f426bcb704beffafc951290ee7fe05efddbc7406500e7d0a3785538b8735Untagged: ubuntu:latestUntagged: ubuntu@sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6dDeleted: sha256:113a43faa1382a7404681f1b9af2f0d70b182c569aab71db497e33fa59ed87e6Deleted: sha256:a9fa410a3f1704cd9061a802b6ca6e50a0df183cb10644a3ec4cac9f6421677aDeleted: sha256:b21f75f60422609fa79f241bf80044e6e133dd0662851afb12dacd22d199233aDeleted: sha256:038d2d2aa4fb988c06f04e3af208cc0c1dbd9703aa04905ade206d783e7bc06aDeleted: sha256:b904d425ea85240d6af5a6c6f145e05d5e0127f547f8eb4f68552962df846e81Deleted: sha256:db9476e6d963ed2b6042abef1c354223148cdcdbd6c7416c71a019ebcaea0edbUntagged: hello-world:latestUntagged: hello-world@sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77Deleted: sha256:e38bc07ac18ee64e6d59cf2eafcdddf9cec2364dfe129fe0af75f1b0194e0c96Deleted: sha256:2b8cbd0846c5aeaa7265323e7cf085779eaf244ccbdd982c4931aef9be0d2fafError response from daemon: conflict: unable to delete 49f7960eb7e4 (must be forced) - image is referenced in multiple repositoriesError response from daemon: conflict: unable to delete 49f7960eb7e4 (must be forced) - image is referenced in multiple repositories

Przy usuwaniu obrazów może pojawić się błąd:

Error response from daemon: conflict: unable to delete 49f7960eb7e4 (must be forced) - image is referenced in multiple repositoriesError response from daemon: conflict: unable to delete 49f7960eb7e4 (must be forced) - image is referenced in multiple repositories
bDUfsbFp

Mówi on nam o tym, że obrazy są ze sobą powiązane. Widać to w tym poleceniu:

user@piotrskoska1:~$ docker image lsREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEcentos              7                   49f7960eb7e4        4 weeks ago         200MBcentos              latest              49f7960eb7e4        4 weeks ago         200MB

Jak możemy zobaczyć ID naszego IMAGE w obu przypadkach jest takie same. By usunąć takie obrazy musimy skorzystać z przełącznika -f o czym mówi nam nasz output error.

user@piotrskoska1:~$ docker image rm -f $(docker image ls -q)Untagged: centos:7Untagged: centos:latestUntagged: centos@sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322Deleted: sha256:49f7960eb7e4cb46f1a02c1f8174c6fac07ebf1eb6d8deffbcb5c695f1c9edd5Deleted: sha256:bcc97fbfc9e1a709f0eb78c1da59caeb65f43dc32cd5deeb12b8c1784e5b8237Error: No such image: 49f7960eb7e4
bDUfsbFq

Mamy wyczyszczone nasze środowisko docker. Stwórzmy kontenery z bazą MySQL, WordPress, phpmyadmin. Skorzystajmy też z opcji przełącznikowej volume. Co da nam ta opcja za chwilę, teraz zbudujmy nasze środowisko. Wykorzystamy do tego narzędzie docker-compose które, pozwoli nam łatwiej "rozmieścić" nasze kontenery :)

Deploy

Opiszę tu deploy kontenerów z wykorzystaniem docker-compose. Wszystkie nowe opcje które, wykorzystam w docker-compose a jeszcze ich nie omawiałem, opisze jak uzyskać je także po przez polecenia docker. Zacznijmy jednak od szybkiej instalacji naszego narzędzia docker-compose. Wykorzystajmy do tego poniższe polecenie:

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
bDUfsbFr

Po pobraniu nadajemy odpowiednie uprawnienia:

sudo chmod +x /usr/local/bin/docker-compose

Weryfikujemy wersje naszego docker-compose:

docker-compose --version
bDUfsbFs

Mamy już narzędzie teraz przejdźmy do naszego warsztatu. Utwórz w dowolnej lokalizacji plik YAML stack.yml (nazwa może być dowolna). YAML to uniwersalny język formalny przeznaczony do reprezentowania różnych danych w ustrukturalizowany sposób. Poszczególne elementy struktury danych są oddzielane znakami nowej linii, a ich hierarchia ustalana jest na podstawie wcięcia linii. Język wprowadza trzy podstawowe struktury danych, które mogą być wkomponowane w dokument: listy, słowniki i skalary. Obsługuje również referencje, które eliminują konieczność redundancji danych. Wszystkie te cechy sprawiają, że dokumenty napisane w YAML-u są bardzo zwięzłe, czytelne dla człowieka, dają się też łatwo przetwarzać prostym narzędziom, takim jak grep, awk czy sed oraz przy pomocy języków skryptowych.

Jednak jak będzie wyglądać nasza składnia rozumiana przez docker-compose: zacznijmy od słowa version i services. "Version" zależne jest od wersji naszego docker

user@piotrskoska1:~$ docker versionClient: Version:      18.05.0-ce API version:  1.37 Go version:   go1.9.5 Git commit:   f150324 Built:        Wed May  9 22:16:25 2018 OS/Arch:      linux/amd64 Experimental: false Orchestrator: swarm

Server:  Engine: Version: 18.05.0-ce API version: 1.37 (minimum version 1.12) Go version: go1.9.5 Git commit: f150324 Built: Wed May 9 22:14:32 2018 OS/Arch: linux/amd64 Experimental: false/code

Własne wyniki porównajcie z tabelą na tej stronie docker-compose. Wersje pliku yaml określają minimalna wersję docker jaką należy posiadać by z konkretnej wersji yaml file skorzystać.

Ważne jest też by w plikach yaml zdecydować się na na jednego rodzaju wcięcia. Wybieramy spacje lub tabulatory. Nie jest dozwolone używanie ich w całym pliku na przemiennie, gdyż może to powodować złą interpretację naszego pliku.

stack.yml

version: '3.1'

services:/code

Niestety w edytorze dobrych programów na dzień pisania wpisu blogowego nie znalazłem opcji wstawiania block code jako yaml. Dlatego wykorzystam bash, - jednak by łatwiej było odróżnić komendy shellowe od pliku yaml. Code block związany z yaml będę poprzedzał nazwa pliku .yaml.

Zastanówmy się co potrzebujemy w naszym testowym środowisku. Na pewno naszą bazę danych - czyli kontener z mysql. Na tym moglibyśmy zakończyć. Ponieważ do przetestowania bazy danych więcej kontenerów potrzebować nie będziemy. Jednak by omówić trochę więcej opcji i trochę urozmaicić ten wpis ja dorzucę jeszcze do naszego środowiska kontener z WordPress, phpMyAdmin, adminer i ubuntu. Na ostatnim kontenerze z Ubuntu zainstalujemy nasze narzędzie do testowania bazy danych.

Zdefiniujmy nasze serwisy w stack.yml

version: '3.1'

services:

db:

adminer:

wordpress: phpmyadmin:/code

Wykorzystajmy to co już wiemy na temat naszych obrazów które, pomogą nam zbudować nasze kontenery. Powróćmy pamięcią do poprzedniego wpisu docker part one. Przypomnijmy sobie co jest potrzebne w naszych kontenerach. W kontenerze z mysql potrzebujemy expose portu 3306 oraz hasła dla użytkownika root do bazy danych. Kontener z wordpress potrzebuje portu 80 udostępnionego na zewnątrz. Potrzebuje też hasła takiego samego jak w kontenerze z bazą danych. Kontener z ubuntu to nasz kontener na którym będziemy uruchamiać nasze narzędzie do testów bazy danych. Ostatnie dwa kontenery to graficzny menadżer bo naszej bazy danych. Wykorzystamy go później przy testach.

Podejrzyjmy nasz plik stack.yml

version: '3.1'

services:

db:  image: mysql:5.7.22 containername: mysqldb restart: always ports: - 3306:3306 environment: MYSQLROOTPASSWORD: rutek volumes: - /home/user/database:/var/lib/mysql

adminer:  image: adminer containername: adminer restart: always ports: - 8080:8080

wordpress:  image: wordpress containername: wordpress restart: always ports: - 80:80 environment: WORDPRESSDBPASSWORD: rutek links: - "db:mysql"

phpmyadmin:  image: phpmyadmin/phpmyadmin containername: phpmyadmin restart: always ports: - 8082:80 links: - "db:mysqldb"

ubuntu:  build: context: . dockerfile: Dockerfile containername: testenvubuntu ports: - "3333:22"/code

Patrząc na nasz plik od góry odpowiednie wcięcia oznaczają nasze serwisy czyli kontenery

  • db
  • adminer
  • wordpress
  • phpmyadmin
  • ubuntu

Wcięcie potomne nazw tych serwisów to opcje tych kontenerów. Pole image w każdym serwisie oznacza obraz na podstawie którego, będzie budowany nasz kontener. Odpowiednio dla naszej bazy danych jest to obraz mysql z tagiem 5.7.22. Adminer wykorzystuje obraz o takiej samej nazwie jak wordpress, phpmyadmin korzysta z publicznego repo o nazwie phpmyadmin/phpmyadmin. Kontener z ubuntu jest konstruowany na podstawie pliku Dockerfile. O plikach Dockerfile porozmawiamy nieco później.

Kolejny element to nazwa kontenera. Odpowiednikiem jest polecenie docker run z parametrem --name dobrze nam znany z poprzedniego wpisu. Zmienna ta nie jest zmienną niezbędną. Pozwala nam jedynie uzyskać nie losową nazwę naszego kontenera.

Losowe nazwy bez opcji containername
Losowe nazwy bez opcji containername

Opcja restart: always to odpowiednik polecenia:

docker run -dit --restart always ubuntu /bin/bash

Daje nam pewną właściwość dla naszego kontenera która, będzie go uruchamiać zawsze gdy jego status będzie inny niż UP.

Ports to opcja udostępnienia portu na zewnątrz kontenera - zasada taka sama jak w poleceniu docker run z -p : ale to już znamy.

Environment to nasze zmienne dostępne w kontenerze. Tu udostępniamy hasło do naszej bazy danych.

Opcja links jest już nam dobrze znana i łączy nasz kontener wordpress i phpmyadmin z mysql

Nowości jest opcja volumes. Daje nam to możliwość "mapowania" dowolnego miejsca na naszym lokalnym komputerze, dzięki czemu będzie on widoczny dla kontenera i będzie on tam zapisywał swoje dane. Odpowiednikiem polecenia docker jest:

docker run -it --name vol-test -v $PWD:/data debian /bin/bash

Najwięcej nowości jest w serwisie ubuntu. Opcja build daje możliwość skorzystania z pliku Dockerfile. Plik taki pozwala budować własne obrazy, które potem można wykorzystać do budowy kontenera. Zobaczmy zatem jak będzie wyglądał nasz Dockerfile

Dockerfile

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:screencast' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshdconfig

RUN sed 's@session\srequired\spamloginuid.so@session optional pamloginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22 CMD "/usr/sbin/sshd", "-D"/code

Oczywiście wymaga to komentarza z mojej strony by nie było to swoistym kopiuj wklej. Patrząc od góry mamy opcje FROM która, powinna zawsze znajdować się w pierwszej linii naszego pliku Dockerfile. Wskazuje nam obraz lub źródło z którego, będzie budowany nas obraz (może to też być plik .tar).

Opcja RUN jak już możecie zauważyć to polecenia które zostaną wywołane w celu dodatkowej konfiguracji naszego kontenera. Możemy dzięki temu doinstalować dodatkowe biblioteki takie jak serwer openssh. Albo po prostu stworzyć katalog lub edytować plik. Ważne jest to że, opcja RUN nie przewiduje interakcji. Więc wszystkie komendy muszą mieć charakter automatyczny.

Opcja ENV pozwala na zdefiniować własną zmienną.

EXPOSE to tu definiujemy, że nasz port w tym przypadku 22 będzie dostępny i możliwy do mapowania po za nasz kontener.

Opcja CMD w tym przypadku jest wartością która to definiuje proces jaki będzie uruchamiany w kontenerze. Dopóki ten proces będzie działał, będzie też istniał nasz kontener.

Każde poszczególne polecenie to osobna warstwa o której, wspominałem w poprzednim wpisie. Każda warstwa to osobny kontener który, pod koniec jest scalany w konkretny obraz z którego, budowany jest nasz wyjściowy kontener.

Czas uruchomić całość.

Skorzystajmy z polecenia:

docker-compose -f stack.yml up -d

Docker-compose za nas pobierze odpowiednio obrazy dla mysql, pypmyadmin, adminer, wordpress.

user@piotrskoska1:~/yaml_file$ docker-compose -f stack.yml up -dPulling db (mysql:5.7.22)...5.7.22: Pulling from library/mysql683abbb4ea60: Pull complete0550d17aeefa: Pull complete7e26605ddd77: Pull complete9882737bd15f: Pull complete999c06ab75f6: Pull completec71d695f9937: Pull completec38f847c1491: Pull complete74f9c61f40bf: Pull complete30b252a90a12: Pull complete9f92ebb7da55: Pull complete90303981d276: Pull completeDigest: sha256:1203dfba2600f140b74e375a354b1b801fa1b32d6f80fdee5f155d1e9f38c841Status: Downloaded newer image for mysql:5.7.22

Oczywiście dla innych obrazów output może być podobny.

Dla naszego obrazu budowanego z pliku dockerfile output będzie inny bardziej obszerny. Sporo informacji. Możemy je skrócić przez dodanie opcji > /dev/null do naszych poleceń instalacyjnych.

Nasz dockerfile będzie wyglądał teraz tak:

FROM ubuntu:16.04

RUN apt-get update > /dev/null && apt-get install -y openssh-server > /dev/null RUN mkdir /var/run/sshd RUN echo 'root:screencast' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshdconfig

RUN sed 's@session\srequired\spamloginuid.so@session optional pamloginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22 CMD "/usr/sbin/sshd", "-D"/code

Jeżeli uruchomiłeś już docker-compose obrazy i kontenery możesz usunąć przy pomocy polecenia:

docker container stop $(docker ps -qa); docker container rm $(docker ps -qa); docker image rm -f $(docker image ls -q)

Ostatnia informacja z polecenia docker-compose powinno zwrócić nam informacje na temat naszych kontenerów.

Informacja o tym że wszystko jest ok. Zielone napisy done.
Informacja o tym że wszystko jest ok. Zielone napisy done.

Możemy też sprawdzić status naszych kontenerów:

Nasze kontenery w docker ps
Nasze kontenery w docker ps

Jak widzimy nasze kontenery działają.

Sysbench

Do przetestowania naszej bazy danych użyjemy narzędzia zwanego sysbench. Wejdźmy do naszego kontenera z Ubuntu. I zainstalujmy nasz pakiet.

ssh -p 3333 root@localhost

Dla systemu ubuntu / debian instalacja sysbench jest następująca:

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bashsudo apt -y install sysbench

Jeżeli próbujecie zrobić to co opisuje nie szablonowo dla innych dystrybucji opis znajdziecie tutaj.

Sprawdźmy też czy nasze kontenery działają. Ja użyłem odpowiednio port forwarding by uzyskać dostęp do aplikacji świadczonych przez kontenery.

Kontener z aplikacją Adminer
Kontener z aplikacją Adminer
Kontener z aplikacją WordPress
Kontener z aplikacją WordPress
Kontener z aplikacją phpMyAdmin
Kontener z aplikacją phpMyAdmin

Powinieneś bez problemu zalogować się na dane dostepowe które, podałeś podczas budowy kontenerów. Tak więc zaczynamy. Przyjrzyjmy się składni sysbench.

root@cd980a8f8023:~# sysbench --helpUsage:  sysbench [options]... [testname] [command]

Commands implemented by most tests: prepare run cleanup help

General options: --threads=N number of threads to use 1 --events=N limit for total number of events 0 --time=N limit for total execution time in seconds 10 --forced-shutdown=STRING number of seconds to wait after the --time limit before forcing shutdown, or 'off' to disable off --thread-stack-size=SIZE size of stack per thread 64K --rate=N average transactions rate. 0 for unlimited rate 0 --report-interval=N periodically report intermediate statistics with a specified interval in seconds. 0 disables intermediate reports 0 --report-checkpoints=LIST,... dump full statistics and reset all counters at specified points in time. The argument is a list of comma-separated values representing the amount of time in seconds elapsed from start of test when report checkpoint(s) must be performed. Report checkpoints are off by default. --debug=on|off print more debugging info off --validate=on|off perform validation checks where possible off --help=on|off print help and exit off --version=on|off print version and exit off --config-file=FILENAME File containing command line options --tx-rate=N deprecated alias for --rate 0 --max-requests=N deprecated alias for --events 0 --max-time=N deprecated alias for --time 0 --num-threads=N deprecated alias for --threads 1

Pseudo-Random Numbers Generator options: --rand-type=STRING random numbers distribution {uniform,gaussian,special,pareto} special --rand-spec-iter=N number of iterations used for numbers generation 12 --rand-spec-pct=N percentage of values to be treated as 'special' (for special distribution) 1 --rand-spec-res=N percentage of 'special' values to use (for special distribution) 75 --rand-seed=N seed for random number generator. When 0, the current time is used as a RNG seed. 0 --rand-pareto-h=N parameter h for pareto distribution 0.2

Log options: --verbosity=N verbosity level {5 - debug, 0 - only critical messages} 3

--percentile=N  percentile to calculate in latency statistics (1-100). Use the special value of 0 to disable percentile calculations 95 --histogram=on|off print latency histogram in report off

General database options:

--db-driver=STRING  specifies database driver to use ('help' to get list of available drivers) mysql --db-ps-mode=STRING prepared statements usage mode {auto, disable} auto --db-debug=on|off print database-specific debug information off

Compiled-in database drivers: mysql - MySQL driver pgsql - PostgreSQL driver

mysql options: --mysql-host=LIST,... MySQL server host localhost --mysql-port=LIST,... MySQL server port 3306 --mysql-socket=LIST,... MySQL socket --mysql-user=STRING MySQL user sbtest --mysql-password=STRING MySQL password --mysql-db=STRING MySQL database name sbtest --mysql-ssl=on|off use SSL connections, if available in the client library off --mysql-ssl-cipher=STRING use specific cipher for SSL connections --mysql-compression=on|off use compression, if available in the client library off --mysql-debug=on|off trace all client library calls off --mysql-ignore-errors=LIST,... list of errors to ignore, or "all" 1213,1020,1205 --mysql-dry-run=on|off Dry run, pretend that all MySQL client API calls are successful without executing them off

pgsql options: --pgsql-host=STRING PostgreSQL server host localhost --pgsql-port=N PostgreSQL server port 5432 --pgsql-user=STRING PostgreSQL user sbtest --pgsql-password=STRING PostgreSQL password --pgsql-db=STRING PostgreSQL database name sbtest

Compiled-in tests: fileio - File I/O test cpu - CPU performance test memory - Memory functions speed test threads - Threads subsystem performance test mutex - Mutex performance test

See 'sysbench help' for a list of options for each test./code

Jak widzimy na dole mamy rodzaj testów do uruchomienia. Jednak my nie będziemy się skupiać na fileio, cpu czy memory. Nas interesują testy bazy danych. Zatem jak je odnaleźć. Najprostszą metodą jest wydanie polecenia:

dpkg --listfiles sysbench

Który zwróci nam taki output:

root@cd980a8f8023:~# dpkg --listfiles sysbench/./usr/usr/share/usr/share/doc/usr/share/doc/sysbench/usr/share/doc/sysbench/ChangeLog.gz/usr/share/doc/sysbench/manual.html/usr/share/doc/sysbench/changelog.Debian.gz/usr/share/doc/sysbench/README.md.gz/usr/share/doc/sysbench/COPYING.gz/usr/share/doc/sysbench/copyright/usr/share/sysbench/usr/share/sysbench/oltp_read_write.lua/usr/share/sysbench/oltp_delete.lua/usr/share/sysbench/oltp_common.lua/usr/share/sysbench/oltp_insert.lua/usr/share/sysbench/oltp_update_non_index.lua/usr/share/sysbench/oltp_point_select.lua/usr/share/sysbench/tests/usr/share/sysbench/tests/include/usr/share/sysbench/tests/include/mysql_common.sh/usr/share/sysbench/tests/include/script_select_random_legacy_common.sh/usr/share/sysbench/tests/include/oltp_legacy/usr/share/sysbench/tests/include/oltp_legacy/select.lua/usr/share/sysbench/tests/include/oltp_legacy/update_non_index.lua/usr/share/sysbench/tests/include/oltp_legacy/delete.lua/usr/share/sysbench/tests/include/oltp_legacy/oltp_simple.lua/usr/share/sysbench/tests/include/oltp_legacy/select_random_points.lua/usr/share/sysbench/tests/include/oltp_legacy/common.lua/usr/share/sysbench/tests/include/oltp_legacy/update_index.lua/usr/share/sysbench/tests/include/oltp_legacy/insert.lua/usr/share/sysbench/tests/include/oltp_legacy/select_random_ranges.lua/usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua/usr/share/sysbench/tests/include/oltp_legacy/bulk_insert.lua/usr/share/sysbench/tests/include/script_oltp_legacy_common.sh/usr/share/sysbench/tests/include/pgsql_common.sh/usr/share/sysbench/tests/include/config.sh/usr/share/sysbench/tests/include/inspect.lua/usr/share/sysbench/tests/include/script_select_random_common.sh/usr/share/sysbench/tests/include/script_oltp_common.sh/usr/share/sysbench/tests/include/api_sql_common.sh/usr/share/sysbench/tests/include/script_bulk_insert_common.sh/usr/share/sysbench/tests/include/drv_common.sh/usr/share/sysbench/tests/t/usr/share/sysbench/tests/t/api_rand.t/usr/share/sysbench/tests/t/cmd_prepare.t/usr/share/sysbench/tests/t/test_threads.t/usr/share/sysbench/tests/t/script_oltp_delete_mysql.t/usr/share/sysbench/tests/t/api_sql_mysql.t/usr/share/sysbench/tests/t/script_select_random_pgsql.t/usr/share/sysbench/tests/t/api_legacy_rand.t/usr/share/sysbench/tests/t/opt_version.t/usr/share/sysbench/tests/t/test_cpu.t/usr/share/sysbench/tests/t/api_basic.t/usr/share/sysbench/tests/t/cmd_run.t/usr/share/sysbench/tests/t/script_oltp_delete_pgsql.t/usr/share/sysbench/tests/t/script_oltp_insert_mysql.t/usr/share/sysbench/tests/t/commands.t/usr/share/sysbench/tests/t/script_select_random_mysql.t/usr/share/sysbench/tests/t/drv_pgsql.t/usr/share/sysbench/tests/t/script_oltp_point_select_mysql.t/usr/share/sysbench/tests/t/help_drv_pgsql.t/usr/share/sysbench/tests/t/script_bulk_insert_pgsql.t/usr/share/sysbench/tests/t/tests.t/usr/share/sysbench/tests/t/test_fileio.t/usr/share/sysbench/tests/t/opt_help.t/usr/share/sysbench/tests/t/script_bulk_insert_mysql.t/usr/share/sysbench/tests/t/opt_report_checkpoints.t/usr/share/sysbench/tests/t/drv_mysql.t/usr/share/sysbench/tests/t/cmdline.t/usr/share/sysbench/tests/t/script_oltp_help.t/usr/share/sysbench/tests/t/opt_report_interval.t/usr/share/sysbench/tests/t/1st.t/usr/share/sysbench/tests/t/api_legacy_basic.t/usr/share/sysbench/tests/t/cmd_cleanup.t/usr/share/sysbench/tests/t/cmd_help.t/usr/share/sysbench/tests/t/api_legacy_sql.t/usr/share/sysbench/tests/t/script_oltp_point_select_pgsql.t/usr/share/sysbench/tests/t/script_oltp_read_write_mysql.t/usr/share/sysbench/tests/t/script_oltp_read_write_pgsql.t/usr/share/sysbench/tests/t/opt_histogram.t/usr/share/sysbench/tests/t/api_reports.t/usr/share/sysbench/tests/t/script_oltp_insert_pgsql.t/usr/share/sysbench/tests/t/api_sql_pgsql.t/usr/share/sysbench/tests/t/drivers.t/usr/share/sysbench/tests/t/test_memory.t/usr/share/sysbench/tests/t/test_mutex.t/usr/share/sysbench/tests/t/help_drv_mysql.t/usr/share/sysbench/tests/t/api_histogram.t/usr/share/sysbench/tests/test_run.sh/usr/share/sysbench/select_random_points.lua/usr/share/sysbench/oltp_update_index.lua/usr/share/sysbench/oltp_read_only.lua/usr/share/sysbench/oltp_write_only.lua/usr/share/sysbench/select_random_ranges.lua/usr/share/sysbench/bulk_insert.lua/usr/bin/usr/bin/sysbench

Nas interesują wszystkie pliki kończące się na .lua w katalogu /usr/share/sysbench/.lua. Lista testów jest następująca:

/usr/share/sysbench/oltp_read_write.lua/usr/share/sysbench/oltp_delete.lua/usr/share/sysbench/oltp_common.lua/usr/share/sysbench/oltp_insert.lua/usr/share/sysbench/oltp_update_non_index.lua/usr/share/sysbench/oltp_point_select.lua/usr/share/sysbench/select_random_points.lua/usr/share/sysbench/oltp_update_index.lua/usr/share/sysbench/oltp_read_only.lua/usr/share/sysbench/oltp_write_only.lua/usr/share/sysbench/select_random_ranges.lua/usr/share/sysbench/bulk_insert.lua

Jeżeli macie problem z wyciągnięciem danych tylko nas interesujących to zapraszam do serii bash(ującego) w zbożu:

Przed uruchomieniem testu musimy naszą bazę danych przygotować. Przygotujmy bazę danych dla naszego testu, na przykład oltpinsert.lua

Doinstalujmy klienta mysql w naszym ubuntu by przetestować naszą baze danych.

apt-get install mysql-client

Wykonajmy połączenie do naszego kontenera z bazą danych mysql, przykładowe polecenie będzie wyglądało następująco:

mysql -h  -u root -p

Adres naszego kontenera możemy uzyskać z polecenia:

docker container inspect 

Uzyskamy bardzo dużo informacji na temat naszego kontenera w tym nasz adres IP. Bardziej konkretny output zwróci nam polecenie:

docker container inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql_db

Mamy nasz adres IP. Wróćmy do naszego kontenera z ubuntu.

root@cd980a8f8023:~# mysql -h 172.18.0.3 -u root -pEnter password:Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 8Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>/code

Mamy konsolę cli mysql. Sysbench potrzebuję bazę danych na której, bedizen pracował. Taką bazę danych możemy utworzyć poleceniem:

CREATE DATABASE sysbench_my_own_test CHARACTER SET utf8 COLLATE utf8_general_ci;

Wykorzystajmy do sprawdzenia tego polecenia naszą aplikację z phpMyAdmin.

277715

Jak widać wszystko działa.

277717

Uprawnień nie musimy dodawać gdyż mamy root na bazie danych.

Czas teraz przygotować nowo utworzoną bazę danych do zabawy z sysbench. Zrobimy to już z poziomu sysbench.

sysbench /usr/share/sysbench/oltp_insert.lua  --threads=1 --mysql-host= --mysql-user=root --mysql-password=rutek --mysql-port=3306 --mysql-db=sysbench_my_own_test  --tables=4 --table-size=1000000 prepare

Pierwszy parametr polecenia to jest nasz test /usr/share/sysbench/oltpinsert.lua który, zostanie uruchomiony. Przeznaczamy na te przygotowania jeden wątek. Podajemy parametry logowania czyli host, user, pass oraz nazwa naszej bazy danych. Ostatnie to ilość utworzonych tabel w bazie danych i liczba naszych rekordów w każdej tabeli. Słowo kluczowe prepare przygotuje nam bazę danych. Enter.

sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Creating table 'sbtest1'... Inserting 1000000 records into 'sbtest1' Creating a secondary index on 'sbtest1'... Creating table 'sbtest2'... Inserting 1000000 records into 'sbtest2' Creating a secondary index on 'sbtest2'... Creating table 'sbtest3'... Inserting 1000000 records into 'sbtest3' Creating a secondary index on 'sbtest3'... Creating table 'sbtest4'... Inserting 1000000 records into 'sbtest4' Creating a secondary index on 'sbtest4'.../code

Przygotowania rozpoczęte. Postęp można śledzić w naszej aplikacji.

277725

Teraz czas na nasz pierwszy test. Opcje jakimi dysponujemy zobaczymy używając sysbench help. W naszym przypadku mamy:

root@cd980a8f8023:~# sysbench /usr/share/sysbench/oltp_insert.lua helpsysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

oltpinsert.lua options: --autoinc=on|off Use AUTOINCREMENT column as Primary Key (for MySQL), or its alternatives in other DBMS. When disabled, use client-generated IDs on --createsecondary=on|off Create a secondary index in addition to the PRIMARY KEY on --deleteinserts=N Number of DELETE/INSERT combinations per transaction 1 --distinctranges=N Number of SELECT DISTINCT queries per transaction 1 --indexupdates=N Number of UPDATE index queries per transaction 1 --mysqlstorageengine=STRING Storage engine, if MySQL is used innodb --nonindexupdates=N Number of UPDATE non-index queries per transaction 1 --orderranges=N Number of SELECT ORDER BY queries per transaction 1 --pgsqlvariant=STRING Use this PostgreSQL variant when running with the PostgreSQL driver. The only currently supported variant is 'redshift'. When enabled, createsecondary is automatically disabled, and deleteinserts is set to 0 --pointselects=N Number of point SELECT queries per transaction 10 --rangeselects=on|off Enable/disable all range SELECT queries on --rangesize=N Range size for range SELECT queries 100 --secondary=on|off Use a secondary index in place of the PRIMARY KEY off --simpleranges=N Number of simple range SELECT queries per transaction 1 --skiptrx=on|off Don't start explicit transactions and execute all queries in the AUTOCOMMIT mode off --sumranges=N Number of SELECT SUM() queries per transaction 1 --tablesize=N Number of rows per table 10000 --tables=N Number of tables 1/code

Zatem czasem by nauczyć się chodzić trzeba zacząć biegać:

root@cd980a8f8023:~# sysbench /usr/share/sysbench/oltp_insert.lua  --threads=1 --mysql-host=172.18.0.3 --mysql-user=root --mysql-password=rutek --mysql-port=3306 --mysql-db=sysbench_my_own_test --tables=4 --table-size=1000000 --histogram=on --time=60 --events=0 run

Output po 60 sekundach otrzymamy taki:

sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options: Number of threads: 1 Initializing random number generator from current time

Initializing worker threads...

Threads started!

Latency histogram (values are in milliseconds) value ------------- distribution ------------- count 0.608 | 2 0.619 | 8 0.630 | 31 0.642 | 114 0.654 | 336 0.665 | 766 0.677 | 1412 0.690 | 2271 0.702 | 3081 0.715 | 3366 0.728 | 3262 0.741 | 2847 0.755 | 2439 0.768 | 2005 0.782 | 1660 0.797 | 1352 0.811 | 1220 0.826 | 950 0.841 | 893 0.856 | 760 0.872 | 614 0.888 | 622 0.904 | 476 0.920 | 395 0.937 | 374 0.954 | 322 0.971 | 227 0.989 | 165 1.007 | 129 1.025 | 112 1.044 | 76 1.063 | 66 1.082 | 41 1.102 | 46 1.122 | 34 1.142 | 36 1.163 | 33 1.184 | 17 1.205 | 24 1.227 | 19 1.250 | 10 1.272 | 13 1.295 | 14 1.319 | 21 1.343 | 13 1.367 | 13 1.392 | 16 1.417 | 9 1.443 | 13 1.469 | 18 1.496 | 23 1.523 | 19 1.551 | 12 1.579 | 19 1.608 | 13 1.637 | 28 1.667 | 53 1.697 | 94 1.728 | 205 1.759 | 435 1.791 | 748 1.824 | 1068 1.857 | 1369 1.891 | 1435 1.925 | 1421 1.960 | 1251 1.996 | 1000 2.032 | 810 2.069 | 657 2.106 | 488 2.145 | 385 2.184 | 301 2.223 | 214 2.264 | 139 2.305 | 135 2.347 | 81 2.389 | 70 2.433 | 81 2.477 | 61 2.522 | 39 2.568 | 44 2.615 | 49 2.662 | 42 2.710 | 40 2.760 | 36 2.810 | 35 2.861 | 40 2.913 | 22 2.966 | 33 3.020 | 29 3.075 | 21 3.130 | 30 3.187 | 38 3.245 | 26 3.304 | 32 3.364 | 39 3.425 | 24 3.488 | 34 3.551 | 20 3.615 | 17 3.681 | 21 3.748 | 30 3.816 | 18 3.885 | 30 3.956 | 30 4.028 | 25 4.101 | 35 4.176 | 41 4.252 | 59 4.329 | 37 4.407 | 42 4.487 | 44 4.569 | 39 4.652 | 32 4.737 | 24 4.823 | 19 4.910 | 22 4.999 | 21 5.090 | 23 5.183 | 16 5.277 | 16 5.373 | 14 5.470 | 16 5.570 | 11 5.671 | 21 5.774 | 3 5.879 | 9 5.986 | 11 6.095 | 15 6.205 | 19 6.318 | 14 6.433 | 11 6.550 | 10 6.669 | 13 6.790 | 9 6.913 | 7 7.039 | 5 7.167 | 5 7.297 | 9 7.430 | 8 7.565 | 3 7.702 | 1 7.842 | 6 7.985 | 7 8.130 | 2 8.277 | 3 8.428 | 4 8.581 | 5 8.737 | 7 8.895 | 6 9.057 | 8 9.222 | 5 9.389 | 9 9.560 | 9 9.734 | 13 9.910 | 5 10.090 | 12 10.274 | 8 10.460 | 9 10.651 | 6 10.844 | 12 11.041 | 6 11.242 | 8 11.446 | 4 11.654 | 5 11.866 | 1 12.081 | 11 12.301 | 3 12.524 | 2 12.752 | 2 12.984 | 2 13.219 | 2 13.460 | 4 13.704 | 2 13.953 | 1 14.465 | 2 14.728 | 3 14.995 | 6 15.268 | 3 15.545 | 4 15.828 | 3 16.115 | 2 16.408 | 7 16.706 | 4 17.010 | 3 17.319 | 3 17.633 | 3 17.954 | 2 18.280 | 2 18.612 | 4 18.950 | 1 19.295 | 2 19.645 | 2 20.002 | 2 21.496 | 1 22.689 | 2 24.827 | 1 32.525 | 1 56.839 | 1 108.685 | 1 112.670 | 1 114.717 | 1 130.128 | 1 139.846 | 2 147.608 |  1

SQL statistics: queries performed: read: 0 write: 47146 other: 0 total: 47146 transactions: 47146 (785.43 per sec.) queries: 47146 (785.43 per sec.) ignored errors: 0 (0.00 per sec.) reconnects: 0 (0.00 per sec.)

General statistics: total time: 60.0236s total number of events:  47146

Latency (ms): min: 0.61 avg: 1.27 max: 148.58 95th percentile: 2.22 sum:  59831.08

Threads fairness: events (avg/stddev): 47146.0000/0.00 execution time (avg/stddev): 59.8311/0.00/code

Ciąg dalszy nastąpi

W tym wpisie to już wszystko. W kolejnym postaram się przyjrzeć innym testom z wachlarza sysbench oraz ich graficznej interpretacji. Jeżeli wpis przypadł Ci do gustu, podobał się i chcesz więcej zostaw obiektywny komentarz, udostępnij. Zapraszam ponownie.

bDUfsbGf