Quick survey • How many people have heard of Docker before this Meetup ? • How many people have tried Docker ? • How many people are using Docker in production ?
Origins of Docker • Docker is a rewrite of similar code that currently powers the dotCloud PaaS • Original version written in Python (like dotCloud PaaS), now written in Go • It’s a young project (~6 months), but with a huge community.
Docker Timeline • January 2013 Docker started as an internal project inside of dotCloud • March 21, 2013 Solomon gives Docker lightning talk a PyCon US • March 27, 2013 Docker 0.1 released to Public • September 4, 2013 Docker merged into Openstack for the Havana release • September 19, 2013 Partnership with Red Hat around OpenShift • September 27, 2013 Docker 0.6.3 released
In the first 6 months • 6000+ Github stars • 150+ Contributors • 50,000+ docker index pull • 100’s of projects built on top of Docker – UIs (DockerUI, Shipyard, Dockland…) – Open Source PaaS (DEIS, Flynn, Dokku…) – Continuous Deployment (Strider…) • 1700’s Dockerized applications on Github
What is Docker ? “Docker is an open-source engine to easily create lightweight, portable, self-sufficient containers from any application. The same container that a developer builds and test on a laptop can run at scale, in production, on VMs, OpenStack cluster, public clouds and more.”
LinuX Containers (LCX) • Let’s your run a Linux system within another Linux system • A container is a group of processes on a Linux box, put together is an isolated environment • From the inside, it looks like a VM • From the outside, it looks like normal processes • “chroot on steroids”
Installation: Binaries • Get the docker binary $> wget –output-document=docker https://get.docker.io/builds/\ Linux/x86_64/docker-latest $> chmod +x docker • Run the docker daemon $> sudo ./docker –d & • Use your own system startup script
Detached mode • Run
in
Docker
using
the
detach
flag
(-‐d)
$> docker run –d ubuntu sh –c “while true; do echo hello world; sleep 1; done” • Get
container’s
id
$> docker ps • A:ach
to
the
container
$> docker attach
Containers vs Images • Remove a file from an image $> docker run busybox rm /etc/passwd • The file is still there ?? $> docker run busybox cat /etc/passwd • Commit the newly created to an image $> docker ps –n=2 #get the container’s id $> docker commit vieux/broken-busybox
• The file is gone $> docker run vieux/broken-busybox cat /etc/passwd
Public Index & Network • Pull an apache image from the public index $> docker search apache $> docker pull creack/apache2 • Run the image and check the ports $> docker run –d creack/apache2 $> docker ps • Expose public ports $> docker run –d –p 8888:80 –p 4444:443 creack/apache2 $> docker ps
Creating your 1st app: the scripted way • Write a Dockerfile # Memcached FROM ubuntu MAINTAINER Victor Vieux RUN apt-get update RUN apt-get install –y memcached ENTRYPOINT [“memcached”] USER daemon EXPOSE 11211 • Buid the image $> docker build –t=vieux/memcached . • Start the image $> docker run –d vieux/memcached memcached
Volumes and bind mounts • Put your persistent data in a volume $> $ID=(docker run –d –v /var/lib/mysql vieux/mysql) • So you can re use it in another container $> docker run –d –volumes-from=$ID vieux/mysql
• Bind mounts $> docker run –d –v /home/vv:/home • Supports read only / read write $> docker run –d –v host/path:container/path:rw
Other commands • docker cp #copy a file from container to host • docker diff #print container changes • docker top #display running processes inside a container • docker rm/rmi #delete container/image • docker wait #wait until container stop and print exit code More on: http://docs.docker.io/en/latest/commandline/cli
Local development • App running in prod http://ks3100989.kimsufi.com:8080/ • Build local
$> docker build –t=gcm . • Test local $> docker run –p 49200:8080 gcm
http://localhost:49200 • Change some files • Rebuild & test $> docker build –t=gcm . $> docker run –p 49200:8080 gcm
Push to prod • Tag image in order to push it $> docker tag gcm ks3100989.kimsufi.com:5000/gcm • Push image to local registry $> docker push ks3100989.kimsufi.com:5000/gcm • On production server, download image $> docker pull ks3100989.kimsufi.com:5000/gcm • Restart the container $> docker stop $> docker run –d –p 8080:8080