$30 off During Our Annual Pro Sale. View Details »

LaraconEU 2018 - Kickass Development Environments with Docker

LaraconEU 2018 - Kickass Development Environments with Docker

David McKay

August 30, 2018
Tweet

More Decks by David McKay

Other Decks in Technology

Transcript

  1. Hello,
    LaraconEU
    2018

    View Slide

  2. @rawkode
    @[email protected]
    Organiser of Things
    ◍ Cloud Native Glasgow
    ◍ DevOps Glasgow
    ◍ MongoDB Glasgow
    ◍ PairProg Glasgow
    Software & Site Reliability
    ◍ Elixir / Rust / Go / Pony
    ◍ Docker / CI / CD
    ◍ DevOps / SaltStack
    ◍ Event-Driven Systems
    ◍ CQRS / ES

    View Slide

  3. Kickass Development
    Environments
    with Docker

    View Slide

  4. Let us travel through time ...

    View Slide

  5. My Development Environment
    Circa 2000
    $ tree
    awesome-million-pound-project
    └── src
    ├── game.php
    ├── game.php.bk-david
    ├── game.php.bk-deano
    ├── main.php
    ├── main.php.maybe-fixed
    ├── main.php.bk-1999-12-02
    ├── main.php.bk-1999-12-02.2
    ├── player.php
    ├── player.php.orig
    └── .swp.player.php

    View Slide

  6. My Development Production Environment
    Circa 2000
    $ tree
    awesome-million-pound-project
    └── src
    ├── game.php
    ├── game.php.bk-david
    ├── game.php.bk-deano
    ├── main.php
    ├── main.php.maybe-fixed
    ├── main.php.bk-1999-12-02
    ├── main.php.bk-1999-12-02.2
    ├── player.php
    ├── player.php.orig
    └── .swp.player.php

    View Slide

  7. Things eventually got better ...

    View Slide

  8. View Slide

  9. View Slide

  10. Dev / Prod Parity

    View Slide

  11. Eurgh, DSL Hell

    View Slide

  12. View Slide

  13. Problems with Vagrant
    Slow to provision
    RAM intensive
    Really, development only
    Requires a CM tool

    View Slide

  14. How long does your vagrant up take?

    View Slide

  15. View Slide


  16. Docker allows you to package an
    application with all of its dependencies into
    a standardized unit for software
    development.

    View Slide

  17. Docker
    ◍ Image Builder
    ◍ Image Delivery
    ◍ Virtualisation
    ◍ Orchestration (Dev)
    ➢ docker image build
    ➢ docker image push/ll
    ➢ docker container run
    ➢ docker-compose
    Build. Ship. Run.

    View Slide

  18. Image Building
    Introducing the Dockerfile

    View Slide

  19. (Simplified) Dockerfile for PHP
    FROM ubuntu:18.04
    RUN apt install -y php-cli
    COPY hello.php /code
    WORKDIR /code
    ENTRYPOINT [“php”]
    CMD [“-v”]

    View Slide

  20. (Simplified) Dockerfile for PHP
    FROM ubuntu:18.04
    RUN apt install -y php-cli
    COPY hello.php /code
    WORKDIR /code
    ENTRYPOINT [“php”]
    CMD [“-v”]

    View Slide

  21. (Simplified) Dockerfile for PHP
    FROM ubuntu:18.04
    RUN apt install -y php-cli
    COPY hello.php /code
    WORKDIR /code
    ENTRYPOINT [“php”]
    CMD [“-v”]

    View Slide

  22. (Simplified) Dockerfile for PHP
    FROM ubuntu:18.04
    RUN apt install -y php-cli
    COPY hello.php /code
    WORKDIR /code
    # PLEASE DON’T DO RUN cd /code

    View Slide

  23. (Simplified) Dockerfile for PHP
    FROM ubuntu:18.04
    RUN apt install -y php-cli
    COPY hello.php /code
    WORKDIR /code
    ENTRYPOINT [“php”]
    CMD [“-v”]

    View Slide

  24. View Slide

  25. ENTRYPOINT & CMD
    Explained in 20 seconds

    View Slide

  26. ENTRYPOINT and CMD Explained in 17 seconds ...
    CMD [“echo”, “Hello”]
    in a Dockerfile
    docker run my-image
    ==
    $ Hello

    View Slide

  27. ENTRYPOINT and CMD Explained in 13 seconds ...
    CMD [“echo”, “Hello”]
    in a Dockerfile
    docker run my-image echo Goodbye
    ==
    $ Goodbye

    View Slide

  28. ENTRYPOINT and CMD Explained in 10 seconds ...
    ENTRYPOINT [“echo”]
    CMD [“Hello”]
    in a Dockerfile
    docker run my-image
    ==
    $ Hello

    View Slide

  29. ENTRYPOINT and CMD Explained in 7 seconds ...
    ENTRYPOINT [“echo”]
    CMD [“Hello”]
    in a Dockerfile
    docker run --entrypoint=”echo” my-image Woop!
    ==
    $ Woop!

    View Slide

  30. ENTRYPOINT and CMD Explained in 4 seconds ...
    ENTRYPOINT [“echo”]
    CMD [“Hello”]
    in a Dockerfile
    docker run --entrypoint=”echo” my-image
    ==
    $

    View Slide

  31. View Slide

  32. Docker
    ◍ Image Builder
    ◍ Image Delivery
    ◍ Virtualisation
    ◍ Orchestration (Dev)
    ➔ docker image build
    ➔ docker image push/ll
    ➔ docker container run
    ➔ docker-compose

    View Slide

  33. Image Delivery
    &
    Virtualisation
    Running Docker Images as Containers

    View Slide

  34. Demo

    View Slide

  35. Docker
    ◍ Image Builder
    ◍ Image Delivery
    ◍ Virtualisation
    ◍ Orchestration (Dev)
    ➔ docker build
    ➔ docker push / pull
    ➔ docker run
    ➔ docker-compose

    View Slide

  36. Orchestration (Dev)
    Composing Services

    View Slide

  37. Your Super Application

    View Slide

  38. Your Super Application

    View Slide

  39. Docker Compose

    View Slide

  40. Docker for Local Development
    4 Easy Steps. I’ll discuss 3.
    1. Satisfy Dependencies
    2. Introduce Docker for CI
    3. Adopt Docker Shell Pattern
    4. 12-Factor (Catch Alex’s talk on YouTube)

    View Slide

  41. Satisfy Dependencies
    PostgreSQL, Redis, Elasticsearch, et al.

    View Slide

  42. docker-compose.yml
    services:
    database:
    image: mariadb:10.1
    environment:
    MYSQL_USER: rawkode
    MYSQL_PASSWORD: *******
    MYSQL_DATABASE: my-awesome-app

    View Slide

  43. docker-compose.yml
    version: “2.4”

    View Slide

  44. docker-compose.yml
    version: “2.4”
    services:
    php:
    image: php:7
    ports:
    - 80:80
    volumes:
    - .:/code:cached
    tmpfs:
    - /code/var/logs
    - /code/var/cache

    View Slide

  45. docker-compose.yml
    version: “2.4”
    services:
    php:
    image: php:7

    database:
    image: mariadb:10.1
    environment:
    MYSQL_USERNAME: rawkode
    MYSQL_PASSWORD: *******

    View Slide

  46. docker-compose.yml
    version: “2.4”
    services:
    php:
    image: php:7
    healthcheck:
    test: nc -z localhost 80
    depends_on:
    database:
    condition: service_healthy

    View Slide

  47. Introduce Docker to CI
    Craft Your Dockerfile

    View Slide

  48. Docker for CI
    ◍ Multi-Stage Builds
    ◍ Mind Your Build-Cache
    ◍ Be Wary of “Helper” Scripts
    ◍ We’ll cover these in the demo

    View Slide

  49. Docker Shell
    Maintain Native Workflows

    View Slide

  50. Docker Shell Pattern
    ◍ Your base container has all your system
    dependencies (Don’t use
    --ignore-platform-reqs)
    ◍ Work natively, but in the container
    ◍ You’ll still get all the perks

    View Slide

  51. Demo

    View Slide

  52. Docker
    ◍ Image Builder
    ◍ Virtualisation
    ◍ Image Delivery
    ◍ Orchestration (Dev)
    ➔ docker build
    ➔ docker run
    ➔ docker push / pull
    ➔ docker-compose

    View Slide

  53. Tips
    I’ve learnt the hard way, so you don’t have to

    View Slide

  54. Zsh Plugin
    https://github.com
    /rawkode
    /zsh-docker-run

    View Slide

  55. Tips: Don’t Bust Your Build Cache
    COPY composer.json /code
    RUN composer install
    COPY . /code

    View Slide

  56. Tips: Mindful of Network Collisions
    Every new docker-compose file is,
    potentially, a new docker network / bridge
    on your host.
    Eventually, you’ll get a collision
    docker-compose down
    Add -v to remove volumes

    View Slide

  57. Tips: Logging
    ALWAYS
    LOG
    to
    STDOUT

    View Slide

  58. Tips: Prune
    docker system prune
    Docker CE >= 17.04

    View Slide

  59. Tips: Alpine Linux
    Unless you need Ubuntu / Fedora, use
    Alpine Linux
    Ubuntu -- 130MB / 85MB
    Alpine -- 3.99MB

    View Slide

  60. Production Tip
    nginx & fpm
    --volumes-from=php

    View Slide

  61. Production Tip
    Open Census
    Open Metrics
    Open Tracing

    View Slide

  62. Production Tip
    Mandatory Requirement
    --read-only

    View Slide

  63. Thank You!
    Questions?
    @[email protected]
    @rawkode

    View Slide