Docker
Toores. Ehk seda pala võib täiendada.
Sisukord
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