48
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

Uvod u Docker

  • Upload
    lamdien

  • View
    260

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Uvod u Docker

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

Page 2: Uvod u Docker

Sadržaj

• Kontejnerska virtualizacija

• Docker koncepti

• Instalacija i osnovne naredbe

• Dockerfile – automatizirana izgradnja slike

• Primjeri uporabe

2

Page 3: Uvod u Docker

Kontejnerska virtualizacija

3

Page 4: Uvod u Docker

Š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

Page 5: Uvod u Docker

Š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

Page 6: Uvod u Docker

Š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

Page 7: Uvod u Docker

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

Page 8: Uvod u Docker

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

Page 9: Uvod u Docker

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

Page 10: Uvod u Docker

Docker koncepti

10

Page 11: Uvod u Docker

Š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

Page 12: Uvod u Docker

Š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

Page 13: Uvod u Docker

Što je Docker?

• Tri osnovne tehnologije Docker kontejnera: namespaces,

cgroups, sustav spremišta copy-on-write

13

Page 14: Uvod u Docker

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

Page 15: Uvod u Docker

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

Page 16: Uvod u Docker

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

Page 17: Uvod u Docker

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

Page 18: Uvod u Docker

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

Page 19: Uvod u Docker

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

Page 20: Uvod u Docker

Instalacija i osnovne naredbe

20

Page 21: Uvod u Docker

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

Page 22: Uvod u Docker

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

Page 23: Uvod u Docker

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

Page 24: Uvod u Docker

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

Page 25: Uvod u Docker

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

Page 26: Uvod u Docker

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

Page 27: Uvod u Docker

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

Page 28: Uvod u Docker

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

Page 29: Uvod u Docker

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

Page 30: Uvod u Docker

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

Page 31: Uvod u Docker

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

Page 32: Uvod u Docker

Dockerfile – automatizirana

izgradnja slike

32

Page 33: Uvod u Docker

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

Page 34: Uvod u Docker

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

Page 35: Uvod u Docker

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”

Page 36: Uvod u Docker

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

Page 37: Uvod u Docker

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

Page 38: Uvod u Docker

Primjeri uporabe

38

Page 39: Uvod u Docker

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

#

Page 40: Uvod u Docker

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"

Page 41: Uvod u Docker

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

Page 42: Uvod u Docker

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

Page 43: Uvod u Docker

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

Page 44: Uvod u Docker

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

Page 45: Uvod u Docker

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

Page 46: Uvod u Docker

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

Page 47: Uvod u Docker

Primjeri uporabe – Consumer TCP Keepalive

• Mrežni ispad je simuliran s iptablesom

47

% docker exec consumer-webinar iptables -A OUTPUT -

d mq1 -j DROP

Page 48: Uvod u Docker

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?