Docker

Allikas: Kuutõrvaja
                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Sissejuhatus

Dockeri töid lihusustav põhimõte seisneb selles, et kõik lib-id ja programmid ning utikad on ühes isoleeritud ja kergelt paidaldatavas konteineris koos. Konteinereid võib hankida võrgust dockeri enda lehelt või siis koostada ja genereerida neid ise. Docker teeb arenduse lihtsamaks, sest pole vaja mässata keerukate serverikonfide ja seal tekkivate konfliktidega, üritades panna sama tarkvara (nt php või ka mysqli või postgresi) mitut eri versiooni korraga tööle. Soovides dockeriga käivitada enda rakenduse jaoks kolm eri php versiooniga serverit tuleb lihtsalt tõmmata kolm eri php versiooni ja apache serverit sisaldavat konteineri img-d ning nad süsteemis käivitada. Käivitamisel saab öelda igale konteinerile isikliku tööpordi ja kausta, mis nad külge haagivad. Kaust võib seejuures asuda /home või /srv all, kus rakenduse kood asub. Aga koodi võib vajadusel ka kohe konteineri loomisel sinna sisse integreerida. Samamoodi on konteineriseeritavad kõikvõimalikud muud rakendused alates rubyst kuni pythoni ja nodejsini. Samu konteinereid saab kasutada ka teistes süsteemides näiteks läpakas, tööarvutis või kliendi juures asuvas serveris.

Paigaldus ubuntus/debianis

Dockeri paigaldamiseks ubuntu/debiani serveris installime kõigepealt vajalikud sõltuvused

apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common

Lisame apti võtme

# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Apti repositooriumi

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

Uuendame uute allikate vastu

# apt-get update

Ja paneme dockeri peale

# apt-get install docker-ce

Konteinerite kasutamine

Dockeri üheks oluliseks tugevuseks on see, et nende poolt on pakkuda juba tuhandeid eelkonfigureeritud konteinerite tõmmiseid, millede abil saab hakata kohe erinevaid rakendusi ehitama. Laadime näiteks alustamiseks alla konteineris kasutamiseks mõeldud kergekaalulise ja ilma lisatarkvarata ubuntu konteineri img

# docker pull ubuntu

Peale tõmbamise lõpetamist paigaldatakse see images alla, näha saame seda järgneva käsuga

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              113a43faa138        2 weeks ago         81.2MB

Saame näiteks selle sees oleva bashi käivitada ja käsureal ringi vaadata või sinna täiendavaid pakette paigaldada. Vaikimisi on tegemist väga minimaalse keskkonnaga

# docker run -t -i ubuntu:latest /bin/bash

Tõmmata saab ka juba eelkonfigureeritud tarkvaraga dockeri konteinereid. Näiteks tõmbame mysql serveri ja paneme selle käima

docker pull mysql
docker run -d --name=mysql1 -e MYSQL_ROOT_PASSWORD=’mypassword’ -v /storage/mysql1/mysql-datadir:/var/lib/mysql mysql

Tähele tasub panna, et vahel võib võtta teenustel konteineri sees käimaminek aega, kuni tekitavad vajalikud failid ja andmebaasid jne. Lisaks saab tõmmata ka kindlaid mysql versioone

docker pull mysql:5.6

Sama on PHPga, näiteks võime sama rakenduse kausta /srv/docker/php-test1 peale käivitada kaks eri php versiooniga apache serverit

Käivitame esimese php7-mega

# docker run -d --name=php-test1 --publish 8080:80/tcp --volume /srv/docker/php-test1:/app webdevops/php-apache:ubuntu-18.04

Ja teise php 5.6

# docker run -d --name=php-test5 --publish 8081:80/tcp --volume /srv/docker/php-test1:/app webdevops/php-apache:debian-8

Mõlemad serverid on nähtavad aadressilt

http://localhost:8080/

ja

http://localhost:8081/

Töötamas näeme neid järgnevalt

# docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                                     NAMES
ab8b5eec1efc        webdevops/php-apache:debian-8       "/entrypoint supervi…"   13 seconds ago      Up 11 seconds       443/tcp, 9000/tcp, 0.0.0.0:8081->80/tcp   php-test52
bc16f9feb4e        webdevops/php-apache:ubuntu-18.04   "/entrypoint supervi…"   About an hour ago   Up About an hour    443/tcp, 9000/tcp, 0.0.0.0:8080->80/tcp   php-test2

Seisata saame käsuga

# docker stop ab8b5eec1efc

Ja uuesti käivitada

# docker start ab8b5eec1efc

Konteineri logisid näeb konteineri ID alusel, nt

# docker logs 3b8a054c778d

Logid esitatakse lakooniliselt näidates vaid olulisemaid vigu, nt stiilis

Warning: mysqli::__construct(): (HY000/1045): Access denied for user 'wordpress'@'172.18.0.3' (using password: YES) in Standard input code on line 22
MySQL Connection Error: (1045) Access denied for user 'wordpress'@'172.18.0.3' (using password: YES)

Olemas on ka palju keerukamaid dockeri konteinereid. Näiteks konfigureeritud ja valmis LAMPi saab https://github.com/fauria/docker-lamp.

Mysqli, nt kindla mariadb versiooni 10.3 paigaldamiseks

# docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:10.3 --publish 3306:3307/tcp -v /srv/mariadb103:/var/lib/mysql

Kõikide dockeri konteinerite eemaldamiseks

# docker rm $(docker ps -a -q)

Kõikide dockeri img-de eemaldamiseks

# docker rmi $(docker images -a -q)

Omaenda konteineri loomine

Konteineri loomine toimub failis Dockerfile olevate käsurea käskude alusel. Näiteks tekitame lihtsa konfi, mis tekitab meile eelmises lõigus allatõmmatud ubuntu image alusel apache veebiserveri, kus serveerib etteantud index.html faili

FROM ubuntu:latest
RUN apt-get update && apt-get install -y apache2
RUN mkdir -p /srv && rm -fr /var/www/html && ln -s /srv /var/www/html
EXPOSE 80
ADD index.html /srv/
WORKDIR /srv
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Käsud lahtiseletatult:

  • FROM seadistab ära mis imaget me aluseks kasutame
  • RUN võimaldab käivitada enda järele kirjutatud käske
  • EXPOSE teeb pordi 80 meile nähtavaks
  • WORKDIR määrab kasutaja kataloogi
  • ADD kopeerib varemalt tekitatud index.html faili /srv kausta
  • ENTRYPOINT seadistab ära teenuse, mis konteineris tööle läheb

Ehitame loodud konfi alusel konteineri valmis, selleks anname samas kaustas kus dockerfail järgneva käsu

docker build -t test:test .

Kui protsess lõppes peaksime seda ka images alt nägema

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                test                364cac645fcc        2 minutes ago       223MB
ubuntu              latest              113a43faa138        2 weeks ago         81.2MB

Paneme konteineri tööle

# docker run -d -P test:test

Töötavaid konteinereid näeme järgnevalt

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
5b9850b98a29        test:test           "/usr/sbin/apache2ct…"   12 seconds ago      Up 11 seconds       0.0.0.0:32770->80/tcp   sleepy_carson

Nagu näha on localhosti port 32770 suunatud konteineris 80 pordile.

Konteinerite loomine docker-compose abil

Compose on töövahend, millega saab defineerida ja luua multi-conteinerilisi dockeri rakendusi. Paigaldamiseks

# apt-get install docker-compose

Selleks, et luua wordpressi rakendus koos mysql serveriga ko tekitame faili docker-compose.yml järgneva sisuga

version: '3.3'

services:
   wordpress:
     depends_on:
       - db
     image: wordpress
     ports:
       - "8000:80"
     restart: unless-stopped
     environment:
       WORDPRESS_DB_HOST: db
       MYSQL_PORT_3306_TCP: 3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

   db:
     image: mariadb
     ports:
     - "3306:3306"
     restart: unless-stopped
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

Loome selle alusel dockeri ja paneme selle tööle

# docker-compose up -d

Veendumine, et hakkas tööle

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
20eaa3976bc9        mysql:latest        "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        3306/tcp

Pöördudes nüüd avaliku aadressi pordile 8000 peaksime nägema wordpressi paigaldust

Soovides mõlemad masinad sulgeda

# docker-compose stop

Käsuga docker stats näeb jooksvalt konteinerite cpu, mälu, IO ja võrgukasutust

# docker stats
CONTAINER ID        NAME                  CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
5c47855895c3        server3_wordpress_1   0.00%               89.96MiB / 7.79GiB   1.13%               3.58MB / 4.89MB     336kB / 1.59MB      11
034eb5845072        server3_db_1          0.04%               97.74MiB / 7.79GiB   1.23%               1.34MB / 3.14MB     10.7MB / 85.7MB     32

Dockeri kettaajaotus

TODO

Healtcheck

Healtcheck sektsioon teatab dockerile, kuidas testida seda kas seal olev rakendus on ikkagi töökorras. Docker compose failis võib lisada konteineri sektsiooni lõppu näiteks

healthcheck:
  test: curl -sS http://127.0.0.1 || exit 1
  interval: 5s
  timeout: 10s
  retries: 3

Seda mis staatuses konteineri tervis on näeb näiteks käsuga docker ps. Samuti saab curliga kontrollida ka tcp porte

curl -v telnet://127.0.0.1:22

Juhul kui curli binaar on konteinerist puudu saab selle järgnevat dockerfilega lisada

FROM httpd:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl && apt-get clean
EXPOSE 80
HEALTHCHECK --interval=15s --retries=5 --timeout=30s --start-period=30s CMD curl -I -f "http://localhost:80" || exit 1

Tegelikult pole muidugi vahet mis käsku kontrolliks käima lastakse. Postgresi andmebaasi toimimist saab kontrollida järgnevalt.

test: ["CMD-SHELL", "pg_isready -U <andmebaas>"]

Docer-compose versioonides 2.x saab kasutada healthcheky ka konteinerite startijärjestuses. Nt teha kindlaks, et mingi konteiner ei stardiks enne kui esimese healtcheck on õnnestunud. Alates versioonis 3.x on see aga eemaldatud ning kasutada tuleb dockerize wrapperit

   depends_on:
     postgres_db:
       condition: service_healthy

dockerize

Tegemist on wrapperiga, millega saab näiteks panna startiv konteiner ootama mingi tingimuse täitumist

dockerize -wait tcp://db:5432 -wait http://web:80 -wait file:///tmp/generated-file

Nginx logs to two different log files under /var/log/nginx by default. It would be nice have the nginx access and error log streamed to the console if your run this container interactively or if you docker logs nginx so you can see what’s happening.

This would generate /etc/nginx/nginx.conf from the template located at /etc/nginx/nginx.tmpl and send /var/log/nginx/access.log to STDOUT and /var/log/nginx/error.log to STDERR after running nginx, only after waiting for the web host to respond on tcp 8000:

ADD dockerize /usr/local/bin/dockerize
CMD dockerize -template /etc/nginx/nginx.tmpl:/etc/nginx/nginx.conf -stdout /var/log/nginx/access.log -stderr /var/log/nginx/error.log -wait tcp://web:8000 nginx
CMD dockerize -stdout /var/log/nginx/access.log -stderr /var/log/nginx/error.log nginx


https://github.com/jwilder/dockerize

Docker cluster ehk swarm

Loodava swarmi clustri arhidektuur oleks järgnev

Manager - 192.168.1.102
Node1   - 192.168.1.103
Node2   - 192.168.1.104
Node3   - 192.168.1.105

Paigaldame docker-machine käsu

base=https://github.com/docker/machine/releases/download/v0.14.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo install /tmp/docker-machine /usr/local/bin/docker-machine

Tekitame esimeses nodes swarmi clustri

# docker swarm init --advertise-addr 192.168.1.102
Swarm initialized: current node (vgbw9pkyuibwpkcjxk8cvhy0o) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-04ckwo5fpnej5gbygpcdyole7wp6fk5pl6sf3ljsblu2r65bow-9gj0xfacx628pmaqs9m3tznbe 192.168.1.102:2377 

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Lisame ülejäänud kaks node swarmi, selleks käivitame nendes ülal initi poolt antud käsu

# docker swarm join --token SWMTKN-1-04ckwo5fpnej5gbygpcdyole7wp6fk5pl6sf3ljsblu2r65bow-9gj0xfacx628pmaqs9m3tznbe 192.168.1.102:2377
This node joined a swarm as a worker.

Loodud clustri staatust näeme järgnevalt

# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
7e2nb4o59vvrq92588mdt0s8x     test                Ready               Active
gvy7dc4lv7gkjinfjrd45g5sg     test                Ready               Active
vgbw9pkyuibwpkcjxk8cvhy0o *   test                Ready               Active              Leader

Nüüd saame näiteks luua sinna konteineri viimasest httpd nimelisest konteinerist ja teha nad avalikuks pordilt 80

# docker service create --name webserver -p 80:80 httpd

Tekitame kaks httpd konteinerit

# docker service scale webserver=2

Vaatame, et mis meil välja tuli

# docker service ps webserver
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
c3vsktx9vm4j        webserver.1         httpd:latest        test1                Running             Running 3 minutes ago
qgwpdt5w481b        webserver.2         httpd:latest        test2                Running             Running 50 seconds ago

https://technologyconversations.com/2016/08/01/integrating-proxy-with-docker-swarm-tour-around-docker-1-12-series/

Terve hulk erinevaid haldusliideseid https://www.smartspate.com/overview-gui-interfaces-managing-docker-containers/

Dockeri võrgud

docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

Kuidas see kõik töötab http://blog.nigelpoulton.com/demystifying-docker-overlay-networking/

https://github.com/jwilder/dockerize konteinerite jooksev täiendamine