Erinevus lehekülje "Docker" redaktsioonide vahel
(→Docker cluster ehk swarm) |
(→Docker cluster ehk swarm) |
||
301. rida: | 301. rida: | ||
Worker1 - 192.168.1.105 | Worker1 - 192.168.1.105 | ||
Worker2 - 192.168.1.105 | Worker2 - 192.168.1.105 | ||
+ | |||
+ | Proxy roll oleks siis suunata temale kinnitatud dns domeene kõigile kolmele managerile edasi | ||
Tekitame esimeses nodes swarmi clustri | Tekitame esimeses nodes swarmi clustri |
Redaktsioon: 18. juuni 2019, kell 16:08
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
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)
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
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. 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
Docker cluster ehk swarm
Docker swarm võimaldab grupeerida erinevaid konteinereid, skaleerida neid ja pakub failoverit. Kui tahta lihtsat ja robustset vahendit mis hoiab konteinerid elus ja stardib neid nodede feilimisel uuesti üles on swarm nendele hea lahendus. Kui üks node jätta seisma stardib ta seal olnud konteinerid automaatselt teistele workeritele. Samas manager node ei tohi maha minna, kui see läheb siis failover ka ei tööta ja süsteem ei oska tundub siis midagi peale hakata. Selleks, et süsteem kannataks välja ühe master node kaotuse peab neid olema clustris vähemalt kolm aktiivset. Kusjuures kõik noded võivad olla ka managerid sest manager kannab endas ka worker node ülesandeid nagu paistab.
Loodava swarmi clustri arhidektuur oleks järgnev
Proxy - 192.168.1.102 Manager1 - 192.168.1.102 Manager2 - 192.168.1.103 Manager3 - 192.168.1.104 Worker1 - 192.168.1.105 Worker2 - 192.168.1.105
Proxy roll oleks siis suunata temale kinnitatud dns domeene kõigile kolmele managerile edasi
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
Dockeri node võib olla nii workeri kui manageri rollis
Soovides lisada uut manageri tuleb küsida managerilt õige token
docker swarm join-token manager
Lisaks saab manageris workerit ülendada manageriks järgneva käsuga
docker node promote ID
Soovides node swarmist eemaldadamiseks tuleb kõigepealt nodes endas anda käsk
docker swarm leave
Ja siis mangeris
docker node rm ID
Nüüd saame näiteks luua sinna teenuse httpd nimelisest konteinerist ja teha selle 80 pordil kättesaadavaks
# 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
Docer-compose failide kasutamiseks
# docker stack deploy --compose-file docker-compose.yml webserver
Et näha mis konteinerid clustris töötavad
# docker node ps
Kõikide teenuste eemaldamiseks
# docker service rm $(docker service ls -q)
Dockeri teenustel pole nende restartimiseks eraldi käsku. Aitab kui nad skaleerida korraks nulli
$ docker service scale svr=0 $ docker service scale svr=1
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