Imatges
Amb l'ordre docker images
podem veure totes les imatges que s'han descarregat i que estan en la cache de la màquina virtual:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sail-8.3/app latest be7554cb158e 4 days ago 1.66GB
redis alpine eac30ee4acc6 5 days ago 46.1MB
...
Pots verificar que no tinc cap imatge alpine:3.1
:
$ docker images alpine:3.1
REPOSITORY TAG IMAGE ID CREATED SIZE
$
Per executar un contenidor s’ha de descarregar la imatge corresponent:
$ docker run --name alpine alpine:3.1 echo "Hello!"
Unable to find image 'alpine:3.1' locally
3.1: Pulling from library/alpine
0f253aa151d7: Pull complete
Digest: sha256:4dfc68bc95af5c1beb5e307133ce91546874dcd0d880736b25ddbe6f483c65b4
Status: Downloaded newer image for alpine:3.1
Hello!
La imatge queda guardada en la màquina virtual:
$ docker images alpine:3.1
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.1 a1038a41fe2b 5 years ago 5.05MB
El contenidor alpine
necessita aquesta imatge perquè fa servir el sistema de fitxers de la imatge.
Si intento eliminar la imatge docker em diu que no puc:
$ docker image rm alpine:3.1
Error response from daemon: conflict: unable to remove repository reference "alpine:3.1" (must force) - container 22a5e3a77bb2 is using its referenced image a1038a41fe2b
Si vols eliminar les imatges que cap contenidor estigui fent servir per tal d’alliberar espai al disc, utilitza aquesta comanda:
$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Crear una imatge
Si volem que la nostra aplicació web sigui portable necessitem juntar comportament (el servidor web) amb les dades (el nostre lloc web).
Per tal de construir una nova imatge a partir d’un contenidor hem de fer tres coses:
-
Hem d’escollir l’imatge de partida
-
Modificar el sistema de fitxers del contenidor. Aquests canvis es fan en una nova capa del sistema de fitxers propietat del contenidor.
-
Fer un commit per crear una nova imatge
Arrenquem un contenidor apache:
$ docker run --rm -d --name apache -p 80:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
09f376ebb190: Already exists
dab55b4abfc3: Pull complete
4f4fb700ef54: Pull complete
1a6d0283f224: Pull complete
1abf9110528c: Pull complete
7bacb8f85f3a: Pull complete
Digest: sha256:43c7661a3243c04b0955c81ac994ea13a1d8a1e53c15023a7b3cd5e8bb25de3c
Status: Downloaded newer image for httpd:latest
49a08aa9247bf05de9fcaa68a4518558d98638d0912c08f94a4ae0bad50b9c20
Pots veure que es baixen diferents "layers" (en parlarem més endavant).
Modifica el contingut de la pàgina index.html
del contenidor:
$ docker exec -it apache bash
... $ echo "A poc a poc i bona lletra" > htdocs/index.html
$ exit
exit
O en una sóla línia:
$ docker exec apache bash -c "echo 'A poc a poc i bona lletra' > htdocs/index.html"
Amb l'ordre container diff
pots veure les diferències entre els sistema de fitxers del contenidor i el de les imatges de les quals deriva el contenidor:
$ docker container diff apache
C /root
A /root/.bash_history
C /usr
C /usr/local
C /usr/local/apache2
C /usr/local/apache2/logs
A /usr/local/apache2/logs/httpd.pid
C /usr/local/apache2/htdocs
C /usr/local/apache2/htdocs/index.html
També que el contenidor respon amb el nou fitxer index.html
:
$ curl localhost
A poc a poc i bona lletra
Si parem el contenidor aquest s'esborra i es perd el sistema de fitxers (a "layer") del contenidor.
Si volem, podem crear una nova imatge a partir del contenidor:
$ docker container commit apache apache-dixit
sha256:6509481cba1c9ba72c6288cbdd76d9477ca43ce69ddccfa6882323b6c9a301c0
$ docker images apache-dixit
REPOSITORY TAG IMAGE ID CREATED SIZE
apache-dixit latest 6509481cba1c 30 seconds ago 147MB
Eliminem el contenidor apache i fem servir la imatge apache-dixit
que hem creat per aixecar un nou contenidor:
$ docker stop apache
apache
$ docker run --rm -d --name apache -p 80:80 apache-dixit
cf254be6de0e6ece208ae61aaf644a093fd077d0d5e2dd2c9c4df3c147ca6fc3
$ curl localhost
A poc a poc i bona lletra
A partir d’aquesta imatge es poden crear tants contendiors apache com vulguis que enlloc de respondre amb <html><body><h1>It works!</h1></body></html>
responen amb A poc a poc i bona lletra
.