OttawaJS meetup

Daniel Lauzon

2016-05-11

Menu

Starters

  • Why: 12 factors
  • docker-* parts
  • Containers, images,layers
  • Docker Hub

Main Course

Containers vs VMs

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

intermodal shipping

Operations: outside

logging

monitoring

networking

Developers: inside

libraries

packages

application runtime

Text

Docker Concepts

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

Bonus - scaling

$ docker-compose build
$ docker-compose up
$ docker-compose scale web=2

Bonus - 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

Docker 101

By daneroo

Docker 101

  • 967