Images

Récupérer une image sur un registre

Récupérons l'image Nginx stable sur la distriubtion Alpine.

$ docker pull nginx:stable-alpine
alpine: Pulling from nginx
be700e4956df: Pull complete 
4b9bf1642656: Pull complete 
51abb4d2846b: Pull complete 
47131f1f575f: Pull complete 
43053ae02e28: Pull complete 
cea3e203a9a4: Pull complete 
24ba19347287: Pull complete 
15d695f22e63: Pull complete 
f58d61a874be: Already exists 
54fdf50e0ac6: Already exists 
Digest: sha256:7d4a186f16ec00463ada491d62e12f60755e8aa2ea27ba1e6e0b26a9034347f6
Status: Downloaded newer image for nginx:stable-alpine

Créons une image en commitant un container

Installons curl dans un container Alpine

$ docker run -it alpine sh
/ # curl
sh: curl: not found
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.3-24-g74309b7 [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.3-9-gfc38db2 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5858 distinct packages available
/ # apk add curl
(1/4) Installing openssl (1.0.2g-r0)
(2/4) Installing ca-certificates (20160104-r2)
(3/4) Installing libssh2 (1.6.0-r1)
(4/4) Installing curl (7.47.0-r0)
Executing busybox-1.24.1-r7.trigger
Executing ca-certificates-20160104-r2.trigger
OK: 7 MiB in 15 packages
/ # curl https://anybox.fr > anybox.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 25783  100 25783    0     0   131k      0 --:--:-- --:--:-- --:--:--  159k
/ # exit

Vous remarquerez, si vous lancez de nouveau la commande docker run -it alpine sh cela crée un nouveau container avec l'image Alpine qui ne contient pas curl.

Vous pourriez redémarrer le Docker existant mais ça ne vous permet pas de créer de nouveaux containers Docker avec curl inclus.

$ docker start -i 623e39ab887f
$ curl --version
curl 7.x...
$ exit

Nous committons donc ce container pour le sauvegarder comme image Docker

$ docker commit -m "install curl" 623e39ab887f alpine:curl
44791c39942caa99974e2ca861c046384519c141195e4e21245fc20acff953ab
$ docker run -it alpine:curl sh
/ # curl https://anybox.fr > anybox.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 25739  100 25739    0     0  93126      0 --:--:-- --:--:-- --:--:--  103k
/ # exit

Attention Ayez en tête que par défaut lors de la copie d'un container Docker il est mis en pause le temps de créer l'image.

Construisons une image depuis un Dockerfile

Faisons la même chose dans un docker file /tmp/alpinecurl/Dockerfile:

FROM alpine
RUN apk update 
RUN apk add curl

Attention Ce Dockerfile ne suit pas les bonnes pratiques, nous verrons pourquoi un peu plus loin

Dockerfile documentation

Construisez l'image docker depuis le Dockerfile ci-dessus

/tmp/alpinecurl$ docker build -t alpinecurl .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM alpine
 ---> 2a250d324882
Step 1 : RUN apk update
 ---> Running in 17b53395dc3c
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.3-28-gef388c9 [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.3-9-gfc38db2 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5858 distinct packages available
 ---> 8054303790e2
Removing intermediate container 17b53395dc3c
Step 2 : RUN apk add curl
 ---> Running in 0f88f742a236
(1/4) Installing openssl (1.0.2g-r0)
(2/4) Installing ca-certificates (20160104-r2)
(3/4) Installing libssh2 (1.6.0-r1)
(4/4) Installing curl (7.47.0-r0)
Executing busybox-1.24.1-r7.trigger
Executing ca-certificates-20160104-r2.trigger
OK: 7 MiB in 15 packages
 ---> bd3c413e1d5e
Removing intermediate container 0f88f742a236
Successfully built bd3c413e1d5e

Lister les images

docker images

les couches (Layers)

Info La plus part des commandes du Dockerfile crée des images intermédiares

docker images -a

Attention Docker utilise ces images intermédiaires comme cache1 lors de la construction d'une nouvelle image, le comportement dépendant de la commande.

FROM alpine
RUN apk update && apk add curl

Tags

Attention La mise à jour d'une image existante ne met pas à jour les containers existants

Supprimer des images

docker rmi alpinecurl

definition

Une image Docker est un modèle en lecture seule, Par exemple, une image est basée sur un système d'exploitation, peut contenir Nginx et votre application web installée dedans.

Les images sont utilisées pour créer les containers docker.

1. [Comportement du cache lors du build](https://github.com/docker/docker/

blob/master/docs/userguide/eng-image/dockerfile_best-practices.md#build-cache)