Introduction to VMs & Containers - GitHub...

45
Introduction to VMs & Containers This Document: http://arnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf Lesson iut.univ-paris8.fr 2018-05 [email protected]

Transcript of Introduction to VMs & Containers - GitHub...

Page 1: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Introduction to VMs & Containers

This Document: http://arnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf

Lesson iut.univ-paris8.fr 2018-05

[email protected]

Page 2: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Hardware→ Software

Page 3: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

"All problems in computer science can be solved by another level of indirection"

(the "fundamental theorem of software engineering")

David Wheeler

Page 4: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Hardware→ Assembly Langage

→ Compiler & Langages →Shared Libraries

→Frameworks

Page 5: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Problem 1 To Solve :Libraries Dependencies Hell

Think “Windows” … to understand “Dll Dependency Hell”

Think “Debian” … to upgrade Xserver driver

Think “NPM” / “NodeJS” …package.json node_modules and versionning

Page 6: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Example: Npm modules hell

Page 7: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Problem 2 To Solve : Configuration

Conflicts / Reuse Component

Think “/etc/<app>.conf.d” … to understand “Configuration” for “<app>”

OK

foofoo.conf

barbar.conf

foo-4foo-4.conffoo-3

foo-3.conffoo-2foo-2.conffoo-1

foo-1.conf

How to have multiple instances ?? <app.1>, <app.2> … , <app.N>

KO !

Isolateshared / specific

part?

Page 8: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Problem 3 : VersionningMultiple Versions Co-Existing

Page 9: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Problem 4 : Resource Sharing

Page 10: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Hardware→ OS

→Virtual Machine →Containers

→Orchestrators

Page 11: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Problem 5 : Resource Scheduling

Page 12: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Virtualisation – Containers History

2007KVM

VirtualBox( Innotek→ Sun 2008→ Oracle 2010)

2003QemuXen

https://en.wikipedia.org/wiki/Timeline_of_virtualization_development

2005Intel VT-x

2013Docker releasedDotCloud renamed Docker Inc

2016Docker on Windows

2010dotCloudcompanycreated bySolomon Hykes

2008LXC

2018Solomon quits Docker.. what’s next?

Page 13: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Qemu – KVM – VirtualBox ...

Page 14: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

LibVirt ...

Page 15: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Lightweight Containers ↔ Virtual Machines

https://docs.docker.com/get-started/#containers-and-virtual-machines

VMsContainers

Page 16: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Docker : Linux ContainerThen Windows & Mac

Page 17: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Docker – Libcontainer

Page 18: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Libcontainer, Open Container

Page 19: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

https://containerd.io/

Page 20: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Other Container Technologies..

https://coreos.com/rkt/

Page 21: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Linux Isolations primitives for Containers

Page 22: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

FileSystem

Page 23: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

FileSystem : Class / Design-Pattern Interpretation

Facade, Delegate design-pattern : all System I/O goes to a facade API

File

RegularFile Dir

FileSystem

Page 24: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

ChRoot

Page 25: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

ChRoot – Class/Pattern Interpretation

File

RegularFile Dir

MountDir

FileSystem

Process (Context)

1 rootDir= “/”

Object Instance Diagram : forking a ch-rooted process

CtxParent1 : Process (Context)

MountDir: “/”

ChildCtx2 : Process (Context)

MountDir: seen as “/” for process 2… correspond to “/a/b/chroot-dir”

Dir: “/a/b/chroot-dir”

Can not reach parent dir seen as “/..”for “/a/b”

Page 26: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

ChRoot – Object Diagram for ch-rooted child process

CtxParent1 : Process (Context)

MountDir: “/”

ChildCtx2 : Process (Context)

MountDir: seen as “/” for process 2

Dir: “/a/b/chroot-dir”

Can not reach parent dir seen as “/..”for “/a/b” … JAILS

“/” for process2… correspond to “/a/b/chroot-dir”

Page 27: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Mount

Page 28: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Mount : Class / Design-Pattern Interpretation

Adapter design-pattern : adapt a Dir sub-class to delegate to FileSystem MountDir → FileSystem

File

RegularFile Dir

MountDir

FileSystem

Page 29: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

“Mount“ usage in Docker : Volumes

Example:$ docker run -v /data:/redis-1/data --name redis-1 redis:latest

Page 30: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

UnionFS, AuFS

Example:$ mkdir /tmp/rw && mkdir /tmp/aus& sudo mount -t aufs -o br=/tmp/rw=rw:/home/user=ro none /tmp/aus/

… will show in “/tmp/aus” the union of “/tmp/rw” and “/home/user” (kept as read-only)

Page 31: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

UnionFS, AuFs

Diff

Base

VirtualUnionFS

Read-Only base filesystem

Read-Write overriden filesystemWrite only Diffs(Copy-On-Write from Base filesystem)

Example: Live linux distribution for test (no persistent files), on Boot USB disk

If founddiff override

Else NOTfound

Page 32: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

UnionFS : Class / Design Pattern

Decorator design-pattern ? Example: 1 layer Read-Write / Above 1 layer Read-Only decorate Read-Write over a Read-Only

Delegate / Chain-Of-Responsibility design-pattern ? Example: multiple layers … when match pattern, then delegate else bubbles up

File

Dir

MountDir

FileSystem

UnionFileSystemUnionMountDir

UnionFSLayer

* layers

Page 33: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

UnionFS usage in Docker : Image Layers Stack (Dockerfile)

FROM debian:latest

RUN apt-get install tomcat

RUN apt-get install apache

Dockerfile

$ docker build -t my-image .

Page 34: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Loopback Device, Losetup

Page 35: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Loopback – Class / Design Pattern

Adapter design-pattern : DeviceFile → File

Class Diagram:

File

RegularFile DeviceFile

Loopback

Driver

LoopbackDriver

Page 36: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Namespaces (UTS, PIDs, ..)

NamedResource Namespace

1

* [name]

Name Translation Table

1 : rightNs1 : leftNs

Name Translation Entry

LeftNamerightName

0..1 0..1 11

*

Example of Namespaces in Linux: PIDs, Hostnames, ...

Page 37: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Reminder on TCP-IPSocket, Packet (IP:Port→IP:Port)

Notice: can have Host1=Host2, IP1=IP2, ...

Level 7Process1

Level 7Process2

Level 0 : eth0… Arp=Arp1

Level 1 : IP eth0… IP=IP1

Level 3 : TCP socket Port=Port1

Level 0 : eth0… Arp=Arp1

Level 1 : IP eth0… IP=IP1

Level 3 : TCP socket Port=Port1

Electric/Fiberconnection

Receive/send packets

Socket streamReceive/send data

IP-Src,IP-Dest,Port-Src,Port-Dest,len,data...

IP Packet format:

IP-Src,IP-Dest,Port-Src,Port-Dest,tcpNum,tcpAck,tcpWindow,...len,data

Page 38: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

NAT : Network Address Translation

IP-Src,IP-Dest1,Port-Src,Port-Dest1 ..

Process1

NATTranslater

IP-Src,IP-Dest-NAT,Port-Src,Port-Dest-NAT ..

Process1

IP-SrcPort-Src

IP-Dest-NATPort-Dest-NAT

Page 39: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Example: Docker Port Export

$ docker run -p 4001:6379 --name redis-1 redis:latest

Container: redis-1(host: a23bc6d1, IP:..)

6379

Container: redis-2(host: b6c9aff2, IP:..)

6379

Docker ContainerD (VETH0 Bridge..)

Linux OS (Localhost)

$ docker run -p 4002:6379 --name redis-2 redis:latest

4001

4002

Container: redis-1(host: a23bc6d1, IP:..)docker-proxy

Page 40: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

.. Docker -p <extport>:<intport>

Check connecting manually (telnet)to redis on 4001 … not on 6379 !!

execute redis commands

It works ..

Page 41: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Result Linux processes ..

Page 42: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Idem NAT … Level 7: Http Reverse Proxy

Http Request1 <dest>HTTP POST /url

headers k=vBody {json..}

Process1

HttpReverse

ProxyHttp Server

Http Request2 <dest-new>HTTP POST /url-new

headers k=v-newBody {json-new..}

Http Response 200headers k=vBody {json..}Http Response 200

headers k=v-newBody {json-new..}

Page 43: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

DNS : Host to IP resolver

Page 44: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Ingress Networks..(= Http Reverse Proxy + DNS + ..)

Page 45: Introduction to VMs & Containers - GitHub Pagesarnaud-nauwynck.github.io/docs/Intro-VM-Container.pdf · Example: Docker Port Export $ docker run -p 4001:6379 --name redis-1 redis:latest

Next Chapter 2/3 : Docker

Next Chapter 3/3 : Kubernetes Orchestration