Upload
lamdien
View
260
Download
2
Embed Size (px)
Citation preview
Uvod u Docker
Autor: Daniel Vrčić
Voditeljica: Irena Jandrić
25. listopad 2016.
Obrazovni program za IT-specijaliste edu4IT, Sistemski administrator 1, područje Linux
Sadržaj
• Kontejnerska virtualizacija
• Docker koncepti
• Instalacija i osnovne naredbe
• Dockerfile – automatizirana izgradnja slike
• Primjeri uporabe
2
Kontejnerska virtualizacija
3
Što su kontejneri?
• Oblik virtualizacije
• fizičko računalo moguće podijeliti u više „virtualnih računala“
svaki s podskupom fizičkih resursa
• tehnički drugačije izvedeno od hipervizora i paravirtualizacije
• Kao koncept i rješenja postojali su i prije
• BSD – Jails
• Solaris – Zones
• Linux – OpenVZ, Linux-VServer
• za potpunu funkcionalnost zahtijevaju modificiranu jezgru
4
Što su kontejneri?
• Razvijanje kontejnerskih tehnologija u samoj Linux jezgri
engl. kernel) dovelo je do šire uporabe kontejnera
• kernel namespaces
• control groups – cgroups
• Linux jezgra 2.6.32+ (2009.)
• Kontejneri „izgledaju“ kao lagana (engl. lightweight) virtualna
računala
• izolirano stablo procesa
• vlastiti montirani datotečni sustav
• mrežno sučelje i TCP/IP stog (engl. stack)
• instalacija paketa i pokretanje aplikacija/servisa kao root
5
Što su kontejneri?
• Kontejneri nisu virtualna računala
• nema virtualiziranog hardvera, nema
hipervizora
• oslanjaju se na operacijski sustav domaćina
(engl. host)
• pozivaju direktno njegove sistemske pozive
(engl. syscalls)
• OS-level virtualizacija
• mehanizmi virtualnih izoliranih okruženja
• sadrže samo korisničke aplikacije i minimalni
skup biblioteka i alata
• Linux domaćin → Linux kontejner aplikacija
6
Linux kontejneri
• Linux kontejneri su realizirani kao procesi OS domaćina
• kreiraju se clone() sistemskim pozivom
• kontejner proces ima izoliran pogled na okruženje domaćina
(primjer: montirani datotečni sustav)
7
Prednosti i nedostatci kontejnerske virtualizacije
• Oslanja se direktno na operacijski sustav domaćina
• brže pokretanje i efikasnije trošenje resursa
• Ne distribuira se sistemska komponenta
• u kontejner se smješta samo korisnička aplikacija/servis i
minimalni skup ovisnosti
8
Prednosti i nedostatci kontejnerske virtualizacije
• Olakšana prenosivost od stolnog računala, poslužitelja do
cloud rješenja
• Linux jezgra 2.6.32+ na „drugoj strani“ uz kontejnersko
rješenje je jedini uvjet
• Nedostatak: Linux jezgra je jedinstvena točka pada sustava
• selidba Linux kontejnera „na živo“ (engl. live migration) je još
uvijek u razvoju
9
Docker koncepti
10
Što je Docker?
• Tehnologija koja je omogućila široku uporabu Linux
kontejnera
• korisnički alati i koncept su bitno olakšali izradu i upravljanje
Linux kontejnerima
• LXC, LXD rješenja su zahtijevala veliku količinu tehničkog
znanja
• OpenVZ, Linux-VServer ostavljaju dojam upravljanja
virtualnim računalima
• Projekt otvorenog koda tvrtke dotCloud
• 2013.
• programski jezik Go
11
Što je Docker?
• Prihvaćenost diljem IT industrije
• Openstack – NOVA komponenta
• Redhat – OpenShift PaaS cloud rješenje
• Chef, Puppet, Jenkins, Travis, Ansible – DevOps alati
• AWS, Azure, Digital Ocean – pružatelji cloud usluga
• Microsoft – Windows containers, Hyper-V containers
• Open Containers Initiative – standardni format kontejnera i
sučelje za upravljanje
• uz spomenute, Cisco, EMC, Google, Goldman Sachs, HP,
IBM, Intel, VMware...
12
Što je Docker?
• Tri osnovne tehnologije Docker kontejnera: namespaces,
cgroups, sustav spremišta copy-on-write
13
Docker kontejner
• Namespaces:
• mount – vlastiti root filesystem
• UTS – vlastiti FQDN
• network – TCP/IP stog, sockets, routing tablice i iptables pravila
• IPC – vlastiti prostor podatkovnih struktura za komunikaciju između procesa
• PID – izolirano stablo procesa
• user – vlastiti UID, GID skup
• Cgroups
• logičko grupiranje procesa
• kontrola i dodjeljivanje resursa: CPU, RAM, diskovni i mrežni IO
14
Docker slike i spremište copy-on-write
• Kontejner je run-time konstrukt, a Docker slika build-time
konstrukt
• aplikacije i alati kontejnera su pohranjeni u slici
• pokretanjem kontejnera iz slike vidljivi su na datotečnom
sustavu kontejnera
15
Docker slike i spremište copy-on-right
• Docker bazne slike
• male, kompaktne
• CentOS 7 196.7 MB
• iz njih se izvode korisničke slike
• Svakoj slici odgovara lista RO (read-only) slojeva
• roditelj-dijete veza
• sadrže samo razliku/promjenu na datotečnom sustavu
• Pokretanjem kontejnera → RW (read-write) sloj
• unificirani prikaz podataka nižih slojeva
16
Docker slike i spremište copy-on-write
• Docker spremišni upravljački program (engl.
driver) mora biti u mogućnosti:
• spremati promjene kao slojeve i prikazivati ih
u združenom obliku
• copy-on-write – podatak se dijeli s jednim od
RO slojeva sve dok ga se ne zatraži privatno
• bitno optimizira veličinu slike
• bitno doprinosi brzini pokretanja kontejnera
• Izvedbe:
• AUFS, OverlayFS
• devicemapper
• BTRFS, ZFS
17
DockerHub
• Registar Docker slika sa službenim (sigurnim, provjerenim) i neslužbenim repozitorijima slika
• Centralizirano mjesto za otkrivanje i distribuciju Docker slika te suradnju među korisnicima i timovima
• Princip sličan GitHub-u
• funkcionira s razlikama slika (slojevima)
18
Mrežni podsustav
• Standardna postavka: kontejneri su međusobno umreženi
docker0 virtualnim premosnikom (engl. bridge) i imaju izlaz
na Internet
• Moguće su korisnički definirane konfiguracije mreža
kontejnera (NAT, …)
19
Instalacija i osnovne naredbe
20
Instalacija (Fedora Linux)
# dnf install docker
21
• Na raspolaganju stoje:
• docker rpm paket iz Fedora službenog repozitorija
• docker-engine rpm paket iz Docker službenog repozitorija
• Fedora repozitorij
Instalacija (Fedora Linux)
• Docker repozitorij
• instalacija paketa
# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/fed
ora/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
# dnf install docker-engine
22
Instalacija (Fedora Linux)Instalacija (Fedora Linux)
• Docker je realiziran klijent-server modelom
• Klijent:
• Server – Docker Engine:
• Pokretanje testnog kontejnera:
/usr/bin/docker
# systemctl enable docker.service
# systemctl start docker
# docker run --rm hello-world
23
Instalacija (Fedora Linux)
• Centos/Fedora Linux distribucije koriste loopback
devicemapper spremišni upravljački program
• u određenim okolnostima ne oslobađa diskovni prostor pri
brisanju Docker slika
• „Friends Don't Let Friends Run Docker on Loopback in
Production”
• preporuka: LVM Thinpool devicemapper
• Alternativa „za po doma” → OverlayFS
• zahtijeva isključeni SELinux
• /etc/sysconfig/docker
OPTIONS=--selinux-enabled=false
24
Instalacija (Fedora Linux)
• pokrenuti naredbu
• provjera
• Docker instalacija iz službenog Fedora repozitorija
# docker-storage-setup
# docker info | grep „Storage Driver”
Storage Driver: overlay
25
Naredbe
• Pokretanje kontejnera iz Centos 7 Docker slike i pokrenuti bash shell
• docker run <slika> <naredba>
• slika se preuzima s DockerHub repozitorija jer ne postoji
lokalno i sastoji se od 4 sloja
% docker run --name centos7 -ti centos:7 /bin/bash
Unable to find image 'centos:7' locally
7: Pulling from library/centos
8aae2253a786: Pull complete
f27884d12282: Downloading [> ] 536.7 kB/70.59 MB
767e0d6cc658: Download complete
dcb7b7451a2b: Download complete
26
Naredbe
• Koji su kontejneri trenutno aktivni?
• docker ps
• imenovani kontejner (--name centos7)
• ID kontejnera 9c631c8d9b41 kao hostname
% docker ps
CONTAINER ID IMAGE COMMAND CREATED
9c631c8d9b41 centos:7 "/bin/bash" 7 minutes ago
STATUS NAMES
Up 7 minutes centos7
[root@9c631c8d9b41 /]# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
27
Naredbe
• Koja je IP adresa kontejnera?
• docker inspect <kontejner ili slika>
• Koje su aplikacije aktivne u kontejneru?
• bash ima PID 1
• Kontejner ima karakteristike virtualnog računala
% docker inspect centos7 | grep IPAddress\":
"IPAddress": "172.17.0.38",
[root@9c631c8d9b41 /]# pstree
bash: pstree: command not found
[root@9c631c8d9b41 /]# yum -y install psmisc
[root@9c631c8d9b41 /]# pstree -cp
bash(1)---pstree(80)
28
Naredbe
• Instalirao sam paket psmisc, kako spremiti promjene?
• docker commit <ime ili ID kontejnera> <slika>
• slika je izvedena iz centos:7 slike i dodan joj je novi sloj
• docker history <ime ili ID slike>
% docker commit centos7 mycentos7
772ed967e95b0755941dc9acaf1c22a7c8467abfec3e51ba4d0f0f
35e14384a0
% docker history mycentos7
IMAGE CREATED CREATED BY SIZE
772ed967e95b 36 seconds ago /bin/bash 105.9 MB
dcb7b7451a2b 6 weeks ago /bin/sh -c 0 B
767e0d6cc658 6 weeks ago /bin/sh -c ... 0 B
f27884d12282 6 weeks ago /bin/sh -c ... 196.7 MB
8aae2253a786 7 weeks ago /bin/sh -c ... 0 B
29
Naredbe
• Olakšano dijeljenje podataka između kontejnera i domaćina
• docker run <slika> <naredba> -v /host:/cont
• ista vremenska zona kao domaćin, sistemski zapisi
proslijeđeni domaćinu, montiran /home/dvrcic na svoj /mnt
% docker run -ti \
-v /etc/localtime:/etc/localtime \
-v /home/dvrcic:/mnt \
-v /dev/log/:/dev/log \
mycentos7
[root@f9bdb81766af /]# date
Fri Oct 21 08:45:55 CEST 2016
[root@f9bdb81766af /]# df | grep mnt
/dev/mapper/fedora_nb--dvrcic-home 139499880 130558708
1831880 99% /mnt
30
Naredbe
• Kako pobrisati izrađenu sliku?
• docker images
• docker rmi <slika>
[root@f9bdb81766af /]# exit
% docker images | grep mycentos
mycentos7 latest 772ed967e95b 12 hours ago 302.6 MB
% docker rmi mycentos7
Untagged: mycentos7:latest
Deleted:
772ed967e95b0755941dc9acaf1c22a7c8467abfec3e51ba4d0f0f
35e14384a0
31
Dockerfile – automatizirana
izgradnja slike
32
Dockerfile
• Predložak (engl. template) za automatiziranu izgradnju
Docker slike
• jednostavna sintaksa
• jednostavne naredbe
• „Makefile za Docker sliku”
• Primjer - Dockerfile:
• slika će biti izvedena iz centos:7 slike i sadržavat će
instalirane pakete
• docker build –t mycentos7 .
33
FROM centos:7
MAINTAINER [email protected]
RUN yum -y install zsh tmux
Dockerfile
• Kako automatski dodati podatke u sliku?
• potrebno ih je dodati u kontekst izgradnje slike
(engl. build context)
• Kontekst izgradnje slike su datoteke i
direktoriji dostupni Dockerfile naredbama
• to je sadržaj direktorija u kojem se nalazi i sam
Dockerfile
• klijent izgrađuje tarball arhivu i šalje ju Docker
Engineu
• Docker Engine izgrađuje sliku
• odabire datoteke i direktorije koji će biti dio
slike
34
Dockerfile
• Primjer – naredba COPY:
• ADD /dir/.zshrc /root → neće funkcionirati
• Naredba CMD
• aplikacija koja će se pozvati pri instanciranju kontejnera
• Dockerfile naredbe:
• https://docs.docker.com/engine/reference/builder
35
FROM centos:7
MAINTAINER [email protected]
RUN yum -y install zsh tmux
COPY .vimrc .zshrc .tmuxrc /root
CMD „/bin/zsh”
Dockerfile
• Docker Engine princip izgradnje slike:
• Dockerfile naredbe se izvršavaju slijedno i neovisno
• rezultat se zapisuje u novi sloj (commit) koji će biti roditelj za
iduću naredbu
• slojevi/rezultati se keširaju
36
Dockerfile
• Primjer (slojeva ima onoliko koliko i Dockerfile naredbi)
37
% docker build -t mycentos7 .
Sending build context to Docker daemon 36.35 kB
Step 0 : FROM centos:7
---> dcb7b7451a2b
Step 1 : MAINTAINER [email protected]
---> Using cache
---> 75c319ba2d73
Step 2 : RUN yum -y install zsh tmux
---> Using cache
---> 7485a65c41b3
Step 3 : COPY .zshrc .vimrc .tmuxrc /root/
---> Using cache
---> 2d6aee6e68ec
Successfully built 2d6aee6e68ec
Primjeri uporabe
38
Primjeri uporabe – različita Centos okruženja
• Brzi pregled okruženja različitih Centos verzija
• u kojoj verziji biblioteka dolazi u Centos 6.8?
• postoji li paket xyz u Centos 7?
• kako će se aplikacija ponašati ako se izvrši s Python 2.6.6 u
Centos 6?
• koji su argumenti naredbe u Centos 5?
39
% time docker run -ti mycentos6 cat /etc/redhat-release
CentOS release 6.8 (Final)
0.349 total
% docker run -ti -v /home/dvrcic/:/mnt mycentos6
root@c19c36546948 / 0:12:37
#
Primjeri uporabe - Django web aplikacija
• Django web aplikacija postavljena u Centos 7 kontejner
• automatska prijava certifikatom i testiranje Apache
konfiguracije
• Dockerfile
• http://kosjenka.srce.hr/~dvrcic/docker_webinar/poem-
webinar/Dockerfile
• supervisord za kontrolu Apache procesa
• ne preporuča se pokretanje kontejnerske aplikacije u pozadini
40
COPY supervisord.conf /etc/supervisord.conf
CMD "supervisord"
Primjeri uporabe - Django web aplikacija
• supervisord.conf
• autorestart=true → osluškuje je li Apache proces pokrenut i
ponovo ga pokreće ako nije
41
[supervisord]
nodaemon=true
[program:httpd]
command=/bin/bash -c "exec /usr/sbin/httpd -DFOREGROUND"
autorestart=true
Primjeri uporabe - Django web aplikacija
• Pokretanje kontejnera
42
docker run --rm --name poem-webinar -ti \
-p 80:80 -p 443:443 \
-v /etc/localtime:/etc/localtime:ro \
-v /dev/log:/dev/log \
-v /my_work/poem/apache/poem.conf:/etc/httpd/conf.d/poem.conf:ro
-v /my_work/poem/Poem/:/usr/lib/python2.7/site-packages/Poem:ro
-v /my_work/poem/Poem/:/usr/lib/python2.7/site-packages/Poem:ro
-v /my_work/poem/media/:/usr/share/poem/media:ro \
-v /my_work/poem/static/:/usr/share/poem/static:ro \
-v /home/dvrcic/:/mnt poem-webinar
Primjeri uporabe - Django web aplikacija
• Usmjeravanje portova domaćina na portove kontejnera
• Direktoriji domaćina su montirani na direktorije kontejnera
gdje je aplikacija instalirana
• promjene na domaćinu se izravno reflektiraju u kontejneru
• Apache restart
• docker exec <ime ili ID kontejnera> naredba
43
-p <port domaćina>:<port kontejnera>
$ docker exec poem-webinar killall httpd
Primjeri uporabe – Consumer TCP Keepalive
• Dva message brokera ActiveMQ
• zemljopisno raspodijeljena: Grčka, Hrvatska
(SRCE)
• nagledanje rada Europske grid infrastrukture
• Consumer komponenta
• unix servis koji sprema poruke iz message
broker networka
• povezan je samo na jedan message broker u
datom trenutku
• ispad → mora se prebaciti na drugi
• testiranje TCP Keepalivea
44
Primjeri uporabe – Consumer TCP Keepalive
• DockerHub sadrži ActiveMQ slike
• Pokretanje ActiveMQ kontejnera
• Consumer Dockerfile
• http://kosjenka.srce.hr/~dvrcic/docker_webinar/consumer-
webinar/Dockerfile
45
NAME DESCRIPTION
webcenter/activemq ActiveMQ 5.13.2 with OpenJDK-jre-8-headles...
docker run --name='activemq1' -p 61613:61613 -p 8161:8161 -it --rm -P
webcenter/activemq:latest
docker run --name='activemq2' -p 61614:61613 -p 8162:8161 -it --rm -P
webcenter/activemq:latest
Primjeri uporabe – Consumer TCP Keepalive
• Pokretanje consumer kontejnera
• --link <ime ili ID kontejnera>:<alias>
• consumer kontejner će sadržavati mqX aliase u /etc/hostspa sam ga samo morao usmjeriti na njih (consumer.conf)
46
% docker run --rm -ti --privileged
-v /etc/localtime:/etc/localtime:ro
-v /dev/log:/dev/log
--link activemq1:mq1 --link activemq2:mq2
--name consumer-webinar
-v /my_work/argo-egi-consumer/modules:/usr/lib/python2.6/site-
packages/argo_egi_consumer
-v /home/dvrcic/:/mnt consumer-webinar
[Brokers]
Server1 = mq2:61613
Server2 = mq1:61613
Primjeri uporabe – Consumer TCP Keepalive
• Mrežni ispad je simuliran s iptablesom
47
% docker exec consumer-webinar iptables -A OUTPUT -
d mq1 -j DROP
Srce politikom otvorenog pristupa široj javnosti
osigurava dostupnost i korištenje svih rezultata rada
Srca, a prvenstveno obrazovnih i stručnih informacija
i sadržaja nastalih djelovanjem i radom Srca.
Ovo djelo je dano na korištenje pod licencom
Creative Commons Imenovanje-Nekomercijalno
4.0 međunarodna.
www.srce.unizg.hr creativecommons.org/licenses/by-nc/4.0/deed.hr www.srce.unizg.hr/otvoreni-pristup
Pitanja?