Docker Ottawa Meetup
Daniel Lauzon
2016-05-25
![](https://s3.amazonaws.com/media-p.slid.es/uploads/5587/images/2538046/docker-100275159-orig.jpg)
Menu
Starters
- Why: 12 factors
- docker-* parts
- Containers, images,layers
- Docker Hub
Main Course
- docker command
- Dockerfile
- docker-compose app
- docker-compose scale
Containers vs VMs
![](https://s3.amazonaws.com/media-p.slid.es/uploads/5587/images/2593216/Screen_Shot_2016-05-10_at_7.41.10_PM.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/5587/images/2593217/Screen_Shot_2016-05-10_at_7.41.29_PM.png)
Docker Basics
- Docker Image: basic packaging
- Docker Container: a running service
- Docker Engine: create, ship and run containers
- Docker Registry: a repository of images
Container Analogy
![](https://s3.amazonaws.com/media-p.slid.es/uploads/5587/images/2593241/Screen_Shot_2016-05-10_at_7.51.40_PM.png)
intermodal shipping
Operations: outside
logging
monitoring
networking
Developers: inside
libraries
packages
application runtime
Text
Docker Concepts
![](https://s3.amazonaws.com/media-p.slid.es/uploads/438988/images/2163538/oyster-registry-3.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/438988/images/2163539/docker_machine.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/438988/images/2163541/docker-compose-drupal.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/438988/images/2163545/swarm.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/438988/images/2163549/product_-_engine.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/438988/images/2163558/tbox.jpg)
Machine
Engine
Toolbox
Docker Hub
Git for application images
-push/pull/share/inherit
Ubuntu
CentOs
Redis
Postgres
Neo4j
Mongo
Node
nginx
Alpine
docker run
ottawajs-docker101 (master)$ docker run --rm -it ubuntu
root@8631642d1307:/# whoami
root
root@8631642d1307:/# uname -a
Linux 8631642d1307 4.4.6-moby #1 SMP Fri Apr 29 14:12:19 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@8631642d1307:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
docker run
ottawajs-docker101 (master)$ docker run --rm -it ubuntu:14.04
root@ca4ce6031d53:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
docker run
ottawajs-docker101 (master)$ docker run --rm -it centos
[root@4a0be52733ce /]# cat /etc/system-release
CentOS Linux release 7.2.1511 (Core)
[root@4a0be52733ce /]#
pipes
$ time ( date | cat | wc )
1 6 29
0.003s
$ time ( docker run --rm -i ubuntu:14.04 date | \
docker run --rm -i centos wc | \
docker run --rm -i ubuntu wc )
1 3 24
1.853s
nginx
$ docker run -d --name nginx -p 8756:80 nginx
d3d852360c383950cd2bd7db48507a255481b3c0228ce82a0cb176cc0c7ea770
$ open http://0.0.0.0:8756
$ docker logs -f nginx
172.17.0.1 - - [11/May/2016:21:16:29 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36" "-"
172.17.0.1 - - [11/May/2016:21:16:31 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36" "-"
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3d852360c38 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 443/tcp, 0.0.0.0:8756->80/tcp nginx
$ docker stop nginx
nginx
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3d852360c38 nginx "nginx -g 'daemon off" 2 minutes ago Exited (0) 5 seconds ago nginx
$ docker rm nginx
docker build
FROM node:6
# inject the port into the app
ENV PORT 8000
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN npm install
# This is were we publish
EXPOSE ${PORT}
CMD [ "npm", "start" ]
Dockerfile
docker build
ottawajs-docker101/web (master)$ docker build -t web .
Sending build context to Docker daemon 18.74 MB
Step 1 : FROM node:6
---> 04a4aab809b8
Step 2 : ENV PORT 8000
---> Using cache
---> 54fa71de0818
...
Step 5 : COPY . /usr/src/app
---> Using cache
---> 64c7334d4665
Step 6 : RUN npm install
---> Using cache
---> 924cbf0e7070
Step 7 : EXPOSE ${PORT}
---> Using cache
---> 0622caa34574
Step 8 : CMD npm start
---> Using cache
---> f249a261b3ac
Successfully built f249a261b3ac
docker run
ottawajs-docker101/web (master)$ docker run --rm -it -p 8000:8000 web
npm info it worked if it ends with ok
npm info using npm@3.8.6
npm info using node@v6.1.0
npm info lifecycle web@1.0.0~prestart: web@1.0.0
npm info lifecycle web@1.0.0~start: web@1.0.0
> web@1.0.0 start /usr/src/app
> node index.js
Listening on: http://0.0.0.0:8000
GET / 304 4.521 ms - -
GET /css/bootstrap.min.css 304 2.539 ms - -
GET /font-awesome/css/font-awesome.min.css 304 2.247 ms - -
GET /css/agency.css 304 2.302 ms - -
GET /js/jquery.js 304 0.772 ms - -
...
Orchestration
web:
build: web
links:
- redis
ports:
- 8000:8000
redis :
image: redis
ports:
- 6379:6379
docker-compose
docker-compose
$ docker-compose build $ docker-compose up
Scaling
$ docker-compose build
$ docker-compose up
$ docker-compose scale web=2
Scaling
Redis
Web
Web
Web
?
?
Browser
Scaling
Redis
Web
Web
Load Balancer
Browser
Web
Scaling
services:
# load balancer
lb:
image: nginx:1.9
networks:
- backend
ports:
- "8000:8000"
web:
build: web
links:
- redis
networks:
backend:
aliases:
# Round robin DNS alias
- webapps
expose:
- 8000
networks:
backend: {}
Questions?
thanks!
Daniel Lauzon
![](https://s3.amazonaws.com/media-p.slid.es/uploads/5587/images/2538046/docker-100275159-orig.jpg)
Docker 102
By daneroo
Docker 102
- 800