Docker

Bazirano na verziji 1.12.3

Prof. dr Igor Dejanović (igord at uns ac rs)

Kreirano 2023-01-16 Mon 18:19, pritisni ESC za mapu, m za meni, Ctrl+Shift+F za pretragu

Sadržaj

1. Uvod

1.1. Motivacija

  • Uvođenje (Deployment)
  • Okruženje (Environment)
  • Zavisnosti (Dependencies)
  • Ponovljivost (Repeatability)
  • Automatizacija

1.2. Docker

  • Automatizacija procesa uvođenja upotrebom softverskih kontejera.
  • Izolacija aplikacije i svih njenih zavisnosti putem linux kernel cgroups i namespaces mehanizama.
  • Na Windows-u i Mac-u se izvršava u okviru virtuelne mašine.
  • Obezbeđivanje identičnog okruženja za rad aplikacije u vreme razvoja, testiranja i produkcije.
  • Ponovljivost - izbegavanje konfiguracionih problema pri promeni načina izvršavanja i okruženja(cloud, lokalno…).
  • Manje zauzeće resursa u odnosu na virtuelizaciju.
  • Veoma popularan. Velika zajednica. Docker Hub - slično GitHub-u ali za tzv. doker slike (Docker images).
  • Apache 2.0 licenca.

1.3. Arhitektura

architecture.svg

  • Registries, images, containers
  • Union file systems (layered): overlay2, AUFS, btrfs,…
  • Linux kernel namespaces and cgroups

2. Rad sa kontejnerima

2.1. Hello World u dokeru

$ docker run ubuntu:16.04 /bin/echo 'Hello world'
Hello world

2.2. Interaktivni kontejner

$ docker run -t -i ubuntu:16.04 /bin/bash
root@af8bae53bdd3:/#
  • -t - alokacija pseudo terminala
  • -i - spajanje na STDIN
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv
sys tmp usr var
root@af8bae53bdd3:/# exit

2.3. “Demonizacija”

$ docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

$ docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
1e5535038e28  ubuntu:16.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

$ docker logs insane_babbage
hello world
hello world
hello world

$ docker stop insane_babbage
insane_babbage

$ docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
  • -d | --detach - ne “kačiti” se za STDOUT

2.4. Pokretanje jednostavne veb aplikacije

  • Pokretanje jednostavne Python Flask aplikacije.
$ docker run -d -P training/webapp python app.py
$ docker ps -l
CONTAINER ID  IMAGE                   COMMAND       CREATED
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago

    STATUS        PORTS                    NAMES
    Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse
            
  • -P - Mapiranje porta iz intervala 32768-61000 na exportovane portove kontejnera
  • Može i …
$ docker run -d -p 80:5000 training/webapp python app.py

2.5. Python Flask aplikacija

webapp1.png

2.6. IP adresa

  • Ukoliko se kontejner izvršava na drugoj mašini treba nam IP adresa da bi pristupili aplikaciji.
$ docker-machine ip my-docker-vm
192.168.99.100

2.7. “Prečica” za dobijanje preslikanog porta

$ docker port nostalgic_morse 5000
0.0.0.0:49155

2.8. Pregled dnevnika (logs)

$ docker logs -f nostalgic_morse
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [15/Dec/2016 15:14:20] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [15/Dec/2016 15:14:20] "GET /favicon.ico HTTP/1.1" 404 -
172.17.0.1 - - [15/Dec/2016 15:14:20] "GET /favicon.ico HTTP/1.1" 404 -
  • -f “forever” - terminal ostaje “zakačen” na STDOUT kontejnera

2.9. Pregled procesa

$ docker top nostalgic_morse
UID   PID    PPID     C     STIME    TTY     TIME                CMD
root  20409  20393    0     16:10    ?       00:00:00            python app.py

2.10. Zauzeće resursa kontejnera

$ docker stats --no-stream nostalgic_morse
CONTAINER        CPU %   MEM USAGE / LIMIT       MEM %    NET I/O               BLOCK I/O           PIDS
elegant_meitner  0.02%   24.06 MiB / 7.493 GiB   0.31%    3.895 kB / 3.686 kB   13.33 MB / 0 B      1
  • --no-stream - vrati prvi rezultat

2.11. Inspekcija kontejnera

$ docker inspect nostalgic_morse
[
    {
        "Id": "650bf9569f884b0bbb1274c0af88b002b4e5e6556438484ae79dcd275a4f7930",
        "Created": "2016-12-15T15:10:53.460834861Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 20409,

. . .

2.12. Povezivanje za kontejner koji se izvršava

  • Ukoliko se pokrene interaktivna sesija pri pokretanju kontejnera navođenjem -t -i parametara, konzola se može “otkačiti” sa Ctrl-P-Q.
  • Na konzolu kontejnera se opet može povezati sa:
$ docker attach nostalgic_morse

2.13. Pristup kontejneru koji se izvršava

  • Nekada kontejner nema aktivan shell. U tom slučaju ukoliko se povežemo sa attach nemamo interakciju već imamo samo ispis aplikacije koja se izvršava.
  • U kontekstu kontejnera koji se izvršava moguće je izvršiti proizvoljnu komandu.
$ docker exec -it mycontainer bash
root@bd57610aa95a:/usr/src/redmine#
  • Ne zaboraviti završetak sesije sa exit ili Ctrl-D.

2.14. Zaustavljanje i uklanjanje kontejnera

$ docker stop nostalgic_morse
nostalgic_morse

$ docker rm nostalgic_morse
nostalgic_morse

3. Rad sa slikama (images)

3.1. Rad sa slikama (images)

  • Kontejner koji radi je baziran na slici (image) analogno klasi i instanci/objektu kod OO jezika
  • Kod pokretanja, ako slika ne postoji lokalno preuzima se sa udaljenog repozitorijuma (npr. Docker Hub)

3.2. Listanje slika

$ docker images
REPOSITORY          TAG       IMAGE ID        CREATED          VIRTUAL SIZE
ubuntu              16.04     1d073211c498    3 days ago       187.9 MB
busybox             latest    2c5ac3f849df    5 days ago       1.113 MB
training/webapp     latest    54bb4e8718e8    5 months ago     348.7 MB
  • Repozitorijum sadrži potencijalno više varijanti slike. Na primer ubuntu sadrži verzije 10.04, 12.04, 12.10, 13.04, 13.10, 14.04, 16.04…
  • Da bi se pokrenula određena verzija (tag) slike koristi se komanda:
$ docker run -t -i ubuntu:12.04 /bin/bash
  • Ukoliko se ne navede oznaka podrazumeva se latest.

3.3. Preuzimanje slika

  • run komanda će automatski preuzeti sliku ukoliko ne postoji lokalno.
  • Slika se može i eksplicitno preuzeti komandom docker pull.
$ docker pull centos
Pulling repository centos
b7de3133ff98: Pulling dependent layers
5cc9e91966f7: Pulling fs layer
511136ea3c5a: Download complete
ef52fb1fe610: Download complete
. . .

Status: Downloaded newer image for centos

$ docker run -t -i centos /bin/bash
bash-4.1#

3.4. Pronalaženje doker slike

  • Putem Docker Hub sajta.
  • …ili upotrebom docker search komande.
$ docker search sinatra
NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
erikap/ruby-sinatra                          Docker for hosting Sinatra apps                 12                   [OK]
semtech/mu-sinatra-template                  Template for running Ruby/Sinatra microser...   2                    [OK]
zyio/sinatra                                 Tiny-ish Sinatra Dockerfile                     1                    [OK]
samlet/microservices-sinatra-products        microservices with sinatra                      1                    [OK]
lucymhdavies/sinatra-boilerplate             Docker image with my boilerplate for Sinat...   1                    [OK]
thomastanmin/sinatra                         This is the docker example with auto build...   1                    [OK]
tdiary/rpaproxy-sinatra                                                                      1                    [OK]
convox/sinatra                               Convox base image for Sinatra                   0                    [OK]
. . .

3.5. Vrste slika

  • base ili root slike - izgrađene i podržane od strane Docker Inc. Identifikuju se prostim imenom (npr. ubuntu).
  • korisničke slike (user images) - imaju korisničko ime kao prefix (npr. training/sinatra). Izgrađeni i podržani od strane članova doker zajednice.

3.6. Preuzimanje korisničke slike i startovanje kontejnera

$ docker pull training/sinatra

$ docker run -t -i training/sinatra /bin/bash
root@a8cb6ce02d85:/#

3.7. Kreiranje slika

  • Dva načina:
    • Interaktivno ažuriranje stanja kontejnera i perzistencija nove verzije commit operacijom.
    • Kreiranje Dockerfile fajla koji opisuje postupak izgradnje nove slike polazeći od postojeće i primenom niza komandi.
  • Koristiti drugi način kad god je moguće.

3.8. Interaktivno ažuriranje stanja kontejnera

$ docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#

root@0b2616b0e5a8:/# gem install json
...
root@0b2616b0e5a8:/# exit
$ docker commit -m "Added json gem" -a "Kate Smith" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
  • -m - commit poruka
  • -a - autor

3.9. Upotreba nove slike

$ docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
training/sinatra    latest  5bc342fa0b91   10 hours ago  446.7 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB
ouruser/sinatra     latest  5db5f8471261   10 hours ago  446.7 MB

$ docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#

3.10. Izgradnja slike upotrebom Dockerfile fajla

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

Sadržaj fajla:

# This is a comment
FROM ubuntu:14.04
MAINTAINER Kate Smith <ksmith@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra

3.11. Docker build komanda

$ docker build -t ouruser/sinatra:v2 .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 1 : FROM ubuntu:14.04
 --->; e54ca5efa2e9
Step 2 : MAINTAINER Kate Smith <ksmith@example.com>
 --->; Using cache
 --->; 851baf55332b
Step 3 : RUN apt-get update && apt-get install -y ruby ruby-dev
 --->; Running in 3a2558904e9b
Selecting previously unselected package libasan0:amd64.
(Reading database ... 11518 files and directories currently installed.)
...
Removing intermediate container 3a2558904e9b
Step 4 : RUN gem install sinatra
 ---&gt; Running in 6b81cb6313e5
Successfully installed rack-1.5.2
Successfully installed tilt-1.4.1
...
Removing intermediate container 6b81cb6313e5
Successfully built 97feabe5d2ed

3.12. Docker context

  • Izgradnju slike obavlja doker demon proces.
  • Pre početka klijent šalje zapakovan sadržaj foldera koji je prosleđen kao parametar.
  • Ovaj folder minimalno treba da ima Dockerfile ali može imati i dodatne fajlove i foldere koji se mogu po potrebi ugraditi u kontejner komandom ADD.

Napomena: Celokupan folder se pakuje i šalje demon procesu. Paziti da folder sadrži samo zaista potrebne fajlove.

3.13. Označavanje slika (tagging)

  • Svakoj verziji slike možemo dati simboličku oznaku (tag).
$ docker tag 5db5f8471261 ouruser/sinatra:devel

$ docker images ouruser/sinatra
REPOSITORY          TAG     IMAGE ID      CREATED        VIRTUAL SIZE
ouruser/sinatra     latest  5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     devel   5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     v2      5db5f8471261  11 hours ago   446.7 MB

3.14. Slanje slika na Docker Hub

$ docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)
Sending image list
Pushing repository ouruser/sinatra (3 tags)
. . .

3.15. Uklanjanje slike sa računara

$ docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

4. Dockerfile

5. Docker Data Volumes

6. Docker Compose

7. Docker Swarm

8. Vizuelizacija doker kontejnera

8.1. dockviz

  • Alat za vizualizaciju doker slika
  • Dostupan na GitHub-u.
  • Može se instalirati kao doker slika:
$ docker pull nate/dockviz
Using default tag: latest
latest: Pulling from nate/dockviz
8bd831364921: Pull complete
3dfb5e1486b5: Pull complete
607d274e6daa: Pull complete
Digest: sha256:9afe152b794ae8480b230545ec75bc81f5e11a0b9d28158bb609479de5a95a72
Status: Downloaded newer image for nate/dockviz:latest

$ alias dockviz="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz"

8.2. Vizualizacija veza između kontejnera

$ dockviz containers -d | dot -Tpng -o containers.png

containers.png

8.3. Vizualizacija međuzavisnosti i veličina slika

$ dockviz images -t -i
└─511136ea3c5a Virtual Size: 0.0 B
  ├─f10ebce2c0e1 Virtual Size: 103.7 MB
  │ └─82cdea7ab5b5 Virtual Size: 255.5 KB
  │   └─5dbd9cb5a02f Virtual Size: 1.9 KB
  │     └─74fe38d11401 Virtual Size: 105.7 MB Tags: ubuntu:12.04, ubuntu:precise
  ├─ef519c9ee91a Virtual Size: 100.9 MB
  │ └─07302703becc Virtual Size: 251.0 KB
  │   └─cf8dc907452c Virtual Size: 1.9 KB
  │     └─a7cf8ae4e998 Virtual Size: 70.1 MB Tags: ubuntu:12.10, ubuntu:quantal
  │       ├─e18d8001204e Virtual Size: 29.4 KB
  │       │ └─d0525208a46c Virtual Size: 71.0 B
  │       │   └─59dac4bae93b Virtual Size: 71.2 MB
  │       │     └─89541b3b35f2 Virtual Size: 269.3 MB
  │       │       └─7dac4e98548e Virtual Size: 0.0 B
  │       │         └─341d0cc3fac8 Virtual Size: 0.0 B
  ...

8.4. Reference