dla początkujących
Marcin Stożek "Perk"
Nie o tym ta prezentacja
O tym też nie
O tym również nie
Plan działania
- Ogólnie
- Architektura
- Ekosystem
- Kontrowersje
Ogólnie
Docker - kto to co to
- www.docker.com
- github.com/docker/docker
- Implementuje wysokopoziomowe API do
uruchamiania izolowanych procesów
Hello world!
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
Obrazek: http://bit.ly/2drqhTB
Dla kogo ta technologia?
- Programistów
- Pełna kontrola nad bibliotekami systemowymi
- Propozycja uruchomienia aplikacji
- Administratorów
- Proste uruchomienie wielu izolowanych aplikacji
- Programy dostarczane jako demony
- Niezmienność infrastruktury
Historia
- 1979 - Unix - chroot
- 2000 - FreeBSD - jail
- 2000 - Linux, Windows - Virtuozzo
- 2001 - Linux - VServer
- 2004 - Solaris - Zones
- 2004 - Windows - Sandboxie
- 2005 - Linux - OpenVZ
- 2007 - AIX, HP-UX
- 2008 - Linux - LXC
- 2013 - Linux - Docker
Odkrywamy koło na nowo :)
Wiki: Operating system level virtualization
Kontenery
Kernel: Control Groups, Layers, Namespaces
(Linux oraz Windows)
Wirtualizacja
Różne systemy (Windows, Linux) i architektury (32/64 bity)
Obrazki: docker.com/what-docker
Dokumentacja
- Jest świetna
- Zawiera tutorial :]
- Oraz wykaz podstawowych komend
- https://docs.docker.com/
Architektura
Pojęcia
- Demon
- Klient
- Obraz
- Rejestr
- Kontener
Z lotu ptaka
Demon
Demon o nazwie dockerd -uruchomiony tam, gdzie są uruchomione kontenery.
- Linux - początkowo
jedyny wspierany
-
Windows 10 oraz
Windows Server 2016
- Mac - dostępny poprzez... wirtualizację :]
Klient
Aplikacja CLI o nazwie docker - uruchomiona gdziekolwiek, komunikuje się z demonem.
- Podstawowy interfejs użytkownika.
- Binarki dla Linuksa, Maca i Windowsa.
Obrazy
- Obraz to szablon dla kontenera
- Tylko do odczytu
- Mieszkają w lokalnym cache...
- ... albo w rejestrze
- Można tworzyć swoje obrazy
lub bazować na już istniejących - Nie twórz ich ręcznie
(użyj Basha / Ansible / Puppet / Chef)
Akcje dostępne dla obrazów:
build, commit, tag, history, load, save...
Źródło: docker.com/what-docker
Obrazy - Dockerfile
- Dockerfile to przepis na obraz
(na przykład taki z Javą w środku)
$ cat Dockerfile
FROM openjdk:8
MAINTAINER perk <@marcinstozek>
ENV ENVIRONMENT=production
COPY app.jar /
ENTRYPOINT ["java", "-jar", "app.jar"]
$ docker build . --tag my-app:1.0.0
Sending build context to Docker daemon 2.56 kB
Step 1 : FROM openjdk:8
---> 96cddf5ae9f1
Step 2 : MAINTAINER perk <@marcinstozek>
---> Using cache
---> 39d368002a6d
Step 3 : ENV ENVIRONMENT production
---> Using cache
---> d9b306b7b8bf
Step 4 : COPY app.jar /
---> 4762e69c1044
Removing intermediate container 18d24885bfac
Step 5 : ENTRYPOINT java -jar app.jar
---> Running in ffeda9429d40
---> 0c96dfd878be
Removing intermediate container ffeda9429d40
Successfully built 0c96dfd878be
$ docker images
my-app 1.0.0 0c96dfd878be 47 seconds ago 640.9 MB
Obrazy - UnionFS
- każda linia w Dockerfile tworzy warstwę
- $ docker images -a
- $ tree /var/lib/docker/overlay2/... | less
Rejestry
- Dom dla obrazów (oprócz lokalnego cache)
- Oficjalny: hub.docker.com
- dużo oficjalnych, gotowych do użycia obrazów
- publiczne obrazy przechowujemy za darmo
- $ docker pull openjdk:8
- Własny: docs.docker.com/registry
- kontrolujemy dostęp do naszych obrazów
- brak wielu (nie)zbędnych fajerwerków
- Pozostałe opcje: Portus, Quay i wiele innych
Kontenery
- uruchomiony obraz
- samowystarczalność (prawie)
- izolacja (cgroup + namespace)
- jeden proces na kontener (ale i ale)
- zajmują mało miejsca na dysku
- restart - dane z pamięci są tracone
- nie aktualizuj systemu w kontenerze
- lepiej stwórz nowy obraz bazowy
Akcje dostępne dla kontenerów:
run, start, stop, kill, rm, export, pause, diff...
Kontener z zewnątrz
$ docker run --name my-app-container my-app:1.0.0
Hello world!
$ docker ps --all --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"
CONTAINER ID IMAGE STATUS NAMES
95316485ab6c my-app:1.0.0 Exited (0) 9 seconds ago my-app-container
$ docker logs my-app-container
Hello world!
$ docker inspect my-app-container
[
{
"Id": "95316485ab6c0d7fd67912205ee8654f5ffb8161b266dd5c69e2b3d344490f07",
"Created": "2017-04-03T10:11:42.578268726Z",
(...)
Kontener od środka
$ docker run -it ubuntu:16.04 /bin/bash
root@24a9ea7f2dba:/# echo Look Ma, I am in the container!
Look Ma, I am in the container!
root@24a9ea7f2dba:/# hostname
24a9ea7f2dba
root@24a9ea7f2dba:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
(...)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
(...)
$ docker ps --all --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"
CONTAINER ID IMAGE STATUS NAMES
24a9ea7f2dba ubuntu:16.04 Up 5 minutes peaceful_torvalds
Yo Dawg
❗ Uwaga na CI: Do-not-use-docker-in-docker-for-ci
Kontenery vs pliki
- Pliki mogą być zapisane w kontenerze
- $ docker rm container_id - kochane logi - pa pa
- $ docker run --read-only --tmpfs /tmp
-
Data Volumes
- Pomijają Union File System
- Utrzymują dane nawet jeżeli kontener nie istnieje
- Można zmapować zewnętrzny folder
-
Data Volume Containers
- data-only container pattern
- $ docker run --volumes-from container_id
Czas na powtórkę
Zadanie domowe
- Uruchamiamy Redisa
Bezpieczeństwo
- Dostęp do Dockera = dostęp do roota
- czyli wszyscy w grupie docker
- Dostęp do Dockera = dostęp do roota
- wspominałem już o tym?
- Temat rzeka :]
- Docker Bench Security
- (Nie)oficjalne obrazy z hub.docker.com
- Dostęp do Dockera = dostęp do roota
Ekosystem
Zarządzanie kontenerami
- Jeden kontener łatwo odpalić, a 2000?
- A na wielu komputerach?
- A gdy nie interesuje mnie na którym konkretnie?
- A co, gdy w ogóle nie interesuje mnie "system", nie mam serwerów i chcę tylko odpalić kontener?
- I najlepiej, żeby wszystko mogło się ze sobą komunikować bez mojej ingerencji
Ze stajni Dockera
-
Docker Compose
- przepis na kontener
- aplikacje wielokontenerowe
-
Docker Swarm Mode
- klastrowanie, rozproszony Demon
- serwisy + równoważenie obciążenia
- uwaga na standalone != built-in
-
Docker Machine
- wirtualna maszyna z Dockerem
Inne rozwiązania
Portainer
Kontrowersje
Haters gonna hate, but...
- Nietrudno je znaleźć
- Główne zarzuty:
- to samo można zrobić używając innych narzędzi
- ale po co?
- uber root demon
- ... który miesza w sieci hosta
- debugowanie aplikacji
- bezpieczeństwo (m.in. HUB)
- to samo można zrobić używając innych narzędzi
Dziękuję za uwagę!
Marcin Stożek "Perk"
@marcinstozek / perk.pl
Docker dla początkujących
By Marcin Stożek
Docker dla początkujących
- 2,815