Docker
Che cos’è Docker
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.
Un servizio di registry delle immagini (e dei layer) disponibili.
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
links
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: