Docker

Przewodnik dla początkujących

Marcin Stożek "Perk"

Plan działania

  • Ogólnie
  • Architektura
  • Ekosystem
  • Kontrowersje

Ogólnie

Docker - kto to co to

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/

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

Kontenery

Kernel: Control Groups, Layers, Namespaces
(Linux oraz Windows)

Wirtualizacja

Różne systemy (Windows, Linux) i architektury (32/64 bity)

Dokumentacja

Architektura

Pojęcia

  • Demon
  • Klient
  • Obraz
  • Rejestr
  • Kontener

Demon

Demon o nazwie dockerd -uruchomiony tam, gdzie są uruchomione kontenery.

 

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

 

Akcje dostępne dla obrazów:

build, commit, tag, history, load, save...

Obrazy - Dockerfile

$ 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/aufs/diff/... | less

Rejestry

Kontenery

  • uruchomiony obraz
  • samowystarczalność (prawie)
  • izolacja
  • jeden proces na kontener (ale i ale)
  • zajmują mało miejsca na dysku
  • restart - dane z pamięci są tracone

 

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 JDD 2016 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 JDD 2016 world!




$ docker inspect my-app-container 
[
   {
      "Id": "95316485ab6c0d7fd67912205ee8654f5ffb8161b266dd5c69e2b3d344490f07",
      "Created": "2016-10-07T20: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

Kontenery vs pliki

  • Pliki mogą być zapisane w kontenerze
    • $ docker rm container_id - logi, pa pa
  • Data Volumes
    • Utrzymują dane nawet jeżeli kontener nie istnieje
    • Można zmapować zewnętrzny folder
  • Data Volume Containers
    • data-only container pattern
    • --volumes-from container_id

Czas na powtórkę

Zadanie domowe

Bezpieczeństwo

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

Inne rozwiązania

Kontrowersje

Haters gonna hate, but...

Pytania

Dziękuję za uwagę!

Marcin Stożek "Perk"

@marcinstozek / perk.pl

Made with Slides.com