Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TechEd 2018, Introduction to Docker

TechEd 2018, Introduction to Docker

Ondrej Sika

May 17, 2018
Tweet

More Decks by Ondrej Sika

Other Decks in Programming

Transcript

  1. Introduction to Docker
    #TechEdDevCon
    Ondrej Sika
    [email protected]
    @ondrejsika
    TechEd,
    Prague, 17. 5. 2018

    View Slide

  2. Agenda
    - What is a Docker?
    - Usage
    - Containers
    - Images
    - Docker Registry
    - Composites
    - Swarm

    View Slide

  3. What is Docker?

    View Slide

  4. 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.

    View Slide

  5. Containers vs virtualization

    View Slide

  6. 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.

    View Slide

  7. 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.

    View Slide

  8. History of
    containers
    - 1979 - Chroot
    - 2000 - BSD Jails
    - 2001 - VServer
    - 2004 - Solaris Containers
    - 2005 - OpenVZ
    - 2006 - Process Containers
    - 2008 - LXC
    - 2013 - Docker

    View Slide

  9. Advantages - Performance
    - Management
    - Containers distribution

    View Slide

  10. Disadvantages - Security
    - One kernel / "Linux only"

    View Slide

  11. Usage
    - Almost everywhere
    - Development, Testing,
    Production
    - Better deployment process
    - Separates running applications

    View Slide

  12. Work with
    Cluster managements
    - Swarm (Native)
    - Open Stack
    - Kubernetes

    View Slide

  13. Installation

    View Slide

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

    View Slide

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

    View Slide

  16. Basic Usage

    View Slide

  17. 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..

    View Slide

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

    View Slide

  19. System wide info
    docker version # print version
    docker system info # system vide information
    docker system df # docker disk usage
    docker system prune # cleanup unused data

    View Slide

  20. Docker Images
    docker image ls # list all images
    docker image ls -q # quiet output, just IDs
    docker image rm # remove image
    docker image pull # pull from registry
    docker image push # push to registry
    docker tag image # add new tag

    View Slide

  21. Docker Run
    docker run []
    # Eg.:
    docker run hello-world
    docker run debian:8 cat /etc/os-release
    docker run debian:9 cat /etc/os-release
    docker run -ti debian

    View Slide

  22. 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
    --rm - remove container after stop

    View Slide

  23. Containers
    docker ps - list containers
    docker start
    docker stop
    docker restart
    docker logs # show STDOUT & STDERR
    docker rm # remove container

    View Slide

  24. List containers
    docker ps - list running containers
    docker ps -a - list all containers
    docker ps -a -q - list IDs of all containers
    # Eg.:
    docker rm -f $(docker ps -a -q)

    View Slide

  25. 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

    View Slide

  26. Docker Logs
    docker logs [-f]
    # Eg.:
    docker logs my-debian
    docker logs -f my-debian # following

    View Slide

  27. Docker Inspect
    Get lots of information about
    container in JSON.
    docker inspect

    View Slide

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

    View Slide

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

    View Slide

  30. Port Forwarding Docker can forward specific port
    from container to host

    View Slide

  31. Port forwarding
    docker run -p :
    # eg.:
    docker run -ti -p 8080:80 nginx

    View Slide

  32. Own Images

    View Slide

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

    View Slide

  34. 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

    View Slide

  35. 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

    View Slide

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

    View Slide

  37. .dockerignore
    # comment
    */temp*
    */*/temp*
    temp?

    View Slide

  38. Build Image from Dockerfile
    docker build -t
    docker build -f -t
    docker tag
    # eg.:
    docker build -t my-image .

    View Slide

  39. Example

    View Slide

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

    View Slide

  41. requirements.txt
    flask
    redis

    View Slide

  42. Dockerfile
    FROM python:3.6-alpine
    COPY requirements.txt /app/requirements.txt
    WORKDIR /app
    RUN pip install -r requirements.txt
    COPY . /app
    CMD python app.py

    View Slide

  43. https://github.com/ondrejsika/teched18

    View Slide

  44. Run
    docker build -t teched18 .
    docker run --name redis -d redis:alpine
    docker run -p 80:80 --link redis teched18

    View Slide

  45. Docker Registry

    View Slide

  46. 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.

    View Slide

  47. 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.

    View Slide

  48. 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

    View Slide

  49. Image name format
    # Official image from Docker Inc on Docker Hub
    debian
    # Image in user namespace on Docker Hub
    ondrejsika/debian
    # Image on own Docker Registry (reg.istry.cz)
    reg.istry.cz/debian

    View Slide

  50. Docker Compose

    View Slide

  51. 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.

    View Slide

  52. Install Docker Compose

    View Slide

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

    View Slide

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

    View Slide

  55. Example Compose File
    version: '3'
    services:
    counter:
    build: .
    image: reg.istry.cz/counter
    ports:
    - 80:80
    redis:
    image: redis:alpine

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  59. Image
    services:
    app:
    image: redis:alpine

    View Slide

  60. Port forwarding
    services:
    app:
    ports:
    - 8000:80

    View Slide

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

    View Slide

  62. Environment variables
    services:
    app:
    environment:
    RACK_ENV: development
    SHOW: 'true'
    SESSION_SECRET:
    services:
    app:
    environment:
    - RACK_ENV=development

    View Slide

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

    View Slide

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

    View Slide

  65. Create a Composite

    View Slide

  66. Create docker-compose.yml
    version: '3'
    services:
    app:
    build: .
    image: reg.istry.cz/teched18
    ports:
    - 80:80
    redis:
    image: redis:alpine

    View Slide

  67. Compose Commands

    View Slide

  68. Basic Compose Commands
    docker-compose config
    docker-compose help
    docker-compose ps
    docker-compose exec
    docker-compose version
    docker-compose logs [-f] []

    View Slide

  69. Build Compose
    docker-compose build
    docker-compose build --no-cache

    View Slide

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

    View Slide

  71. Compose Up Arguments
    -d - run as daemon
    --force-recreate - always create new cont.
    --build - build on every run
    --no-build - don't build, even images not
    exist
    --remove-orphans
    --abort-on-container-exit

    View Slide

  72. Manage Compose
    docker-compose start []
    docker-compose stop []
    docker-compose restart []
    docker-compose kill []

    View Slide

  73. Remove Compose
    docker-compose down
    # stop and remove compose

    View Slide

  74. Docker Swarm

    View Slide

  75. 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.

    View Slide

  76. Create a Swarm

    View Slide

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

    View Slide

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

    View Slide

  79. Manage Swarm

    View Slide

  80. 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

    View Slide

  81. Deploy to Swarm

    View Slide

  82. Build & Push
    # Build
    docker-compose build
    # Push
    docker-compose push

    View Slide

  83. Deploy App to Swarm
    # run
    docker stack deploy \
    --compose-file docker-compose.yml \
    teched18

    View Slide

  84. Test It!

    View Slide

  85. Manage Services
    docker stack ls
    docker stack services
    docker stack ps
    docker stack rm

    View Slide

  86. Scale the Service
    docker service scale =
    # Eg.:
    docker service scale teched18_app=5

    View Slide

  87. Test It!

    View Slide

  88. Thank you
    Ondrej Sika
    email: [email protected]
    twitter: @ondrejsika
    linkedin: /in/ondrejsika/
    slides: https://ondrej-sika.cz/blog/2018/teched

    View Slide