Docker

Che cos’è Docker

  1. Un demone per gestire i container:

    • usa layer sovrapposti e cow per gerstire l’fs;
    • usa namespace e cgroups per isolare e controllare i processi.
  2. Un servizio di registry delle immagini (e dei layer) disponibili.

  3. Un sistema di build per le immagini.

Influenzato da https://12factor.net/

Installazione

L’hai installato?

Consiglio di installare il pacchetto fornito da Docker perché quello Debian/Ubuntu è sempre un po’ indietro. Vedi la documentazione ufficiale

  # wget -qO- https://get.docker.com/ | sh
  wget -qO- https://get.docker.com/ | less

Attenzione al pacchetto perché è fatto per jessie

Per modificare i parametri di avvio (da eseguire come root):


  [Service]
  ExecStart=
  ExecStart=/usr/bin/docker daemon -s btrfs --icc=false -H fd://

L’opzione -s qui sopra stabilisce il graph driver che il demone Docker userà; ne esistono diversi come:

  • aufs;
  • overlayfs;
  • btrfs;
  • devicemapper;
  • zfs;

Il primo non è più disponibile sui kernel recenti, perché è stato sostituito dal secondo, che però io ho trovato non funzionare molto bene. Io attualmente uso un Linux 4.2.6 e Docker 1.9.1.

Usa di default overlayfs per comporre il filesystem che è come una cipolla.

Dettagli sullo storage.

Da eseguire come root:

  mkdir /etc/systemd/system/docker.service.d
  # copiare le righe sopra nel file /etc/systemd/system/docker.service.d/params.conf
  # emacs -nw /etc/systemd/system/docker.service.d/params.conf
  systemctl daemon-reload
  systemctl start docker

Aggiungersi al gruppo docker

  adduser <nome utente> docker

Uso

Primi passi

  • api orientata ai processi
  • simile a git per altri versi

Comandi principali:

  • run
  • ps
  • build
  • images
  • diff
  • history
  • commit
  • push

Docker build

Documentazione su https://docs.docker.com/engine/reference/builder/.

  mkdir nginx
  cat << FINE > nginx/Dockerfile
  FROM debian:latest

  ENV DEBIAN_FRONTEND=noninteractive
  RUN apt-get update && apt-get install -y nginx

  RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
      ln -sf /dev/stderr /var/log/nginx/error.log

  RUN echo 'Ciao corso docker' > /var/www/html/index.html

  CMD ["nginx", "-g", "daemon off;"]
  EXPOSE 80
  FINE
  cd nginx
  docker build -t corsocloud/nginx nginx
  NGINX=$(docker run -dP  corsocloud/nginx)
  NGINX_PORT=$(docker port $NGINX 80)
  curl http://$NGINX_PORT
  docker inspect $NGINX | less

Occhio a

  • cache e RUN con side effects e RUN dipendenti;
  • ogni istruzione è un layer;
  • errori nella composizione delle liste.

Debugging del build

Il build dell’immagine nginx di prima produce un output simile a questo:

  .... omissis ....
  Step 4 : RUN ln -sf /dev/stdout /var/log/nginx/access.log &&     ln -sf /dev/stderr /var/log/nginx/error.log
   ---> Running in e17c7f93a3f1
   ---> 8a13ac3dd1ed
  Removing intermediate container e17c7f93a3f1
  Step 5 : RUN echo 'Ciao corso docker' > /var/www/html/index.html
   ---> Running in 6c955504727d
   ---> 6211edd8a0e3
  Removing intermediate container 6c955504727d
  Step 6 : CMD nginx -g daemon off;
   ---> Running in 8d4b89b54cac
   ---> cf34fefadc18
  Removing intermediate container 8d4b89b54cac
  Step 7 : EXPOSE 80
   ---> Running in 5f8f2a823ae5
   ---> 7b811ea66663
  Removing intermediate container 5f8f2a823ae5
  Successfully built 7b811ea66663

Se uno step dovesse fallire, è possibile eseguire un debugging eseguendo `bash nell’ultimo step valido. Ad esempio se lo step 5 qui sopra fosse fallito potrei “entrare” nel container usato per eseguire il comando associato con:

  docker run -ti 8a13ac3dd1ed bash

Creo un altra immagine per usarla come client


  FROM debian:latest

  ENV DEBIAN_FRONTEND=noninteractive
  RUN apt-get update && apt-get install -y curl

  ENTRYPOINT ["curl"]
  docker build -t azazel/curl curl

  docker inspect $NGINX | grep IPAddress
  docker run --rm azazel/curl

  docker run --rm --link $NGINX:nginx azazel/curl http://nginx
  docker run --rm --link $NGINX:nginx --entrypoint /bin/bash -ti azazel/curl

volumi


  FROM debian:jessie

  ENV DEBIAN_FRONTEND=noninteractive

  RUN mkdir -p /opt/volume
  VOLUME ["/opt/volume"]

  CMD ["tail", "-f", "/dev/null"]
  docker build -t azazel/data data_container

  docker create -v "voldata:/opt/volume" --name data azazel/data

  docker run --volumes-from data -ti --rm debian:jessie bash

Orchestratori

Ci sono un certo numero di questi applicativi che servono a controllare un vasto numero di container, su più nodi e che usano Docker come base: