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