2. Who Am I?
• Core maintainer on Docker Engine
• Previously Ops @ StumbleUpon
• I ♡ Go
2
Tibor Vass, Chapel Hill, NC
IRC #docker: tibor
Twitter: @tiborvass
7. Code deployment…
7
CI fetches code
builds it and runs tests
If ok, allow deployment of code
push code to git server
Prod
Deploy code
hook
kicks CI
8. … in different environments!
8
Newest version of Python
Code assumes port 1234 available
Older version of Python
Port 1234 taken
Missing dependency
9. … in different environments!
9
Newest version of Python
Code assumes port 1234 available
Older version of Python
Port 1234 taken
Missing dependency
Angry
Users
10. … in different environments!
10
Newest version of Python
Code assumes port 1234 available
Older version of Python
Port 1234 taken
Missing dependency
Angry
Users
“Works for me!”
17. Density & Resource usage
• One app per server
– waste of idle resources
– huge costs
• One app per VM, multiple VMs per server
– Better resource pooling
– Easier to scale
– Pay as you go (cloud)
– Not *that* portable
– Requires resource allocation
(cpu, RAM, disk, …)
– GuestOS duplicated
– Resource hungry
17 Hardware
Host OS
Hypervisor
GuestOS GuestOS
AppApp
Hardware
Host OS
App
40. Engine
• Docker Daemon + REST(ish) API
• Docker Client (CLI) talks to the API
• Daemon manages the Docker containers
• Start it with: docker -d
• docker version to test if docker is set up correctly
40
42. Images vs Containers
• Images: About storing or moving your app
• Containers: About running your app
42
43. Image
• Read-only snapshots (templates) for creating containers
• Stored on the Docker Hub or on a private registry (or in a tar archive)
• Cannot be run, has to be instantiated into a container
• Look around on Docker Hub for existing images
• List images:
docker images
• Download busybox:
docker pull busybox
• Remove busybox image:
docker rmi busybox
43
44. Containers
• Sandboxed application
• docker ps
• docker create —name hello busybox echo hello posscon
• docker start -a hello
• docker start -a hello # same container started again
• docker rm hello
• docker run busybox echo hello posscon
• WARNING: run = create + start, so each “run” spawns a new container
(ephemeral)
44
45. Containers
• Launch an interactive shell:
docker run -i -t busybox sh
• Expose ports of an image:
docker run -P training/webapp python app.py
• Read host port on docker ps
• Detached mode:
docker run -d -P training/webapp python app.py
• Expose to specific host ports:
docker run -d -p 1234:5000 training/webapp python
app.py
45
47. Build images
• Example layout of a Dockerfile placed alongside with the code
• FROM ubuntu:14.04
• RUN apt-get update && apt-get install -y golang
• ENV GOPATH=/go
• COPY . /go/src/myapp
• EXPOSE 8080
• RUN go build myapp
• CMD [“/go/bin/myapp”]
• Build new image named myapp: docker build -t myapp .
• Change code, and rerun the build command: notice that Docker cached the dependencies and
won’t fetch them again by default (use —no-cache if desired)
47
48. Build with official images
• No need to use FROM ubuntu and install common dependencies anymore!
• Use official golang image:
• FROM golang
• COPY . /go/src/myapp
• …
• Even simpler:
• FROM golang:onbuild
• # something will listen on port 8080
• EXPOSE 8080
48
50. Compose your stack of containers
• In a docker-compose.yml:
• wordpress:
• image: wordpress
• links:
• - db:mysql
• ports:
• - 8080:80
• db:
• image: mariadb
• environment:
• MYSQL_ROOT_PASSWORD: example
• docker-compose up
• http://<IP>:8080 where IP is the IP of the Docker daemon
50
52. App deployment…
52
CI fetches code
builds an IMAGE on which it runs tests
push code to git server
hook
kicks CI
Prod
Docker Hub or
private registry
If ok, push
IMAGE to
registry
Deploy IMAGE
53. … in different environments!
53
Dockerfile described the Docker
image with its dependencies and
Dev tested his code in that Docker image
Same Dockerfile
Same Docker image
Docker image safely
stored and tagged