Introduction à Docker
Préambule
Ces slides ont été utilisés pour animer un TD à l'INSA de Lyon.
C’est un extrait de la formation
Docker pour les développeurs.
Principes de base
- Fonctionnement
- Usages
- Ecosystème
Fonctionnement de Docker
Docker allows you to package an application with all of its dependencies into a standardized unit for software development.
Architecture
- Isolation
- 1 conteneur = 1 application

Architecture
- Virtual Machine vs Container


Architecture
- Client / Serveur
En développement
En production
- Déploiement
En production
- Cluster
Ecosystème
Docker Engine
Docker Registry / Hub
Docker Compose
Docker Machine
Docker Swarm
- …

Premiers pas
- Installation
- Récupérer une image
- Lancer un conteneur
Installation sous Linux
- Client
- Application Linux
- Serveur
- Daemon Linux.
Installation sous Linux
- Prerequis
- Kernel >= 3.10
- 64 bits
- Dépots natifs
apt-get purge lxc-docker*
apt-get purge docker.io*
- Dépôts Docker (automatique)
curl -fsSL https://get.docker.com/ | sh
Installation sous Linux
- Dépôts Docker (manuel)
# Clés GPG
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /usr/.../docker-archive-keyring.gpg
# Déclarer la source
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/...] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# C'est bon, on peut installer Docker
apt update
apt install docker-ce
Installation sous Linux
- Avec sudo
sudo docker help ...
- Sans sudo
sudo addgroup $USER docker
docker help ...
Installation sous Linux
- Serveur distant
export DOCKER_HOST=docker.sewatech.fr
Installation sous MacOS
- Client
- Application MacOS
- Serveur
- Linux VM
Docker Desktop
- Application MacOS ou Windows
- Docker Engine
- Docker Compose
- Docker Content Trust
- Kubernetes
- Credential Helper
- Docker Dashboard
- Development Environments
(preview) - Multi-arch : run et build
(amd64, arm64v8,…) - $$
(sous certaines conditions)
Docker Desktop
- for Mac
- Processeur Intel
- MacOS >= 3 dernières versions
- Double-click, Drag & Drop,…
- for Apple silicon
- Processeur Apple silicon
- Rosetta 2 optionnel
- Double-click, Drag & Drop,…

Docker Desktop
- Homebrew Cask
- Docker for Mac
brew install --cask docker
- Docker Toolbox
brew cask install docker-toolbox
Docker Desktop
- Homebrew
- Docker for Mac (CLI)
brew install docker
- Docker ecosystem (CLI plug-ins)
brew install docker-compose
brew install docker-machine
brew install ...
Installation sous Windows
- Client
- Application Windows
- Serveur
- Linux VM
Docker Desktop
- for Windows
(WSL2 backend)- WSL2 activé
- Windows 64bits, 10 ou 11
- Next, next, next,…
- for Windows
(Hyper-V backend)- Hyper-V activé
- Windows 64bits, 10 ou 11
- Next, next, next,…

Docker Desktop
- Chocolatey
choco install docker-desktop
- Docker CLI
choco install docker-cli
- Docker Engine
choco install docker-engine
Installation
- Windows Containers
- Hyper-V activé
- Windows 64bits, 10 ou 11
- Windows Server ⩾ 2016
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force
docker container run microsoft/dotnet-samples:dotnetapp-nanoserver
Hors périmètre pour cette formation |
Installation
- Vérification de la version
~$ docker version
Client: Docker Engine - Community
Version: 20.10.12
API version: 1.41
Go version: go1.16.12
Git commit: e91ed57
Built: Mon Dec 13 11:45:33 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Client: Docker Engine - Community
Version: 20.10.12
API version: 1.41
Go version: go1.16.12
Git commit: e91ed57
Built: Mon Dec 13 11:45:33 2021
OS/Arch: linux/amd64
Récupérer une image
- Depuis Docker Hub
docker image pull hello-world
- Téléchargement…
Using default tag: latest
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabd
Status: Downloaded newer image for hello-world:latest
Démarrer un conteneur
docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working
correctly.
To generate this message, Docker took the following steps:
1. ...
2. ...
3. ...
4. ...
To try something more ambitious, you can run an
Ubuntu container with:
$ docker run -it ubuntu bash
...
Conteneurs
- Commande run
- Isolation
- Cycle de vie
Run interactif
- Attaché au terminal
docker container run -it alpine
- Téléchargement
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
Digest: sha256:c1ce85a0f7126a3b5cbf7c57676b01b37
Status: Downloaded newer image for alpine:latest
- Prompt
/#
Run détaché
- Détaché au terminal
docker container run -d httpd
- Téléchargement
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
386a066cd84a: Already exists
a11d6b8e2fac: Pull complete
c22afc84eb8c: Pull complete
Digest: sha256:10fd24b8d20ffd15cb21d4
Status: Downloaded newer image for httpd:latest
- Prompt
alexis@host ~$
Isolation des conteneurs
- File system
/# ls -l /
drwxr-xr-x 2 root root 4096 Nov 4 18:30 bin
drwxr-xr-x 2 root root 4096 Sep 12 04:09 boot
drwxr-xr-x 5 root root 380 Dec 6 23:37 dev
drwxr-xr-x 41 root root 4096 Dec 6 23:37 etc
drwxr-xr-x 2 root root 4096 Sep 12 04:09 home
drwxr-xr-x 9 root root 4096 Nov 27 2014 lib
drwxr-xr-x 2 root root 4096 Nov 4 18:28 mnt
drwxr-xr-x 2 root root 4096 Nov 4 18:28 opt
dr-xr-xr-x 137 root root 0 Dec 6 23:37 proc
...
Isolation des conteneurs
- Réseau : adresse IP
alexis@host ~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
link/ether 34:f3:9a:9a:8f:b7 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.52/24 brd 192.168.11.255 scope global wlp2s0
/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 ...
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
Isolation des conteneurs
- Réseau : ports et sockets
alexis@host:~$ ss -lnt
State Recv-Q Send-Q Local Address Peer Address
LISTEN 0 4096 127.0.0.1:53 0.0.0.0:*
LISTEN 0 0 [::]:5000 [::]:*
LISTEN 0 0 [::]:8000 [::]:*
...
/# netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Cycle de vie
Cycle de vie
- Arrêter un conteneur
- Arrêt brusque
docker container kill elegant_brahmagupta
- Arrêt propre
docker container stop elegant_brahmagupta
Cycle de vie
- Redémarrage automatique.
- Démarrage avec le daemon
docker container run --restart=always ...
- Pas de démarrage avec le daemon
docker container run --restart=unless-stopped ...
- Uniquement en cas d’erreur
docker container run --restart=on-failure:3 ...
Cycle de vie
- Liste de conteneurs
- Conteneurs démarrés
docker container ls
- Tous les conteneurs
docker container ls -a
- Conteneurs arrêtés
docker container ls --filter status=exited
Cycle de vie
- Supprimer un conteneur
- Par son nom
docker container rm elegant_brahmagupta
- Par son id
docker container rm 72371f
- Suppression automatique
- Uniquement en mode interactif
docker container run -d --rm httpd
Cycle de vie
- Ménage
- Conteneurs arrêtés
docker container rm $(docker container ls -f status=exited)
- Conteneurs arrêtés
# avec confirmation
docker container prune
# sans confirmation
docker container prune --force
Cycle de vie
- Inspection
- Complète
docker container inspect elegant_brahmagupta
- Simple
docker container inspect \
--format "{{ .RestartCount }}" \
elegant_brahmagupta
- Partielle
docker container inspect \
--format "{{json .NetworkSettings.Networks }}" \
elegant_brahmagupta
Cycle de vie
- Exécuter
- une commande dans un conteneur
docker container exec elegant_brahmagupta \
touch /app/marker
- en mode interactif
docker container exec -it elegant_brahmagupta bash
Cycle de vie
- Sortie standard
docker container logs elegant_brahmagupta
- Limité à n lignes
docker container logs --tail 10 elegant_brahmagupta
- Avec défilement
docker container logs --follow elegant_brahmagupta
Legacy commands
docker …
vsdocker container …
avant 1.13 |
depuis 1.13 |
|
|
|
|
|
|
Images
- Commit et build
- Dockerfile
- Taille des images
- Système de fichiers
Commande commit
- Conteneur ⇒ Image
- Construction
docker container commit elegant_brahmagupta sw/app
- Image ⇒ Conteneur
- Image locale
docker container run sw/app
Commande build
- Dockerfile ⇒ Image
- Construction
docker image build -t sw/app .
- Image ⇒ Conteneur
- Image locale
docker container run sw/app
Commande build
- Nom du fichier
docker image build -t sw/app --file Dockerfile-v2 .
- Git
docker image build -t sw/app \
https://github.com/sewatech/app.git
- Archive
docker image build -t sw/app app.tar.gz
Dockerfile, en-tête
- FROM
- Image de base
- Format
org/name
ouorg/name:tag
- MAINTAINER
- Auteur de l’image
FROM httpd
MAINTAINER Alexis Hassler <alexis.hassler@sewatech.fr>
Dockerfile, shell
- RUN
- Exécute une commande shell
- Ou plusieurs commandes : &&
RUN apt-get update
Dockerfile, environnement
- WORKDIR
- répertoire de travail.
- ENV
- variable d’environnement.
- USER
- utilisateur courant
Ces directives s’appliquent pour le build et le run. |
Dockerfile, contenu
- ADD
- machine hôte ⇒ image
- décompresse tar.gz
- COPY
- machine hôte ⇒ image
COPY site/ /var/www/
Dockerfile, exécution
- ENTRYPOINT
- impose la commande de démarrage
ENTRYPOINT ["/start.sh"]
- CMD
- propose une commande de démarrage
CMD ["/start.sh"]
- propose des paramètres pour ENTRYPOINT
ENTRYPOINT ["/start.sh"]
CMD ["--env=default"]
Dockerfile, exécution
- Paramètres de
docker run
- Ajoutés à ENTRYPOINT
- En remplacement de CMD
docker container run sw/app --env=dev
docker container run -it debian bash
Dockerfile, échanges
- EXPOSE
- ports ouverts dans le conteneur
- VOLUME
- répertoires à partager
Dockerfile, variables
- ARG
- pour passer un argument au build
- avec une valeur par défaut (optionnelle)
...
ARG userid=1000
...
USER ${userid}
...
ARG userid
...
USER ${userid:1000}
docker image build --build-arg userid=500 .
Dockerfile, autres métadonnées
- LABEL
- couple clé=valeur
LABEL version="1.0"
- utile pour les filtres
docker image ls --filter ...
- utile aux outils tiers
(swarm,…)
docker image inspect ...
docker container inspect ...
Dockerfile, autres métadonnées
- ONBUILD
- Pour image de base
- Au moment de la construction de l’image dérivée
- Améliore la réutilisation
ONBUILD ADD src /app/src
ONBUILD RUN build.sh /app/src
Taille des images
- Construction en couches
- Filesystem read-only
Taille des images
- 1 instruction ⇒ 1 couche
docker image build -t demo/layers .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian
---> 73e72bf822ca
Step 2 : RUN apt-get update
---> 33b20b7674a7
Step 3 : RUN apt-get install -y wget unzip
---> 859c09d07c42
Step 4 : RUN wget http://bit.ly/tomcat85
---> 6a209ff5aea1
Step 5 : RUN unzip tomcat85
---> 054d0880c62e
Step 6 : RUN rm tomcat85
---> 23b9aa4066c0
Successfully built 23b9aa4066c0
Taille des images
- Calculer la taille
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
demo/layers latest 23b9aa4066c0 18 hours ago 196.7 MB
Système de fichiers en couches
- Détail des couches
- Pour une image
- Taille par couche
docker image history demo/layers
IMAGE CREATED BY SIZE
23b9aa4066c0 /bin/sh -c rm tomcat85 0 B
054d0880c62e /bin/sh -c unzip tomcat85 13.14 MB
6a209ff5aea1 /bin/sh -c wget http://bit.ly/tomcat85 9.9 MB
859c09d07c42 /bin/sh -c apt-get install -y wget unzip 40.8 MB
33b20b7674a7 /bin/sh -c apt-get update 9.861 MB
73e72bf822ca /bin/sh -c (nop) CMD ["/bin/bash"] 0 B
<missing> /bin/sh -c (nop) ADD file:41ea5187c50115 123 MB
Système de fichiers en couches
- Fusion des couches
- … en rassemblant les commandes
docker image build -t demo/layers .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian
---> 73e72bf822ca
Step 2 : RUN apt-get update && apt-get install -y wget && ...
---> Using cache
---> ea58a71330a1
Successfully built ea58a71330a1
- ⇒ Gain de 10 Mo
Système de fichiers en couches
- Nettoyage de la couche
apt-get clean
⇒ automatiquerm -rf /var/lib/apt/lists/*
⇒ 10 Mo de gain dans notre exampleapt-get remove
d’applications inutiles
⇒ 2 Mo de gain supplémentaire
apt-get remove -y unzip wget
apt-get remove
de librairies inutile
⇒ 40 Mo de gain supplémentaires !
apt-get remove -y ca-certificates ... libtasn1-6 openssl unzip wget
Système de fichiers en couches
- Partage de couches
- Images de base
- Couches intermédiaires
Système de fichiers en couches
- Utilisation du cache
- Vitesse du build
time docker image build -t demo/layers .
...
real 2m10.920s
user 0m0.335s
sys 0m0.252s
time docker image build -t demo/layers-bis .
...
real 0m0.254s
user 0m0.012s
sys 0m0.023s
Système de fichiers en couches
- Copie du contexte
- Limiter les fichiers dans le répertoire de build
- Utiliser un fichier .dockerignore
Système de fichiers en couches
- Image de base
- Ajouter la taille dans les critères
- Rationaliser les images de base
Busybox |
1 Mo |
Alpine |
5 Mo |
Debian |
125 Mo |
Ubuntu |
130 Mo |
CentOS |
200 Mo |
Fedora |
200 Mo |
Busybox |
1 Mo |
Alpine |
9 Mo |
Debian |
180 Mo |
Ubuntu |
225 Mo |
CentOS |
245 Mo |
Fedora |
275 Mo |
Gérer les images
- Liste d’images
docker image ls
- Avec les images intermédiaires
docker image ls -a
- Sans tag
docker image ls --filter "dangling=true"
- Avec tags
docker image ls --filter "dangling=false"
Gérer les images
- Supprimer une image
- Avec ses parents
docker image rm da7ff372b5067f5
- Sans ses parents
docker image rm --no-prune da7ff372b5067f5
- Forcer
docker image rm --force da7ff372b5067f5
Gérer les images
- Ménage
- Images sans tag
docker image rm $(docker image ls -qf "dangling=true")
- Images inutilisées (1.13+)
# uniquement sans tag
docker image prune
# y compris avec tag
docker image prune --all
# sans confirmation
docker image prune --force
Legacy commands
docker …
vsdocker image …
avant 1.13 |
depuis 1.13 |
|
|
|
|
|
|
|
|
Réseau
- Exposition de ports
- Types de réseau
- Liens entre containers
- Réseaux virtuels
Exposition de ports
- Tous les ports du conteneur
docker container run --publish-all httpd
- Ports d’un conteneur
docker container port elegant_brahmagupta
- Un seul port
docker container run --publish 80 httpd
- Un port avec association explicite
docker container run --publish 8888:80 httpd
docker container run --publish 127.0.0.1:8888:80 httpd
Types de réseau
- Liste des réseaux
docker network ls
NETWORK ID NAME DRIVER SCOPE
444825ec4f4d bridge bridge local
f02e3324a3b7 host host local
64c36868c3db none null local
Types de réseau
- Réseau bridge
Types de réseau
- Réseau host
Types de réseau
- Réseau none
Communication entre conteneurs
- Liens
- Réseau bridge
- Avec des conteneurs nommés
docker container run --name db postgres
docker container run --name java --link db tomcat
# /etc/hosts
127.0.0.1 localhost
...
172.17.0.3 app 31a1bd554fd6 java
Réseaux personnalisés
- Type bridge
- Isolé
Réseaux personnalisés
- Conteneurs nommés
docker network create frontend
docker container run --net=frontend --name web sewatech/httpd
docker container run --net=frontend --name app sewatech/tomcat
/# ping web
Réseaux personnalisés
- Connexion tardive
Réseaux overlay
- Multi-hosts
- Swarm mode
- Cluster store (Consul, Etcd, ZooKeeper)
Volumes
- Partager de répertoire
- Volumes nommés
- Conteneurs de données
Partage de répertoire
- Volume
- Répertoire du host accessible en R/W
docker container run \
--volume ${PWD}/web-content:/usr/local/apache2/htdocs \
httpd
Partage de répertoire
- Volume partagé
- Volumes d’un autre conteneur
docker container run \
--volumes-from othercontainer sw/img1
docker container run \
--volumes-from othercontainer sw/img2
- Chaînage de conteneurs
docker container run -d \
--volumes-from cont0 --name cont1 sw/img1
docker container run -d \
--volumes-from cont1 --name cont2 sw/img2
Volumes nommés
- Nom choisi
docker container run --volume cli-data:/data debian
- Nom généré
docker container run --volume /data debian
Volumes nommés
- Création de volume
docker volume create --name data-vol
- Paramètres avancés
docker volume create --name data-vol \
--driver local \
--opt type=tmpfs \
--opt device=tmpfs \
--opt o=size=100m,uid=1000
Volumes nommés
- Liste des volumes
docker volume ls
- Liste des volumes inutilisés
docker volume ls --filter 'dangling=true'
Volumes nommés
- Suppression des volumes du conteneur
docker container rm --volumes cli
- Suppression d’un volume
docker volume rm cli-data
- Nettoyage
- Volumes inutilisés
docker volume rm \
$(docker volume ls -f 'dangling=true' -q)
docker volume prune
Conteneur de données
- Conteneur sans application
- Etat created
- Volume à partager avec
--volumes-from
docker container create \
--volume /dbdata \
--name datastore alpine /bin/true
Conteneur de données
- Exemple : PostgreSQL
- Conteneur de données
docker container create \
--name datastore postgres
// or (equivalent)
docker container create \
--volume /var/lib/postgresql/data \
--name datastore postgres
// or (different)
docker container create \
--volume $PWD/data:/var/lib/postgresql/data \
--name datastore postgres
- Conteneur actif
docker container run --volumes-from datastore \
--name dataaccess postgres
Conteneur de données
- Conteneur de sauvegarde
- Volume de données
- Volume de sauvegarde
docker container run --rm \
--volumes-from datastore \
--volume $(pwd):/backup \
debian tar cvf /backup/backup.tar /data
Sécurité
- User mapping
- userid(container) == userid(host)
- root
- User par défaut
Sécurité
- Dockerfile
- Utilisateur au build
- Utilisateur par défaut au run
- Par nom
USER toto
- Par uid
USER 1000
Sécurité
- Paramètre au démarrage
- Par nom
docker container run --user toto ...
- Par uid
docker container run --user 1000 ...
- Avec gid
docker container run --user 1000:20 ...
Introduction à Docker
THE END