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

Paigaldus Centosis

Paigaldame repo

# sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo 

Paigaldame dockeri ja vajalikud lisavahendid

yum install docker-ce docker-ce-cli containerd.io 

Paneme dockeri tööle ja lubame tal restardi järel käivituda

# systemctl start docker
# systemctl enable docker

Selleks, et docker saadaks kogu enda logi journald peale

cat << 'EOF' >/etc/docker/daemon.json
{
    "log-driver": "journald",
}
EOF

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)

Selleks, et logida töötavasse konteinerisse

# docker exec -i -t 234545klksd1 bash

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)

Ning volumete kustutamiseks

# docker volume rm $(docker volume ls)

Skripti jaoks mis kustutab regulaarselt liiga vanu imageid võib kasutada järgnevat käsku

# docker image prune --all -f --filter until=24h

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.

Selleks, et teha oma img kättesaadavaks ka läbi docker hubi tuleb tekitada sinna kasutaja ning repo ja logida käsurealt sinna sisse

# docker login -u kasutaja

Ja lükata fail üles

# docker push kasutaja/test

Konteinerite loomine docker-compose abil

docer-compose pole tegelikult midagi muud kui nö "buildfile" dockerisüsteemi jaoks. Ehk siis kui tavaliselt peab dockereid tõmbama käima käskudega

docker run -t -i wordpress:latest /bin/bash
docker run -t -i mariadb/bin/bash

koos kõigi sinna juurde kuuluvate parameetrite jms asjadega siis docker-compose lubab luua ühtse faili kus kõik ühes kohas

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

Selle käivitamiseks tuleb teha kaustas kus docker-compose fail asub

# 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

Selleks, et dockeri masinad stardiksid peale serveri rebooti tuleb vaadata, et dockeri deemon käivituks ning seadistad docker-comopose faili

restart: unless-stopped

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. Soovides kontrollida aga tcp porte võib kasutada järgnevat käsku

test: ["CMD-SHELL", "timeout 2 bash -c \"</dev/tcp/127.0.0.1/443\";"]

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

Dockeri võrgud

$ docker network create myapp

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

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


Lingid

https://jvns.ca/blog/2019/11/18/how-containers-work--overlayfs/ overlayfsi tööpõhimõttest