real virtual environments without virtualenv

101
Real virtual environments without virtualenv Mihai Iachimovschi @mishunika [email protected]

Upload: mihai-iachimovschi

Post on 13-Apr-2017

136 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Real virtual environments without virtualenv

Real virtual environments without virtualenv

Mihai Iachimovschi

@mishunika [email protected]

Page 2: Real virtual environments without virtualenv

What’s inside?

Page 3: Real virtual environments without virtualenv

What’s inside?

– Consistency

Page 4: Real virtual environments without virtualenv

What’s inside?

– Consistency

– Diversity

Page 5: Real virtual environments without virtualenv

What’s inside?

– Consistency

– Diversity

– Isolation

Page 6: Real virtual environments without virtualenv

Building the dev env

Installing dependencies

- pip

- or the OS packaging tool

- or even easy_install?

Page 7: Real virtual environments without virtualenv

Building the dev env (cont)How?

- everything globally

- or inside a virtualenv

- or using conda

- Vagrant!?

Page 8: Real virtual environments without virtualenv

Deploying

Page 9: Real virtual environments without virtualenv

Deploying

Where?

Page 10: Real virtual environments without virtualenv

Deploying

Where?

- PaaS

Page 11: Real virtual environments without virtualenv

Deploying

Where?

- PaaS

- IaaS

Page 12: Real virtual environments without virtualenv

Deploying

Where?

- PaaS

- IaaS

- your own server

Page 13: Real virtual environments without virtualenv

Virtualenvs

venv Bvenv A

App A App B

shared system libraries and packages

OS Kernel

vevn C

App C

venv N

App N

Page 14: Real virtual environments without virtualenv

When something breaks…

Page 15: Real virtual environments without virtualenv

Imagine…

Page 16: Real virtual environments without virtualenv

Pack it!

Let’s see how we can containerize it.

Page 17: Real virtual environments without virtualenv

Docker

Page 18: Real virtual environments without virtualenv

“Container? It’s a VM!”

Page 19: Real virtual environments without virtualenv

“Container? It’s a VM!”

It’s not!

Page 20: Real virtual environments without virtualenv

“Container? It’s a VM!”

It’s not!

It’s just a process

Page 21: Real virtual environments without virtualenv

“Container? It’s a VM!”

It’s not!

It’s just a process

It shares the system kernel

Page 22: Real virtual environments without virtualenv

“Container? It’s a VM!”

It’s not!

It’s just a process

It shares the system kernel

It is running in it’s own namespace

Page 23: Real virtual environments without virtualenv

Containers

shared system libraries and packages

OS Kernel

Docker Engine

Page 24: Real virtual environments without virtualenv

Container anatomy

Page 25: Real virtual environments without virtualenv

Container anatomy (cont.)

Page 26: Real virtual environments without virtualenv

Container anatomy (cont.)

cgroups

Page 27: Real virtual environments without virtualenv

Container anatomy (cont.)

cgroups

namespaces

Page 28: Real virtual environments without virtualenv

What’s inside?

– System dependencies

– Separate libs & bins

– Limited endpoints

Page 29: Real virtual environments without virtualenv

Docker images

Page 30: Real virtual environments without virtualenv

Docker images

Self contained

Page 31: Real virtual environments without virtualenv

Docker images

Self contained

Isolated

Page 32: Real virtual environments without virtualenv

Docker images

Self contained

Isolated

Immutable

Page 33: Real virtual environments without virtualenv

Docker images

Self contained

Isolated

Immutable

Portable

Page 34: Real virtual environments without virtualenv

Docker containers

Isolated process

Disposable

Running over the image FS layers (AUFS)

Page 35: Real virtual environments without virtualenv

AUFS

image: docker.org

Page 36: Real virtual environments without virtualenv

Stacking = cumulative

How do we delete files?

Not re-writing them.

Page 37: Real virtual environments without virtualenv

How we delete?

image: docker.org

Page 38: Real virtual environments without virtualenv

Stacking = cumulativeHow do we delete files?

Not re-writing them.

Beware!

It is still cumulative,it’ll increase the size of the final image.

Page 39: Real virtual environments without virtualenv

“My data is not readonly!”

Page 40: Real virtual environments without virtualenv

“My data is not readonly!”

How to handle the actual app data?

Page 41: Real virtual environments without virtualenv

“My data is not readonly!”

How to handle the actual app data?

Volumes: Saving the state!

Page 42: Real virtual environments without virtualenv

Building images

Page 43: Real virtual environments without virtualenv

Building images

– Raw product (source code)

Page 44: Real virtual environments without virtualenv

Building images

– Raw product (source code)

– Cooking recipe (Dockerfile)

Page 45: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 46: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 47: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 48: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 49: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 50: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 51: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 52: Real virtual environments without virtualenv

Dockerfile

FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN mkdir /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/

Page 53: Real virtual environments without virtualenv

We’ll go through

– Building

– Running

– Gathering logs

– Sneaking into a container

Page 54: Real virtual environments without virtualenv

Build

docker build —t mihai/django-app .

Page 55: Real virtual environments without virtualenv

Build

docker build —t mihai/django-app .

Page 56: Real virtual environments without virtualenv

Build

docker build —t mihai/django-app .

Page 57: Real virtual environments without virtualenv

Build

docker build —t mihai/django-app .

Page 58: Real virtual environments without virtualenv

Build

docker build —t mihai/django-app .

Page 59: Real virtual environments without virtualenv

Run

docker run --publish 8000:8000 \ mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 60: Real virtual environments without virtualenv

Run

docker run --publish 8000:8000 \ mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 61: Real virtual environments without virtualenv

Run

docker run --publish 8000:8000 \ mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 62: Real virtual environments without virtualenv

Run

docker run --publish 8000:8000 \ mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 63: Real virtual environments without virtualenv

Run

docker run --publish 8000:8000 \ mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 64: Real virtual environments without virtualenv

Run

docker run --publish 8000:8000 \ mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 65: Real virtual environments without virtualenv

Run (detached)

docker run --publish 8000:8000 \ --detach --name my_django_app mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 66: Real virtual environments without virtualenv

Run (detached)

docker run --publish 8000:8000 \ --detach --name my_django_app mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 67: Real virtual environments without virtualenv

Run (detached)

docker run --publish 8000:8000 \ --detach --name my_django_app mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 68: Real virtual environments without virtualenv

Run (detached)

docker run --publish 8000:8000 \ --detach --name my_django_app mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 69: Real virtual environments without virtualenv

Run +volumesdocker run --publish 8000:8000 \ --detach --name my_django_app --volume $(pwd):/code mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 70: Real virtual environments without virtualenv

Run +volumesdocker run --publish 8000:8000 \ --detach --name my_django_app --volume $(pwd):/code mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 71: Real virtual environments without virtualenv

Run +volumesdocker run --publish 8000:8000 \ --detach --name my_django_app --volume $(pwd):/code mihai/django-app \ python manage.py \ runserver 0.0.0.0:8000

Page 72: Real virtual environments without virtualenv

Gather logs

docker logs -f my_django_app

Page 73: Real virtual environments without virtualenv

Gather logs

docker logs -f my_django_app

Page 74: Real virtual environments without virtualenv

Gather logs

docker logs -f my_django_app

Page 75: Real virtual environments without virtualenv

Gather logs

docker logs -f my_django_app

Page 76: Real virtual environments without virtualenv

Gather logs

docker logs -f my_django_app

Page 77: Real virtual environments without virtualenv

Get inside the container

docker exec -it my_django_app sh

Page 78: Real virtual environments without virtualenv

Get inside the container

docker exec -it my_django_app sh

Page 79: Real virtual environments without virtualenv

Get inside the container

docker exec -it my_django_app sh

Page 80: Real virtual environments without virtualenv

Get inside the container

docker exec -it my_django_app sh

Page 81: Real virtual environments without virtualenv

Get inside the container

docker exec -it my_django_app sh

Page 82: Real virtual environments without virtualenv

Get inside the container

docker exec -it my_django_app sh

Page 83: Real virtual environments without virtualenv

So now we have it

Isolated

Has its dependencies bundled

It’s disposable

Page 84: Real virtual environments without virtualenv

But that’s not enough

Page 85: Real virtual environments without virtualenv

But that’s not enough

Page 86: Real virtual environments without virtualenv

But that’s not enough

How about external dependencies?

Page 87: Real virtual environments without virtualenv

But that’s not enough

How about external dependencies?

How about creating a full prod-like environment?

Page 88: Real virtual environments without virtualenv

But that’s not enough

How about external dependencies?

How about creating a full prod-like environment?

No problem!We just need more containers…

Page 89: Real virtual environments without virtualenv

Stack them, it’s easy!

Page 90: Real virtual environments without virtualenv

Orchestration

Page 91: Real virtual environments without virtualenv

docker-compose.ymlversion: '2' services: db: image: postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db

Page 92: Real virtual environments without virtualenv

Run

docker-compose up

Page 93: Real virtual environments without virtualenv

extended compose yml

common.yml

docker-compose-prod.yml docker-compose-dev.yml

Page 94: Real virtual environments without virtualenv

Production composeversion: '2' services: ... web: extends: file: common.yml service: web command: uwsgi --ini uwsgi.ini depends_on: - db - nginx

Page 95: Real virtual environments without virtualenv

Production?

– Service discovery (Orchestration)

– Secrets

– Logging

Page 96: Real virtual environments without virtualenv

Service discovery– Compose

– Swarm

– Consul

– etcd

– ZooKeeper

Page 97: Real virtual environments without virtualenv

Secrets– env vars

– volumes with secrets

– docker-vault

– keywhiz

NB: Kubernetes has it built in

Page 98: Real virtual environments without virtualenv

Logging– stderr

– syslog

– journald

– json

– other custom logging drivers

Page 99: Real virtual environments without virtualenv

Docker for Mac & Windows

– Mac: xhyve

– Win: Hyper-V

Page 100: Real virtual environments without virtualenv

Summing up!Environments:

– uniform (dev, prod)

– self-contained

– properly isolated

– immutable.

Page 101: Real virtual environments without virtualenv

Fin.

Thank you.