50
Docker and Puppet 1+1=3

Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Embed Size (px)

DESCRIPTION

"Docker and Puppet: 1+1=3" presented by Jerome Petazzoni, Docker at Puppet Camp Chicago 2014

Citation preview

Page 1: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Dockerand

Puppet

1+1=3

Page 2: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

@jpetazzo

● Wrote dotCloud PAAS deployment tools

– EC2, LXC, Puppet, Python, Shell, ØMQ...● Docker contributor

– Docker-in-Docker, VPN-in-Docker,router-in-Docker...CONTAINERIZE ALL THE THINGS!

● Runs Docker in production,and helps others to do the same

Page 3: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

What is Docker?The quick elevator pitch

Page 4: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Docker Engine + Docker Hub

= Docker Platform

Page 5: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Docker Engine

Page 6: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

The Docker Engine

● Open Source● Written in Go● Runs containers● On any modern Linux machine

(Intel 64 bits for now)

Page 7: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Containers ?

Page 8: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Containers

● Software delivery mechanism(a bit like a package!)

● Put your application in a container,run it anywhere

● A bit like a VM, but ...

Page 9: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

I have four words for you

● CONTAINERS boot faster(than VMs)

● CONTAINERS have less overhead(more consolidation)

● CONTAINERS bring native performance(on bare metal)

● CONTAINERS are cloud-compatible(can run in VMs)

Page 10: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Docker Engine recap

● Approximation:it's an hypervisor to run containers

● Approximation:containers are like VMs, but lighter

● Docker makes containers available to everybody(not just veterans from the last emacs/vim war)

Page 11: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)
Page 12: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

DockerHub

Page 13: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Docker Hub

● Services operated by Docker Inc.● Library of ready-to-use container images● Registry for your container images

(public or private)● Automated builds

(triggered by pushes to GitHub/Bitbucket)● Free for public/open source code, $$ otherwise

Page 14: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Buildingcontainers

Page 15: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Dockerfile

FROM ubuntu:14.04MAINTAINER Docker Team <[email protected]>

RUN apt-get updateRUN apt-get install -y nginxRUN echo 'Hi, I am in your container' \ >/usr/share/nginx/html/index.html

CMD [ "nginx", "-g", "daemon off;" ]

EXPOSE 80

Page 16: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)
Page 17: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

FROM ubuntu

RUN apt-get -y updateRUN apt-get install -y g++RUN apt-get install -y erlang-dev erlang-manpages erlang-base-hipe ...RUN apt-get install -y libmozjs185-dev libicu-dev libtool ...RUN apt-get install -y make wget

RUN wget http://.../apache-couchdb-1.3.1.tar.gz | tar -C /tmp -zxf-RUN cd /tmp/apache-couchdb-* && ./configure && make install

RUN printf "[httpd]\nport = 8101\nbind_address = 0.0.0.0" > /usr/local/etc/couchdb/local.d/docker.ini

EXPOSE 8101CMD ["/usr/local/bin/couchdb"]

docker build -t jpetazzo/couchdb .

Page 18: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Dockerfilevs.

Shell scripts

Page 19: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Shell scripts

● OK-ish for simple stacks● Tricky to handle all possible situations

(that's why we have proper config management)● Though choice when rebuilding:

– from scratch (but it takes forever!)

– iteratively (but might behave differently!)

Page 20: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Dockerfilevs.

Configuration Management

Page 21: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Configuration Management:the Good

● Deals with low-level stuff● Abstracts some details (distro, sometimes OS)● Ensures convergence to a known state● Library of reusable, composable templates

Page 22: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Configuration Management:the Bad

● Steep learning curve● Generally requires an agent

(or something to trigger e.g. « puppet apply »)● Resource-intensive

(it's OK to run the agent on a 64 GB server,it's less OK to run 100 agents on said server)

Page 23: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Configuration Management

● Reusability is just as good as modules are(i.e. YMMV)

● Not as deterministic as you think● Rollbacks are harder than you think

{ 'openssl' : ensure => present }

{ 'openssl' : ensure => '1.2.3-no-heartbleed-pls' }

Page 24: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Dockerfileto the rescue

Page 25: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Dockerfile

● Doesn't have to deal with « low-level stuff »(hardware, drivers... handled by the host)

● Doesn't need all the goodness of CM(because it doesn't have to converge)

● Partial rebuilds are fast(layered caching rebuilds only what is needed)

● Allows inheritance and composition(FROM <mycustombase>; see also: ONBUILD)

● Easy learning curve(if you know Shell, you already know Dockerfile)

Page 26: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

But...

● Doesn't deal with « low-level stuff »(hardware, drivers...)

● Doesn't define resource dependencies(no before/after)

● Doesn't define what runs where

Page 27: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Puppetto the rescue

Page 28: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Before/After

● Use Puppet tosetup hardware(or virtual hardware), install packages, deploy code,run services.

● Use Puppet tosetup hardware(or virtual hardware), install Docker,run containers.

● Use Dockerfilesto install packages,deploy code,run services.

Page 29: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Do one thing,and do it well

Page 30: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

First things first

https://github.com/garethr/garethr-docker

https://forge.puppetlabs.com/garethr/docker

Page 31: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Installing Docker with Puppet

include 'docker'

class { 'docker': version => '0.8.1'}

Page 32: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Warm up our image collection

# download the registry imagedocker::image { 'stackbrew/registry':}

# don't download all ubuntu,# just 'precise'docker::image { 'ubuntu': image_tag => 'precise'}

Page 33: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Run containers

docker::run { 'slavedb': image => 'jpetazzo/postgresql' command => '…' ports => ['5432', '22'], links => ['masterdb:master'], use_name => true, volumes => ['/var/lib/postgresql'], volumes_from => '420fc7e8aa20', memory_limit => 100000000, # bytes username => 'postgres', hostname => 'sdb.prod.dckr.io', env => ['FUZZINESS=42', FOO=BAR', 'FOO2=BAR2'], dns => ['8.8.8.8', '8.8.4.4'], restart_service => true

}

Page 34: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Can I use Puppet to build Docker

container images?

Page 35: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

YES

Page 36: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Should I use Puppet to build Docker

container images?

Page 37: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

NO

Page 38: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

OK,let's do it anyway

Page 39: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

My other VM is a container

● write a Dockerfile to install Puppet● start tons of containers● run Puppet in them (agent, or one-shot apply)

Good if you want a mix of containers/VM/metal

But slower to deploy, and uses more resources

Page 40: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

FROM ubuntu:12.04RUN apt-get install -qy wgetRUN mkdir /puppetWORKDIR /puppetRUN wget -q http://apt.puppetlabs.com/puppetlabs-release-precise.debRUN dpkg -i puppetlabs-release-precise.debRUN apt-get update -qRUN apt-get install -qy puppet-commonCMD puppet agent --no-daemonize --verbose

Sample Dockerfile

Page 41: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Lightweight, portable VMs

● Start containers instead of VMs– I can start 10 containers on this puny laptop!

– You can start those 10 containers too!(Even though you have a totally different laptop!)

– We can start those containers in the Cloud!

● Deploy sshd, syslogd, crond, etc.– You can... But do you have to?

Page 42: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

The revolution will be containerized

● write a Dockerfile to install Puppet● … and run Puppet as part of build process● deploy fully baked, « golden » images

Faster to deploy

Easier to rollback

Page 43: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

FROM ubuntu:12.04RUN apt-get install -qy wgetRUN mkdir /puppetWORKDIR /puppetRUN wget -q http://apt.puppetlabs.com/puppetlabs-release-precise.debRUN dpkg -i puppetlabs-release-precise.debRUN apt-get update -qRUN apt-get install -qy puppet-commonENV FACTER_HOSTNAME database42ADD ./site.pp /puppet/site.ppRUN puppet apply site.pp

Sample Dockerfile

Page 44: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Beyond Golden

Containers

Page 45: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Get rid of sshd, crond, syslogd...

● Remote access: nsenterhttps://github.com/jpetazzo/nsenter

● Cron:use a separate container

● Logs:use a data container

http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/

Page 46: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Why?

● Separate orthogonal concerns(don't rebuild your app to change logging, remote access, and other unrelated things)

● Have different policies in prod/dev/QA/etc● Ship lighter containers

Page 47: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Thoughts...

Page 48: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

What if we could...

● Run the Puppet agent outside of the container● Run a single agent for many containers● Share the cost of the agent

Page 49: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Thank you!

Page 50: Puppet Camp Chicago 2014: Docker and Puppet: 1+1=3 (Intermediate)

Shameless promo + Q&A

Tonight:Docker and Mesos meet-up, at BrainTree(requires cloning+teleportation)

The rest of the week:A bunch of talks about Docker & Containers(requires a LinuxCon pass)

http://docker.com/@docker@jpetazzo