- The document summarizes a meetup on Docker held in Paris on February 10, 2013. It provides an introduction to Docker including its origins at dotCloud, timeline of development, how it works using Linux containers and union file systems, and basic installation and usage commands.
- The presenter demonstrated installing Docker, basic commands like running "hello world" examples, and committing container changes to new images. He also showed building a simple memcached application both interactively and using a Dockerfile.
- Finally, the presenter demonstrated a workflow for local development and deployment to production using Docker by building an image locally, testing, pushing to a local registry, and pulling to deploy on a production server.
3. 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 ?
5. 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.
6. 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
7. 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
8. 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.”
9. How does Docker work ?
• LinuX Containers (LXC)
• Control Groups & Namespaces
• AUFS
• Client – Server with an HTTP API
10. 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”
11. Why Containers?
• Speed: Boots in seconds
• Footprint: 100-1000 containers on one
machine. Small disk requirements
18. Installation: Ubuntu Linux
• AUFS support
$> sudo apt-get update
$> sudo apt-get intall linux-image-extra-`uname –r`
• Add Docker repository
$> sudo sh –c “curl https://get.docker.io/gpg | apt-key add -”
$> sudo sh –c “echo deb http://get.docker.io/ubuntu docker
main > /etc/apt/sources.list.d/docker.list”
• Install
$> sudo apt-get update
$> sudo apt-get install lxc-docker
19. 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
20. Installation: Vagrant
• Clone the Docker repository
$> git clone https://github.com/dotcloud/docker.git
• Startup the vagrant image
$> vagrant up
• SSH into the image
$> vagrant ssh
• Docker client works on Mac
22. Classic: hello world
• Get one base image (ubuntu, centos, busybox,…)
$> docker pull ubuntu
• List images on your system
$> docker images
• Print hello world
$> docker run ubuntu:12.10 echo “hello world”
23. 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 <container_id>
• Stop/Start/Restart
the
container
$> docker stop <container_id>
24. 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 <id> vieux/broken-busybox
• The file is gone
$> docker run vieux/broken-busybox cat /etc/passwd
25. 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
26. Creating your 1st app: the interactive way
• Using docker in interactive mode
$> docker run –i –t ubuntu bash
root@82c63ee50c3d:/#
root@82c63ee50c3d:/# apt-get update
[…]
root@82c63ee50c3d:/# apt-get install memcached
[…]
root@82c63ee50c3d:/# exit
• Commit the image
$> docker commit `docker ps –q –l` vieux/memcached
• Start the image
$> docker run –d –p 11211 –u daemon vieux/memcached memcached
27. Creating your 1st app: the boring way
• Multiple run / commit
$> docker run ubuntu apt-get update
$> $ID=(docker commit `docker ps –q –l`)
$> docker run $ID apt-get install memcached
$> docker commit `docker ps –q –l vieux/memcached
• Define default configuration at commit
$> docker commit –run=‘{“Entrypoint”: [“memcached”]}’ […]
• Start the image
$> docker run –d –p 11211 –u daemon vieux/memcached
28. Creating your 1st app: the scripted way
• Write a Dockerfile
# Memcached
FROM ubuntu
MAINTAINER Victor Vieux <victor@dotcloud.com>
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
29. 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 <image>
• Supports read only / read write
$> docker run –d –v host/path:container/path:rw <image>
30. 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
32. 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
33. 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 <container_id>
$> docker run –d –p 8080:8080 <image>