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

Dockerize Everything TopConf Tallinn 2015

Dockerize Everything TopConf Tallinn 2015

The hype around Docker is big, but does Docker live up to it? What is that this new tool excites developers and operators in unison? In this talk I will show what makes Docker different and what the vision behind it is. I will also give some practical insights from using Docker in development and production and demonstrate why I started to “dockerize" everything.

Thomas Einwaller

November 18, 2015
Tweet

More Decks by Thomas Einwaller

Other Decks in Technology

Transcript

  1. Dockerize Everything
    Thomas Einwaller, troii Software
    @tompson

    View full-size slide

  2. products
    technologies

    View full-size slide

  3. Number of Processes
    ~$ ps ax | wc -l
    283
    ~$ docker run ubuntu ps ax
    PID TTY STAT TIME COMMAND
    1 ? Rs 0:00 ps ax

    View full-size slide

  4. code
    runtime
    libraries
    OS
    container
    what is in a container?

    View full-size slide

  5. image layers

    View full-size slide

  6. ubuntu
    nginx java
    tomcat
    App A App B
    wordpress website X
    “inheritance”

    View full-size slide

  7. one process per container
    tomcat mysql
    war, .properties
    link
    container A container B

    View full-size slide

  8. ship the whole environment

    View full-size slide

  9. How to get started?

    View full-size slide

  10. Docker Toolbox

    View full-size slide

  11. Search and Run an Image
    ~$ docker search -s 10 wordpress
    NAME DESCRIPTION STARS OFFICIAL
    wordpress The WordPress rich content management syst... 323 [OK]
    tutum/wordpress Wordpress Docker image - listens in port 8... 40
    ...
    ~$ docker run wordpress
    Unable to find image 'wordpress:latest' locally
    latest: Pulling from wordpress
    60fa28093d2e: Pull complete
    a8f83d6d9aa9: Pull complete
    d0ca8f539db8: Pull complete
    ...

    View full-size slide

  12. How to build my own?

    View full-size slide

  13. Custom Container
    ~$ docker run -it ubuntu /bin/bash
    root:/#
    root:/# apt-get install -y mysql-server
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done

    View full-size slide

  14. Commit Container
    ~$ docker ps
    CONTAINER ID IMAGE COMMAND NAMES
    e5a0e59fd3fd ubuntu:latest "/bin/bash" prickly_nobel
    ~$ docker commit prickly_nobel tom/mysql
    CONTAINER ID IMAGE COMMAND NAMES
    e5a0e59fd3fd ubuntu:latest "/bin/bash" prickly_nobel
    ~$ docker images
    REPOSITORY TAG IMAGE ID VIRTUAL SIZE
    tom/mysql latest 86a1fcd53530 512.1 MB
    ~$ docker run tom/mysql
    ...

    View full-size slide

  15. Dockerfile
    FROM ubuntu
    MAINTAINER Thomas Einwaller, [email protected]
    RUN apt-get update && apt-get -y install apache2
    ENV APACHE_RUN_USER www-data
    ENV APACHE_RUN_GROUP www-data
    ENV APACHE_LOG_DIR /var/log/apache2
    ENV APACHE_LOCK_DIR /var/lock/apache2
    ENV APACHE_PID_FILE /var/run/apache2.pid
    RUN mkdir /var/lock/apache2
    EXPOSE 80
    CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

    View full-size slide

  16. Docker build
    ~$ docker build -t tom/apache2 .
    Sending build context to Docker daemon 2.048 kB
    Sending build context to Docker daemon
    Step 0 : FROM ubuntu
    ---> bdb87369f343
    Step 1 : MAINTAINER Thomas Einwaller, [email protected]
    ---> Using cache
    ---> adcf06d4a78f
    Step 2 : RUN apt-get update && apt-get -y install apache2
    ---> Using cache
    ---> 5aee61ee1c84
    ...
    Step 9 : EXPOSE 80
    ---> Using cache
    ---> ac985c02bfd6
    Step 10 : CMD /usr/sbin/apache2 -D FOREGROUND
    ---> Running in 0a822e00e190
    ---> 89ac6eef066c
    Successfully built 89ac6eef066c

    View full-size slide

  17. Docker history
    ~$ docker history tom/apache2
    IMAGE CREATED CREATED BY SIZE
    a6b064aec848 2 minutes ago /bin/sh -c #(nop) CMD ["/usr/sbin/apache2" "- 0 B
    dc0e02dc4d11 2 minutes ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
    1bc593d23431 2 minutes ago /bin/sh -c mkdir /var/lock/apache2 0 B
    afdda46774c6 2 minutes ago /bin/sh -c #(nop) ENV APACHE_PID_FILE=/var/ru 0 B
    7f1a112bfd2e 2 minutes ago /bin/sh -c #(nop) ENV APACHE_LOCK_DIR=/var/lo 0 B
    8a95fc52c646 2 minutes ago /bin/sh -c #(nop) ENV APACHE_LOG_DIR=/var/log 0
    Ba32a610ccb8 2 minutes ago /bin/sh -c #(nop) ENV APACHE_RUN_GROUP=www-da 0 B
    8083f7e42d6d 2 minutes ago /bin/sh -c #(nop) ENV APACHE_RUN_USER=www-dat 0 B
    8cbd4df21d8b 2 minutes ago /bin/sh -c apt-get update && apt-get -y insta 30.63 MB
    ddfbce728239 2 minutes ago /bin/sh -c #(nop) MAINTAINER Thomas Einwaller 0 B
    bdb87369f343 5 weeks ago /bin/sh -c #(nop) CMD [/bin/zsh] 0 B
    ....

    View full-size slide

  18. Docker push
    ~$ docker push tom/apache2
    Sending image list
    Pushing repository tom/apache2 (1 tags)
    Image 511136ea3c5a already pushed, skipping
    Image 9fec74352904 already pushed, skipping
    Image d0955f21bf24 already pushed, skipping
    ...
    and pull
    ~$ docker pull tom/apache2
    Unable to find image 'tom/apache2:latest' locally
    latest: Pulling from tom/apache2
    60fa28093d2e: Pull complete
    a8f83d6d9aa9: Pull complete
    d0ca8f539db8: Pull complete
    ...

    View full-size slide

  19. How to use it?

    View full-size slide

  20. git
    repository
    artifact
    repository
    Development
    Environment
    Continuous
    Integration
    Source
    Artifact
    (.war, .jar, ...)
    Test/Prod
    Environment
    build / deployment pipeline before docker

    View full-size slide

  21. build / deployment pipeline with docker
    git
    repository
    artifact
    repository
    docker
    repository
    Development
    Environment
    Continuous
    Integration
    Source
    Artifact
    (.war, .jar, ...)
    Continuous
    Integration
    Test/Prod
    Environment
    Docker
    Image

    View full-size slide

  22. Development Environment
    ~$ docker run -v /Users/tom/website:/website nginx

    ~$ docker run -v /Users/tom/code:/code node

    View full-size slide

  23. Backup Tools
    ~$ docker run --volumes-from=nexus_data
    -e SOURCE=/usr/local/sonatype-work
    -e TARGET=s3://s3-eu-west-1.amazonaws.com/nexus-backup/
    -e TARGET_USER=$AWSACCESSKEYID
    -e TARGET_PASS=$AWSSECRETACCESSKEY
    duply
    ~$ docker run --link mysql:db
    -e BUCKET_NAME=mysql-backup
    -e AWSACCESSKEYID=$AWSACCESSKEYID
    -e AWSSECRETACCESSKEY=$AWSSECRETACCESSKEY
    -e DBNAMES=test
    -e USERNAME=user
    -e PASSWORD=password
    automysqlbackup

    View full-size slide

  24. Backup Tools
    ~$ docker run -v /home/tom/development/src:/src groovy //.gvm/groovy/
    current/bin/groovy /src/script.groovy
    ~$

    View full-size slide

  25. Docker machine
    ~$ docker-machine create --driver virtualbox dev
    INFO[0001] Downloading boot2docker.iso to /home/tom/.docker/machine/
    INFO[0011] Creating SSH key...
    INFO[0012] Creating VirtualBox VM...
    INFO[0019] Starting VirtualBox VM...
    ...
    ~$ docker-machine ls
    NAME ACTIVE DRIVER STATE URL
    dev * virtualbox Running tcp://192.168.99.103:2376
    staging digitalocean Running tcp://104.236.50.118:2376

    View full-size slide

  26. Docker compose
    nginx:
    image: nginx:1.9.6
    ports:
    - "80:80"
    links:
    - webapp
    webapp:
    build: .
    links:
    - db
    db:
    image: postgres

    View full-size slide

  27. docker swarm

    View full-size slide

  28. docker networking

    View full-size slide

  29. https://github.com/docker/dockercraft

    View full-size slide

  30. conclusion
    • set up development environments (database, languages, …)
    • move packages to test environments (no more “works on my machine”)
    • move the SAME package to production (server, cloud …)

    View full-size slide

  31. timr.com discount code ‘TOPCONF’ -20 %
    @tompson
    [email protected]

    View full-size slide