Top Banner
31

Docker 101, Alexander Ryabtsev

Jul 15, 2015

Download

Internet

Tetiana Saputo
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Docker 101, Alexander Ryabtsev
Page 2: Docker 101, Alexander Ryabtsev

Alexander Ryabtsev

http://djangostars.com/

Page 3: Docker 101, Alexander Ryabtsev
Page 4: Docker 101, Alexander Ryabtsev

Why do we need this?

Complex systems development

Deploying on test/prod. servers, developer machines

Different target OS

Different software versions

Etc

Page 5: Docker 101, Alexander Ryabtsev

Virtualization

HARDWARE

HOST OS

HYPERVISOR

GUEST OS 1 GUEST OS 2 GUEST OS N

LIBRARIES LIBRARIES LIBRARIES

APP 1 APP 2 APP N

Page 6: Docker 101, Alexander Ryabtsev

Containerization

HARDWARE

HOST OS

CONTAINERIZTION ENGINE

X X X

LIBRARIES LIBRARIES LIBRARIES

APP 1 APP 2 APP N

Page 7: Docker 101, Alexander Ryabtsev

DOCKER

HARDWARE

HOST OS

DOCKER

LIBRARIES LIBRARIES LIBRARIES

APP 1 APP 2 APP N

Page 8: Docker 101, Alexander Ryabtsev

What is Docker?

Open-source engine that automates the deployment of applications into containers developed by Docker Inc

Based on: libcontainer - container formatnamespaces - isolationcgroups - sharingunionfs - layering

Page 9: Docker 101, Alexander Ryabtsev

Platforms Linux Windows (over boot2docker) MacOS (over boot2docker) Cloud platforms

− Amazon EC2− Rackspace Cloud− Google Compute Engine− etc

Page 10: Docker 101, Alexander Ryabtsev

Requirements Linux kernel with cgroups and namespaces features x86_64 & amd64 only appropriate storage driver

− dev mapper− AUFS− vfs− btrfs

Page 11: Docker 101, Alexander Ryabtsev

Hello world

sudo docker run -i -t ubuntu /bin/bash sudo - you have to run all docker commands as

root run - start container -i - keeps STDIN open -t - assign pseudo-TTY ubuntu - image /bin/bash - command (CMD)

Page 12: Docker 101, Alexander Ryabtsev

Some commands

run ps inspect pause / unpause start / stop / restart kill

Page 13: Docker 101, Alexander Ryabtsev

Architecture

Image Container Registry

Page 14: Docker 101, Alexander Ryabtsev

Images & Containers

write CONTAINER GOES HERE

read only curl example.com 701e38299831

read only ... 5171cea75fa4

read only apt-get install curl cc0f88ebb125

read only apt-get update b9474e097082

read only base image 447ff49a67a0

Page 15: Docker 101, Alexander Ryabtsev

Life cycle

Image: build

− do some action− create intermediate image

create a container remove

Container:

start

mount volumes

expose ports

run service

remove

Page 16: Docker 101, Alexander Ryabtsev

Registryhttps://registry.hub.docker.com/

Official repos User repos

Public repos Private repos

Page 17: Docker 101, Alexander Ryabtsev

Dockerfile FROM RUN COPY / ADD ENV EXPOSE VOLUME ENTRYPOINT / CMD

Page 18: Docker 101, Alexander Ryabtsev

Best practices Include only necessary context Use a .dockerignore file Avoid installing unnecessary packages Use cache Be care with volumes Use environment varaibles (in RUN, EXPOSE, VOLUME)

Page 19: Docker 101, Alexander Ryabtsev

HTTP-server example

NGINX

80/TCP

data

Page 20: Docker 101, Alexander Ryabtsev

HTTP-server: Dockerfile

FROM ubuntu:latest

RUN apt-get update

RUN apt-get install -y nginx

RUN ln -sf /dev/stdout /var/log/nginx/access.log

RUN ln -sf /dev/stderr /var/log/nginx/error.log

VOLUME ["/usr/share/nginx/html"]

EXPOSE 80/tcp

CMD ["nginx", "-g", "daemon off;"]

Page 21: Docker 101, Alexander Ryabtsev

HTTP-server: Commandssudo docker build --tag='nginx' .

sudo docker run -p 8080:80 --rm nginx

sudo docker run

-p 8080:80

-v ~/docker_demo/nginx/html:/usr/share/nginx/html--rmnginx

Page 22: Docker 101, Alexander Ryabtsev

APP-server example

Application

5000/TCP 6379/TCP

Redis

SRC

Page 23: Docker 101, Alexander Ryabtsev

HTTP + APP examplefrom flask import Flaskfrom redis import Redisimport osapp = Flask(__name__)redis = Redis(host='redis', port=6379)

@app.route('/')def hello(): redis.incr('hits') return 'Hello World! I have been seen %s times.' % redis.get('hits')

if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)

FROM python:2.7

ADD . /code

WORKDIR /code

EXPOSE 5000/tcp

RUN pip install -r requirements.txt

Page 24: Docker 101, Alexander Ryabtsev

--link parametersudo docker build --tag='app' .

sudo docker run -d --name redis redis

sudo docker run -d -p 5000:5000 --name app --link redis:redis app python app.py

Page 25: Docker 101, Alexander Ryabtsev

docker up (fig)web: build: . command: python app.py ports: - "5000:5000" volumes: - .:/code links: - redisredis: image: redis

Page 26: Docker 101, Alexander Ryabtsev

Orchestration tools

Fig / Docker Compose Mesosphere / Marathon Kubernetes / Mesos etc

Page 27: Docker 101, Alexander Ryabtsev

Docker true way 1 application = 1 container Run process in foreground Keep data out of container No SSH No manual configurations (or actions) inside container

Page 28: Docker 101, Alexander Ryabtsev

Harsh reality supervisor docker exec nsenter (from util-linux) hard links Docker ambassador

Page 29: Docker 101, Alexander Ryabtsev

3rd party apps CoreOS, Fleet Docker Swarm Docker Machine Panamax etc

Page 30: Docker 101, Alexander Ryabtsev

Usefull docs Official documentation https://docs.docker.com/

Docker blog http://blog.docker.com/

Docker Hub https://registry.hub.docker.com/

The Docker Book

Page 31: Docker 101, Alexander Ryabtsev

Thank you for your attention!