Docker

De TechWik
Aller à : navigation, rechercher

commandes docker-ce

instances

  • démarrer :
 $ docker run [-ai] [--name myOwnName] <image>
 $ docker start [-ai] <instance>
  • demarrer en interactif avec un shell (ne lance pas l'éventuelle commande CMD). en supprimant l'instance à sa sortie.
 $ docker run --rm -it <image> sh
  • attacher avec un shell a une image active
 $ docker exec -it <image> sh
  • arrêter:
 $ docker stop <image>

images

  • push/pull :
 $ docker image ls
 $ docker images
  • push/pull :
 $ docker pull <image>
  • renommer une image
 $ docker image ls
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 c7_dev              latest              744765ef7a95        4 days ago          333MB
 $ docker tag c7_dev:latest c7tools:1.0
 $ docker image ls 
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 c7tools             1.0                 744765ef7a95        4 days ago          333MB
 c7_dev              latest              744765ef7a95        4 days ago          333MB
  • suppression/pull :
 $ docker image rm <image>...
 $ docker rmi <image>...
  • supprimer les images inutilisées :
 $ docker image prune
  • inspecter les images :
 $ docker inspect <image>

nettoyage

  • supprimer les ressources inutiles (images et instances stoppées):
 $ docker system prune

Fabriquer des images

commandes image build

Depuis le répertoire contenant le Dockerfile

 $ docker builmt [-t <name>[:<vers>]] . 

stockage docker

Voir

 $ docker image inspect <image>
 $ docker volume inspect <volume>
 $ docker inspect <instance>
 $ sudo ls /var/lib/docker 
 builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
 $ sudo ls /var/lib/docker/overlay2

Nettoyage des volumes

 # un volume précis: 
 $ docker volume rm <volid>
 # tous les volumes non utilisés (volumes anonymes d'instances arrêtées par ex)
 $ docker volume

Dockerfile

partage de dossiers avec le conteneur : "bind mounts"

Pas de déclaration dans le Dockerfile (c'est pour les volumes anonymes)

A l'execution d'un conteneur:

 $ docker run -v $(pwd)/logs:/app/logs $(pwd)/ro_data:/app/ro_data:ro  myimg
 ou équivalent avec la commande mount 
 $ docker run --mount type=bind,source=$(pwd)/logs,target=/app/logs \
     --mount type=bind,source=$(pwd)/ro_data,target=/app/ro_data,readonly 

L'image voit le contenu du répertoire logs, et les logs écrits dedans donc persistants. L'image voit le contenu du répertoire ro_data en lecture seule.

voir https://docs.docker.com/storage/bind-mounts/ , https://docs.docker.com/storage/volumes/

Réseau

créer un réseau

Par défaut, réseau créé en mode "bridge" (les conteneurs sont résolus par leur nom à l'intérieur d'un même réseau).

 $ docker network create [--driver bridge] mynet1

Autres drivers:

  • host: pour des conteneur "standalone" l'isolation avec le système hôte est supprimée, ils partagent le même réseau
  • overlay: Connecter des conteneurs tournant sur plusieurs hôte. Mode "Swarm" seulement, presque obsolète.
  • macvlan: force une adresse MAC au container.
  • none: pas de réseau.
  • autres 3PP à installer

associer des conteneurs à un réseau

Au lancement, siomplement mentionner le réseau

 $ docker run -network my-network --name cont1 my-image
 $ docker run -network my-network --name cont2 my-other-image

Les 2 conteneurs cont1 et cont2 peuvent communiquer.

Associer 2 réseau à un même conteneur:

  • créer d'abord les 2 réseaux mynet1 et mynet2
 $ docker network create --driver=bridge network1 --subnet=172.19.0.0/24
 $ docker network create --driver=bridge network2 --subnet=172.19.1.0/24
  • créer l'instance de conteneur et asssocier le 2eme réseau avant de la lancer:
 $ docker create --network=network1 --name container_name containerimage:latest
 $ docker network connect network2 container_name
 $ docker start container_name

docker-compose

commandes

  • docker-compose up -d vous permettra de démarrer l'ensemble des conteneurs en arrière-plan ;
  • docker-compose ps vous permettra de voir le status de l'ensemble de votre stack ;
  • docker-compose logs -f --tail 5 vous permettra d'afficher les logs de votre stack ;
  • docker-compose stop vous permettra d'arrêter l'ensemble des services d'une stack ;
  • docker-compose down vous permettra de détruire l'ensemble des ressources d'une stack ;
  • docker-compose config vous permettra de valider la syntaxe de votre fichier docker-compose.yml.

Astuces divers points

communication image docker vers un service sur la machine hôte

au lieu de localhost, utiliser le pseudo-domaine 'host.docker.internal'

commandes docker sans sudo

Message d'erreur:

 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get     
 http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json: dial unix /var/run/docker.sock: connect: permission denied
 
 $ ls -l /var/run/docker.sock
 srw-rw----. 1 root docker 0 Nov 17 14:29 /var/run/docker.sock

Ajouter le groupe docker a l'utilisateur

 $ sudo usermod -a -G docker myusername

Trouver les images dépendant d'une image

Cas d'usage: supprimer une image retourne l'erreur "image has dependent child images"

 $ docker image rm 7f6c67ae7dae 
 Error response from daemon: conflict: unable to delete 7f6c67ae7dae (cannot be forced) - image has dependent child images

définir la fonction (ex dans bashrc)

 docker_image_desc() {
   for image in $(docker images --quiet --filter "since=${1}"); do
     if [ $(docker history --quiet ${image} | grep ${1}) ]; then
       docker_image_desc "${image}"
     fi
   done
   echo "${1}"
 }

et:

 $ docker_image_desc 7f6c67ae7dae 
 76b749bf3727
 7f6c67ae7dae