29 Jul 2019, 00:00

Docker

Share

Une source intéressante
Images, conteneurs et volumes
Dockerfile build

Installation sous Debian

  • On install avec

    sudo apt install docker.io
    

    à partir de buster ; sinon, utiliser le site docker.io.

    • Puis on peut faire ```

sudo adduser user docker

pour ne pas avoir à taper sudo à chaque commande.

## Gestion des images

* Chercher une image Debian officielle, en se basant sur le score de l'image

docker search –filter=stars=1000 debian


* Récupérer cette image en local (stocké dans /var/lib/docker/, en grosse partie sous forme de diff dans overlay2/ )
```sh
docker pull debian:tag
# si :tag est omis, docker cherchera :latest
  • Créer une image depuis un Dockerfile

    # In folder containing the Dockerfile
    docker build -t "my-image123:test" .
    
    • Pour supprimer une image

      docker rmi my-image123:test
      # on peut aussi utiliser l'id de l'image
      

docker build

Sert à génerer des images modifiées à partir d’images existantes.
Utilise un fichier Dockerfile (nom non négociable).
Celui-ci est formaté avec une instruction FROM qui définit l’image de base utilisée. Ce peut être un nom type debian ou un ID type 00bf7fdd8baf

On peut utiliser RUN pour lancer des instructions shell pour modifier notre image. Par exemple

docker build -t nom:tag /path/to/folder/with/Dockerfile

–rm=false : permet de ne pas supprimer les conteneurs intermédiaires (cache), même après un build successful

Gestion des conteneurs

Un conteneur est instancié à partir d’une image.

  • Créer un conteneur à partir de cette image

    # en version simple
    docker create debian
    # qui va chercher debian:latest
    # on peut aussi faire
    
    # en plus complet
    docker create -ti --name my-app123 --hostname app --net my-net123 debian:tag welcome-command
    # les options doivent être avant le nom de l'image de base
    # on peut spécifier, après le nom d'image, la commande à exécuter (typiquement bash)
    # -t pour --tty, ce qui permettra de lancer le conteneur avec un shell root@truc:/# . Sans ça, il se coupe si rien à faire
    # -i pour --interactive , ce qui laissera la porte ouverte au conteneur pour recevoir des commandes (STDIN ouvert)
    # si aucun nom s'est spécifié, Docker en génerera un poétique
    # si aucun hostname n'est spécifié, il sera géneré aléatoirement
    # --net ou --network permet d'attacher le conteneur à un réseau choisi
    
  • Démarrer ce conteneur

    docker start my-app123
    

    Le conteneur est lancé, mais ne s’affiche pas dans notre terminal (juste son nom).
    Il faut l’attacher, pour avoir le shell à l’écran et pouvoir interagir.

    docker attach my-app123
    

    Ou encore

    docker exec -it container_name bash
    

    On peut directement attacher le shell lors de la création du conteneur, mais il faut alors spécifier l’option -i pour pouvoir interagir avec le conteneur (taper des commandes).

    docker start -ia my-app123  # --interactive --attach
    # -a , --attach pour voir l'état du conteneur
    # -i pour pouvoir taper des commandes
    

    On peut ensuite détacher le conteneur avec Ctrl-P -> Ctrl-Q.

  • Éteindre ce conteneur

    docker stop my-app123
    
    docker kill my-app123 # pour forcer l'extinction
    
    • Lister les conteneurs

      docker ps
      # pour lister les conteneurs en cours d'éxécution
      
docker ps -a
# pour lister tous les conteneurs, même éteints.
  • Supprimer un conteneur précis

    docker container rm my-app123
    # on peut aussi utiliser l'id
    
    • Supprimer tous les conteneurs qui ne snt pas en train de tourner

      docker container prune
      # -f si on souhaite ne pas avoir de prompt de confirmation
      

docker run

Combine docker pull, docker create et docker start

docker run name # télécharge si nécessaire l'image "name:latest", crée un container avec un nom aléatoire, et le lance
# on peut passer à docker run les mêmes arguments que docker create
docker run --name="my-app123" -p 80:80 -e TERM=xterm -d --net my-net123 --ip 172.18.0.23 demo-docker

Réseau

Doc chez docker

Docker crée une interface virtuelle pour chaque réseau créé. Par défaut, c’est la carte docker0 qui crée le réseau bridgé 172.17.0.0/24 avec l’adresse 172.17.0.1.
Il y’a différents types de réseau : bridge (réseau virtuel “simple”, choix par défaut), host (le conteneur se connecte directement via la pile réseau de la carte de l’hôte), overlay (surtout pour le swarm), macvlan.

On peut créer des réseaux (bridgés) définis sur mesure. Ces réseaux se comporteront différemment du réseau par défaut. Notamment, les machines pourront communiquer entre elles via leur adresse IP, mais également via le nom de conteneur. De plus, tous les ports de chaque conteneur seront ouverts vers tous les autres conteneurs sur le même réseau (et, par défaut, aucun port ouvert vers l’extérieur). Un conteneur peut être connecté à plusieurs réseaux.
Chaque conteneur lancés aura aussi une interface virtuelle type veth1234567.

  • lister les réseaux

    docker network ls
    
    • voir le détail d’un réseau sh docker network inspect network-name
  • créer un réseau

    docker network create --subnet 172.18.0.0/24 my-net123
    
    • lancer un container sur un network sh docker run --net my-net123 --ip 172.18.0.23
  • Connecter un conteneur sur un réseau (peut être fait à la volée pour un réseau déifni, mais le conteneur doit être éteint pour le faire sur le réseau par défaut docker0)

    docker network connect my-net123 my-app123
    
    • Déconnecter un conteneur d’un réseau (peut être fait à la volée pour un réseau déifni, mais le conteneur doit être éteint pour le faire sur le réseau par défaut docker0) sh docker network disconnect my-net123 my-app123
  • Supprimer un réseau

    docker network rm my-net123
    
    • retirer les réseaux inutiles bash docker network prune

Exposer un port sur un conteneur déjà lancé

Troubleshooting

Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

Signifie que le port sur lequel on essaye de lancer une machine est déjà pris par une autre machine.