Docker in azione: come e perché usarlo in produzione con Rancher

ECCENTRIC DEVELOPER

Oscar Fanelli

Full-stack developer

Zend Framework

Doctrine

ReactJS

Tom's Hardware

Docker

PhpStorm

Google

(sul serio, vi basta cercare "Oscar Fanelli", sanno anche quando vado a fare la cacca)

ECCENTRIC DEVELOPER

Luca Mattivi

.NET Developer

Full-stack Developer

Laravel

AngularJS

Uala CTO

Docker

IoT

Problematiche a cui Docker ha risposto

MAMP

  • Pronto all'uso in pochi minuti
  • E se Mysql non ci serve?
  • Peso piuma?
  • E se volessimo riprodurre l'ambiente di produzione in locale?

Brew

  • Possibile configurare a piacimento i servizi
  • E se volessimo una versione specifica di uno specifico servizio?
  • E se volessimo riprodurre l'ambiente di produzione in locale?
  • E se volessimo aggiornare OSX?

brew update && brew upgrade...

% /usr/local/bin/gpg1
dyld: Library not loaded: /usr/local/opt/libusb-compat/lib/libusb-0.1.4.dylib
  Referenced from: /usr/local/bin/gpg1
  Reason: image not found
[1]    41295 trace trap  /usr/local/bin/gpg1
error: unable to unlink old '.gitignore' (Permission denied)
error: unable to create file .travis.yml (Permission denied)
error: unable to create file .yardopts (Permission denied)
error: unable to unlink old 'CODEOFCONDUCT.md' (Permission denied) ...
npm ERR! Darwin 13.3.0
npm ERR! argv "node" "/Users/user/.node/bin/npm" "update" "-g"
npm ERR! node v0.10.32
npm ERR! npm  v2.0.0
npm ERR! code EPEERINVALID

npm ERR! peerinvalid The package npmconf does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer npm-registry-client@3.2.2 wants npmconf@^2.1.0

Vagrant

  • Configurabile 100%
  • Possibile riprodurre ambiente di produzione
  • Veloce?
  • Tempo necessario per mettere in piedi tutto?

devops...

Docker

  • Containers
  • Immagini
  • Kernel condiviso
  • No hypervisor (niente overhead)
  • Performance migliori
  • Utilizzo solo delle risorse necessarie

Docker

Dockerfile

  • File di configurazione
  • Contiene tutte le istruzioni necessarie per:
    • Installare servizi
    • Configurare servizi
    • Esporre porte
  • Facile da apprendere
  • Mantenibile
  • Estendibile
  • Adatto anche ai più pretenziosi
FROM ubuntu:16.04

MAINTAINER Oscar Fanelli <oscar.fanelli@gmail.com>

ENV PROJECT_PATH=/var/www \
    DEBIAN_FRONTEND=noninteractive

# Utilities, Apache, PHP, and supplementary programs
RUN apt-get update -q && apt-get upgrade && apt-get install -yqq --force-yes \
    npm \
    git \
    wget \
    apache2 \
    libapache2-mod-php \
    php \
    php-curl \
    php-mysql \
    php-redis \
    php-xml

# Apache mods
RUN a2enmod rewrite expires headers

# PHP.ini file: enable <? ?> tags and quiet logging
RUN sed -i "s/short_open_tag = .*/short_open_tag = On/" $PHP_INI && \
    sed -i "s/memory_limit = .*/memory_limit = 256M/" $PHP_INI

# VirtualHost
COPY config/docker/apache-virtualhost.conf /etc/apache2/sites-available/000-default.conf

# Port to expose
EXPOSE 80

# Copy site into place
COPY . $PROJECT_PATH
WORKDIR $PROJECT_PATH

# Start apache
CMD /usr/sbin/apache2ctl -D FOREGROUND

Docker Compose

  • Configuratore di più container
  • Gestione di variabili d'ambiente
  • Mount dei volumi
  • Porte
  • ...
version: '2'

services:

  db:
    image: mysql:5.7.17
    volumes:
      - "./.data/db:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: secret
    expose:
      - "3306"

  redis:
    image: redis

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db

  web:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ".:/var/www/"
    depends_on:
      - db
      - redis
    env_file: .env

USE CASE

Upgrade da PHP 5.6 a 7.0

Perchè Docker?

Docker

  • Scalabilità
  • Efficiente separazione dei servizi
  • Portabilità
  • Alta personalizzazione

alcuni numeri su Uala

  • 4500 richieste / minuto
  • 650 connessioni simultanee
  • 70ms tempo risposta medio
  • 30 servizi diversi erogati

AWS?

~10/12k € al mese

Private Cloud (con Rancher)

250 € al mese

Docker in locale

vs

Docker in produzione

Necessità

  • Uptime garantito
  • Performance
  • Scalabilità
  • Bilanciamento del carico
  • Monitoring & Logging
  • Routing (es: porta 80/443)

come semplificare?

Rancher

Cosa fa?

  • Gestione dell'infrastruttura
  • Connessione criptata tra gli host configurati
  • Parallelizzazione dei container su più macchine
  • Continuous deployment (grazie a Jenkins)
  • Variabili d'ambiente
  • Certificati (https)

Continuous Deployment:

Da GitHub a Rancher

TEST & BUILD

CODE & PUSH

PRIVATE REPOSITORY

DEPLOY & RUN

Deployment Flow

Per gli insulti

oscar.fanelli@gmail.com

@nesis

@pensiero

Oscar Fanelli

Luca Mattivi

luca@uala.it

@leen151

@leen15

Link utili

  • slides.com/pensiero/docker-rancher-produzione
  • rancher.com
  • hub.docker.com/r/leen15
  • hub.docker.com/r/pensiero
  • github.com/pensiero/talk-commit-2017-demo-time
Made with Slides.com