Limiti ai contenitori

Limitare il Networking

Aprire soltanto le porte che servono.

Di default più containers sulla stessa rete possono vedersi anche se le porte non sono state ufficialmente aperte od esposte.

Esempio. Scaricare l’immagine:

docker pull amouat/network-utils

Lanciare due containers:

docker run --name nc-test -d \
  amouat/network-utils nc -l 5001
docker run \
  -e IP=$(docker inspect -f \
  {{.NetworkSettings.IPAddress}} nc-test) \
  amouat/network-utils \
  sh -c 'echo  "hello" | nc -v $IP 5001'

Uscire dai container con Ctrl-P Ctrl-Q.

Ispezionare il risultato:

docker logs nc-test

Al termine, ripulire i container.

I contenitori si vedono tra loro anche se la porta di rete non è esplicitamente aperta.

Si può disabilitare la comunicazione tra i container lanciandoli con l'opzione --icc=false. Inoltre l'opzione --iptables=true forza l'uso delle regole di iptables sullo host.

Meglio ancora, lanciamo i contenitori su una rete docker interna. Questo limita la visibilità ai soli contenitori sulla stessa rete interna.

SUID e SGID

E' molto probabile che non vi sia bisogno nel nostro applicativo dei programmi con il bit SUID o SGID settato.

In tal caso può essere una buona idea disabilitarli.

Per esempio, in un Dockerfile:

FROM alpine
...
RUN find / -perm +6000 -type f -exec chmod a-s {} \; || true
...

Limitare la Memoria

Scaricare il programma di stress test:

docker pull amouat/stress

Limitare memoria, swap e memoria virtuale°

docker run -m 128m --memory-swap 128m amouat/stress \
  stress --vm 1 --vm-bytes 127m -t 5s

Memoria virtuale eccessiva:

docker run -m 128m --memory-swap 128m amouat/stress \
  stress --vm 1 --vm-bytes 130m -t 5s

Non ponendo limiti allo swap:

docker run -m 128m amouat/stress \
  stress --vm 1 --vm-bytes 255m -t 5s

Non tutte le installazioni di Docker consentono limitazioni alla memoria virtuale. Dare il comando:

docker info

e cercare la presenza eventuale del messaggio

WARNING: No swap limit support

Il supporto richiederebbe una ricompilazione del kernel Linux.

Limitare la CPU

Con l'opzione -c.

Viene dato un peso relativo ad ogni contenitore per quanto riguarda l'impegno di CPU. Il peso è una potenza di 2. Il peso di default è 1024.

Esempio:

docker run -d --name load1 -c 2048 amouat/stress
docker run -d --name load2 amouat/stress
docker run -d --name load3 -c 512 amouat/stress
docker run -d --name load4 -c 512 amouat/stress

docker stats $(docker inspect -f {{.Name}} $(docker ps -q))

Interrompere docker stats con Ctrl-C. Ripulire i contenitori al termine dell'esercizio.

Limitare i Restart

Un container può avere problemi e compiere troppi restart. Limitarli con, per esempio:

docker run -d --restart=on-failure:10 my-flaky-image

Per vedere il conto di restart corrente:

docker inspect -f "{{ .RestartCount }}" $(docker ps -lq)

Limitare i Filesystem

Con l'opzione --read-only.

Esempio:

docker run --read-only debian touch x
touch: cannot touch 'x': Read-only file system

Si può inoltre limitare l'accesso ai volumi. Per esempio:

docker run -v $(pwd):/pwd:ro debian touch /pwd/x
touch: cannot touch '/pwd/x': Read-only file system