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

Kickass Development Environments with Docker (PHPBenelux 2019)

Kickass Development Environments with Docker (PHPBenelux 2019)

David McKay

January 26, 2019
Tweet

More Decks by David McKay

Other Decks in Technology

Transcript

  1. Hi
    #phpbnl19

    View Slide

  2. Kickass Development
    Environments
    with Docker

    View Slide

  3. @rawkode
    David McKay
    ◍ Developer Advocate at InfluxData
    ◍ Docker / CI / CD
    ◍ DevOps / SaltStack
    ◍ Event-Driven Systems
    ◍ CQRS / ES
    ◍ Elixir, Go, and Rust

    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
    ◍ Virtualisation
    ◍ Image Delivery
    ◍ Orchestration (Dev)
    ➔ docker build
    ➔ docker run
    ➔ docker push / pull
    ➔ docker-compose

    View Slide

  18. Image Building
    Introducing the Dockerfile

    View Slide

  19. (Simplified) Dockerfile for PHP
    FROM ubuntu:17.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:17.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:17.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:17.04
    RUN apt install -y php-cli
    COPY hello.php /code
    WORKDIR /code
    ENTRYPOINT [“php”]
    CMD [“-v”]

    View Slide

  23. (Simplified) Dockerfile for PHP
    FROM ubuntu:17.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
    ◍ Virtualisation
    ◍ Image Delivery
    ◍ Orchestration (Dev)
    ➔ docker build
    ➔ docker run
    ➔ docker push / pull
    ➔ docker-compose

    View Slide

  33. Virtualisation
    Running Docker Images as Containers

    View Slide

  34. Demo

    View Slide

  35. Docker
    ◍ Image Builder
    ◍ Virtualisation
    ◍ Image Delivery
    ◍ Orchestration (Dev)
    ➔ docker build
    ➔ docker run
    ➔ docker push / pull
    ➔ 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-compose.yml
    version: “3”

    View Slide

  41. docker-compose.yml
    version: “3”
    services:
    php:
    image: php:7
    ports:
    - 80:80
    volumes:
    - .:/code

    View Slide

  42. docker-compose.yml
    version: “3”
    services:
    php:
    image: php:7

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

    View Slide

  43. docker-compose.yml
    version: “3”
    services:
    php:
    image: php:7

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

    View Slide

  44. docker-compose.yml
    version: “3”
    services:
    php:
    image: php:7
    healthcheck:
    test: nc -z localhost 80
    depends_on:
    - database

    View Slide

  45. Demo

    View Slide

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

    View Slide

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

    View Slide

  48. Tips: Use Random Ports
    services:
    php:
    ports:
    - 80

    View Slide

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

    View Slide

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

    View Slide

  51. Tips: env_file
    Lots of environment variables defined
    inside compose.yml? Duplication?
    env_file:
    - some file

    View Slide

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

    View Slide

  53. Tips: Keep a Single Dockerfile
    Using MultiStage Builds, you can usually
    keep your project to a single Dockerfile
    FROM node AS node
    RUN npm install
    FROM php
    COPY --from=node assets

    View Slide

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

    View Slide

  55. Tips: Logging
    ALWAYS
    LOG
    to
    STDOUT

    View Slide

  56. Production Tip
    Mandatory Requirement
    --read-only

    View Slide

  57. Warning
    Microservices

    View Slide


  58. That which is old will be new again

    View Slide

  59. Microservices

    View Slide

  60. Microservices

    View Slide

  61. Microservices

    View Slide

  62. Microservices

    View Slide

  63. Microservices

    View Slide

  64. What is old will be new again
    Shared Kubernetes Dev
    Server

    View Slide

  65. Microservices

    View Slide

  66. Shared Kubernetes Dev Server
    Tooling
    Skaffold
    github.com/GoogleContainerTools/skaffold
    Draft
    github.com/Azure/draft
    Telepresence
    github.com/telepresenceio/telepresence

    View Slide

  67. Shared Kubernetes Dev Server
    Tooling
    Istio
    github.com/istio/istio
    Linkerd
    linkerd/linkerd2
    Consul Connect
    github.com/hashicorp/consul

    View Slide

  68. Creating a fast Kubernetes
    Development Workflow
    Bastian Hofmann / 1140 / Track B

    View Slide

  69. Questions?

    View Slide