Slide 1

Slide 1 text

Docker Ondrej Sika [email protected], @ondrejsika CZ JUG Olomouc, Olomouc, 30. 11. 2017

Slide 2

Slide 2 text

https://sika.link/docker-17-11-30

Slide 3

Slide 3 text

Agenda - Why Docker - What is Docker - Why Docker - Where can use Docker - Features - Practise - Containers - Images - Composites - Swarm

Slide 4

Slide 4 text

Why Docker?

Slide 5

Slide 5 text

Why Docker? - Simplify development, testing, production and make it faster - Save time & money - Save resources - Run on every platform - Easy to use - Large (& growing) community - Open Source (Docker CE)

Slide 6

Slide 6 text

Where I can use Docker? - Development - Testing - Production - Distribution

Slide 7

Slide 7 text

Docker in Development - Quick setup - Requiremensts (DB, cache, …) - Defined environment - Platform independent

Slide 8

Slide 8 text

Docker in Testing - Deterministic tests & builds - CI ready (Gitlab CI, Travis CI) - Fast test setup & cleanup - Test exact same code and environment which 'll run in production

Slide 9

Slide 9 text

Docker in Production - Easy setup of host - only Docker needed - Simple deployment - Simple scaling - Native cluster (Swarm) - Works with - Kubernetes - Openstack - Amazon Container Registry

Slide 10

Slide 10 text

SW Distribution with Docker - Provide single image or composite - No client environment requirements (just Docker)

Slide 11

Slide 11 text

What is Docker?

Slide 12

Slide 12 text

What is Docker? Docker is an open-source project that automates the deployment of applications inside software containers. ... Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server.

Slide 13

Slide 13 text

Virtualization vs Containers

Slide 14

Slide 14 text

Virtualization A VM is an abstraction of physical hardware. Each VM has a full server hardware stack from virtualized BIOS to virtualized network adapters, storage, and CPU. That stack allows run any OS on your host but it takes some power.

Slide 15

Slide 15 text

Containers Containers are abstraction in linux kernel, just proces, memory, network, … namespaces. Containers run in same kernel as host - it is not possible use different OS or kernel version, but containers are much more faster than VMs.

Slide 16

Slide 16 text

Advantages - Performance - Management - Containers distribution

Slide 17

Slide 17 text

Disadvantages - Security - One kernel / "Linux only"

Slide 18

Slide 18 text

Image and Container An image is an inert, immutable, file that's essentially a snapshot of a container. Images are created with the build command, and they'll produce a container when started with run. Images are stored in a Docker registry..

Slide 19

Slide 19 text

Toolchain - Docker - Build & Run single container - Docker Registry - Store images - Docker Compose - Build & Run multi-container applications - Docker Swarm - Native cluster

Slide 20

Slide 20 text

Questions?

Slide 21

Slide 21 text

Use Docker!

Slide 22

Slide 22 text

Installation

Slide 23

Slide 23 text

https://docs.docker.com/engine/installation/

Slide 24

Slide 24 text

Test the installation docker run hello-world ... Hello from Docker! This message shows that your installation appears to be working correctly.

Slide 25

Slide 25 text

Basic Usage

Slide 26

Slide 26 text

Help docker docker help docker help # eg. docker help run, docker help help

Slide 27

Slide 27 text

Docker Images docker image ls # list all images docker image rm # remove image

Slide 28

Slide 28 text

Docker Run docker run # Eg.: docker run hello-world docker run debian date docker run -ti debian

Slide 29

Slide 29 text

Common Docker Run Params --name -d - run as daemon -ti - map TTY a STDIN (for bash eg.) -e = - set ENV variable -h - set hostname -u - run command by specific user

Slide 30

Slide 30 text

Containers docker ps # list containers docker start docker stop docker restart docker logs # show output docker rm # remove container

Slide 31

Slide 31 text

Docker Exec docker exec -d - run command as daemon -e = - set ENV variable -ti - map TTY a STDIN (for bash eg.) -u - run command by specific user # Eg.: docker exec my-debian ls

Slide 32

Slide 32 text

Docker Volumes Volumes are persistent data storage for containers. Volumes can be shared between containers and data are write directly to host.

Slide 33

Slide 33 text

Volumes docker run -ti -v /data debian docker run -ti -v my-volume:/data debian docker run -ti -v $(pwd)/my-data:/data debian

Slide 34

Slide 34 text

Port Forwarding Docker can forward specific port from container to host

Slide 35

Slide 35 text

Port forwarding docker run -ti -p 8080:80 nginx

Slide 36

Slide 36 text

Own Images

Slide 37

Slide 37 text

.dockerignore Ignore files for docker build process. Similar to .gitignore

Slide 38

Slide 38 text

.dockerignore .git .idea build/* # comment

Slide 39

Slide 39 text

Dockerfile Dockerfile is preferred way to create images. Dockerfile defines each layer of image by some command. To make image use command docker build

Slide 40

Slide 40 text

Dockerfile FROM - define base image MAINTAINER - set maintainers name & email RUN - run command and save as layer COPY - copy file or directory to image layer ADD - instead of copy, archives added by add are extracted

Slide 41

Slide 41 text

Dockerfile ENV - set ENV variable USER - switch user WORKDIR - change working directory VOLUME - define volume ENTRYPOINT - command, run on container starts CMD - parameters for entrypoint

Slide 42

Slide 42 text

Build Image from Dockerfile docker build -t docker build -f -t docker tag

Slide 43

Slide 43 text

Example

Slide 44

Slide 44 text

app.py from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis('redis') hostname = os.environ['HOSTNAME'] @app.route("/") def index(): counter = redis.incr('counter') return "%s %d\n" % (hostname, counter) if __name__ == "__main__": app.run(host='0.0.0.0', port='80')

Slide 45

Slide 45 text

requirements.txt flask redis

Slide 46

Slide 46 text

Dockerfile FROM python:2.7-alpine WORKDIR /app COPY requirements.txt /app/ RUN pip install -r requirements.txt COPY . /app EXPOSE 80 CMD ["python", "app.py"]

Slide 47

Slide 47 text

Build & Run docker run redis:alpine docker build -t counter . docker run -p 8000:80 --link redis counter

Slide 48

Slide 48 text

Docker Registry

Slide 49

Slide 49 text

What is Docker Registry? A service responsible for hosting and distributing images. The default registry is the Docker Hub. GitLab contains Docker Registry from version 8.

Slide 50

Slide 50 text

What is Docker Hub? Docker Hub is default public docker registry. You can host unlimited free images. Docker Hub is source of our base images.

Slide 51

Slide 51 text

Docker registry docker login - Login to Docker Registry docker logout - Logout from Docker Registry docker pull - download image from registry docker push - upload image to registry

Slide 52

Slide 52 text

Run own registry docker run -d -p 5000:5000 \ --restart=always --name registry \ registry:2 More at: https://docs.docker.com/registry/deploying/

Slide 53

Slide 53 text

Docker Compose

Slide 54

Slide 54 text

What is Docker Compose? Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a Compose file to configure your application's services.

Slide 55

Slide 55 text

Install Docker Compose

Slide 56

Slide 56 text

https://docs.docker.com/compose/install/ https://docs.docker.com/compose/completion/

Slide 57

Slide 57 text

Compose File A docker-compose.yml file is a YAML file that defines how Docker containers should behave in production.

Slide 58

Slide 58 text

Example Compose File version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"

Slide 59

Slide 59 text

https://docs.docker.com/compose/compose-file/

Slide 60

Slide 60 text

Service Service is a container running and managed by Docker Compose.

Slide 61

Slide 61 text

Build services: app: build: . services: app: build: context: ./app dockerfile: Dockerfile-prod image: myapp

Slide 62

Slide 62 text

Image services: app: image: redis:alpine

Slide 63

Slide 63 text

Expose & Port forwarding services: app: expose: - 80 - 3333 ports: - 8000:80

Slide 64

Slide 64 text

Volumes services: app: volumes: - /data1 - data:/data2 - ./data:/data3

Slide 65

Slide 65 text

Command, Entrypoint services: app: entrypoint: 'python app.py' command: '80' services: app: entrypoint: ["python", "app.py"] command: ["80"]

Slide 66

Slide 66 text

Deploy services: app: deploy: placement: constraints: [node.role == manager] services: app: deploy: mode: replicated replicas: 4

Slide 67

Slide 67 text

Compose Commands

Slide 68

Slide 68 text

Run Compose docker-compose up docker-compose up -d # Missing images will be downloaded or builded

Slide 69

Slide 69 text

Manage Compose docker-compose logs [-f] [] docker-compose start [] docker-compose stop [] docker-compose restart [] docker-compose kill []

Slide 70

Slide 70 text

Remove Compose docker-compose down # stop and remove compose

Slide 71

Slide 71 text

Example

Slide 72

Slide 72 text

docker-compose.yml version: '3' services: counter: build: . image: counter ports: - 8000:80 redis: image: redis:alpine

Slide 73

Slide 73 text

Build & Run docker-compose up

Slide 74

Slide 74 text

Docker Swarm

Slide 75

Slide 75 text

What is Docker Swarm? A native clustering system for Docker. It turns a pool of Docker hosts into a single, virtual host using an API proxy system. It is Docker's first container orchestration project that began in 2014. Combined with Docker Compose, it's a very convenient tool to manage containers.

Slide 76

Slide 76 text

Create a Swarm

Slide 77

Slide 77 text

Initialize Swarm docker swarm init --advertise-addr # Eg.: docker swarm init --advertise-addr 192.168.99.100

Slide 78

Slide 78 text

Add Worker to Swarm docker swarm join --token :2377 # Eg.: docker swarm join \ --token SWMTKN-1-49nj1cmql0...acrr2e7c \ 192.168.99.100:2377

Slide 79

Slide 79 text

Manage Swarm

Slide 80

Slide 80 text

Manage Swarm Nodes docker node ls - list nodes docker node rm - remove node from swarm docker node inspect docker node ps []- list swarm task docker node update ARGS

Slide 81

Slide 81 text

Docker Swarm New Way

Slide 82

Slide 82 text

Enable experimental mode # Run on all docker hosts sudo sh -c "echo '{\"experimental\": true}' > /etc/docker/daemon.json" sudo /etc/init.d/docker restart

Slide 83

Slide 83 text

Update docker-compose.yml version: '3' services: counter: build: . image: reg.istry.cz/counter ports: - 8000:80 redis: image: redis:alpine

Slide 84

Slide 84 text

Deploy App to Swarm # build docker-compose build # push to registry (reg.istry.cz) docker-compose push # deploy docker deploy --compose-file docker-compose.yml app

Slide 85

Slide 85 text

Test App # on host run curl `docker-machine ip manager` curl `docker-machine ip worker1`

Slide 86

Slide 86 text

Want more...

Slide 87

Slide 87 text

skoleni-docker.cz

Slide 88

Slide 88 text

skoleni-docker.cz I do: - inhouse training - open courses for individuals - i can do the course in Olomouc, if there 'll be demand Pristi termin workshopu: - 29. - 30. 1. 2018

Slide 89

Slide 89 text

Thank you & Questions Ondrej Sika email: [email protected] twitter: @ondrejsika linkedin: /in/ondrejsika/ https://sika.link/docker-17-11-30 (slides & code) https://skoleni-docker.cz