Docker : Différence entre versions
m |
m (→images) |
||
| (32 révisions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
| − | + | = commandes docker-ce = | |
| − | + | == instances == | |
| − | |||
* démarrer : | * démarrer : | ||
| − | $ docker run <image> | + | $ docker run [-ai] [--name myOwnName] <image> |
| − | $ docker start [-ai] < | + | $ docker start [-ai] <instance> |
| − | + | ||
| − | * demarrer en interactif avec un shell (ne lance pas l'éventuelle commande CMD). | + | * demarrer en interactif avec un shell (ne lance pas l'éventuelle commande CMD). en supprimant l'instance à sa sortie. |
| − | $ docker run -it <image> sh | + | $ docker run --rm -it <image> sh |
| + | |||
| + | * attacher avec un shell a une image active | ||
| + | $ docker exec -it <image> sh | ||
* arrêter: | * arrêter: | ||
$ docker stop <image> | $ docker stop <image> | ||
| − | + | ||
| − | + | == images == | |
| + | * push/pull : | ||
| + | $ docker image ls | ||
| + | $ docker images | ||
* push/pull : | * push/pull : | ||
$ docker pull <image> | $ docker pull <image> | ||
| + | * renommer une image | ||
| + | $ docker image ls | ||
| + | REPOSITORY TAG IMAGE ID CREATED SIZE | ||
| + | c7_dev latest 744765ef7a95 4 days ago 333MB | ||
| + | $ docker image tag c7_dev:1.0 c7_dev:latest | ||
| + | $ docker image ls | ||
| + | REPOSITORY TAG IMAGE ID CREATED SIZE | ||
| + | c7_dev 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 image inspect <image> | ||
| + | * sauver/charge les images hors registry: | ||
| + | $ docker image save -o output-file.tar <image:tag> | ||
| + | $ docker image load -q -i input-file.tar | ||
| + | |||
| + | == nettoyage == | ||
| − | + | * supprimer les ressources inutiles (images et instances stoppées): | |
| − | * supprimer les ressources inutiles : | ||
$ docker system prune | $ docker system prune | ||
| − | = | + | = Fabriquer des images = |
| + | Voir d'abord https://docs.docker.com/develop/ | ||
| + | == commandes image build == | ||
| + | Depuis le répertoire contenant le Dockerfile | ||
| + | $ docker build [-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 == | == 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 : | + | A l'execution d'un conteneur: |
$ docker run -v $(pwd)/logs:/app/logs $(pwd)/ro_data:/app/ro_data:ro myimg | $ 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. bridge sur un port physique. | ||
| + | * none: pas de réseau. | ||
| + | * autres 3PP à installer | ||
| + | |||
| + | == associer des conteneurs à un réseau == | ||
| + | Au lancement, simplement 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. | ||
| + | Comme ils sont associés au même réseau, les noms de conteneurs peuvent servir à la résolution d'adresse pour communiquer entre eux sans nécessité de publier les ports utilisés uniquement en interne dans ce réseau. Par exemple cont1 est une base de données sur le port 5432, cont2 est un backend utilisant ce service. L'adresse à utiliser dans cont2 sera donc 'cont1:5432'. | ||
| + | |||
| + | Associer 2 réseaux à 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 | ||
| + | |||
| + | == Publier les ports d'un conteneur == | ||
| + | Au lancement, simplement mentionner les associations interne/externe pour rendre les ports visibles de l'extérieur du conteneur. | ||
| + | $ docker run -p1234:3456 -p 5678:7890 my-cont1 my-image | ||
| + | |||
| + | Rappel: nécessaire seulement pour des ports à visibilité externe (pas les ports utilisés dans un même réseau docker). | ||
| + | |||
| + | Le modification directe des ports dans /var/lib/docker/containers/<container-id>/hostconfig.json et config.v2.json, même sur un conteneur stoppé est écrasé au start sous rhel8/docker-ce. | ||
| + | |||
| + | Sur un conteneur existant, faire: | ||
| + | * arrêter le conteneur | ||
| + | $ docker stop my-cntid | ||
| + | * docker commit my-cntid my-new-image-tag | ||
| + | * docker -p<xxx:yyy>... | ||
= docker-compose = | = docker-compose = | ||
| Ligne 47 : | Ligne 134 : | ||
= Astuces divers points = | = Astuces divers points = | ||
| + | == communication image docker vers un service sur la machine hôte == | ||
| + | Pour un serveur sur la machine hôte (pas un autre conteneur), au lieu de localhost, utiliser le pseudo-domaine 'host.docker.internal'. | ||
| + | |||
| + | == associer des ports à un conteneur == | ||
| + | Au lancement, simplement mentionner les associations | ||
| + | $ docker run -p1234:3456 -p 5678:7890 my-cont1 my-image | ||
| + | |||
| + | Le modification directe des ports dans /var/lib/docker/containers/<container-id>/hostconfig.json et config.v2.json, même sur un conteneur stoppé est écrasé au start sous rhel8/docker-ce. | ||
| + | |||
| + | Sur un conteneur existant, faire: | ||
| + | * arrêter le conteneur | ||
| + | $ docker stop my-cntid | ||
| + | * docker commit my-cntid my-new-image-tag | ||
| + | * docker -p<xxx:yyy>... | ||
| + | |||
== commandes docker sans sudo == | == commandes docker sans sudo == | ||
Message d'erreur: | Message d'erreur: | ||
| Ligne 57 : | Ligne 159 : | ||
Ajouter le groupe docker a l'utilisateur | Ajouter le groupe docker a l'utilisateur | ||
$ sudo usermod -a -G docker myusername | $ 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 | ||
[[Category:Containers]] | [[Category:Containers]] | ||
[[Category:Docker]] | [[Category:Docker]] | ||
[[Category:Tips&Tricks]] | [[Category:Tips&Tricks]] | ||
Version actuelle datée du 15 février 2021 à 18:17
Sommaire
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 image tag c7_dev:1.0 c7_dev:latest $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE c7_dev 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 image inspect <image>
- sauver/charge les images hors registry:
$ docker image save -o output-file.tar <image:tag> $ docker image load -q -i input-file.tar
nettoyage
- supprimer les ressources inutiles (images et instances stoppées):
$ docker system prune
Fabriquer des images
Voir d'abord https://docs.docker.com/develop/
commandes image build
Depuis le répertoire contenant le Dockerfile
$ docker build [-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. bridge sur un port physique.
- none: pas de réseau.
- autres 3PP à installer
associer des conteneurs à un réseau
Au lancement, simplement 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. Comme ils sont associés au même réseau, les noms de conteneurs peuvent servir à la résolution d'adresse pour communiquer entre eux sans nécessité de publier les ports utilisés uniquement en interne dans ce réseau. Par exemple cont1 est une base de données sur le port 5432, cont2 est un backend utilisant ce service. L'adresse à utiliser dans cont2 sera donc 'cont1:5432'.
Associer 2 réseaux à 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
Publier les ports d'un conteneur
Au lancement, simplement mentionner les associations interne/externe pour rendre les ports visibles de l'extérieur du conteneur.
$ docker run -p1234:3456 -p 5678:7890 my-cont1 my-image
Rappel: nécessaire seulement pour des ports à visibilité externe (pas les ports utilisés dans un même réseau docker).
Le modification directe des ports dans /var/lib/docker/containers/<container-id>/hostconfig.json et config.v2.json, même sur un conteneur stoppé est écrasé au start sous rhel8/docker-ce.
Sur un conteneur existant, faire:
- arrêter le conteneur
$ docker stop my-cntid
- docker commit my-cntid my-new-image-tag
- docker -p<xxx:yyy>...
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
Pour un serveur sur la machine hôte (pas un autre conteneur), au lieu de localhost, utiliser le pseudo-domaine 'host.docker.internal'.
associer des ports à un conteneur
Au lancement, simplement mentionner les associations
$ docker run -p1234:3456 -p 5678:7890 my-cont1 my-image
Le modification directe des ports dans /var/lib/docker/containers/<container-id>/hostconfig.json et config.v2.json, même sur un conteneur stoppé est écrasé au start sous rhel8/docker-ce.
Sur un conteneur existant, faire:
- arrêter le conteneur
$ docker stop my-cntid
- docker commit my-cntid my-new-image-tag
- docker -p<xxx:yyy>...
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