« Docker » : différence entre les versions
(→run) |
|||
(3 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 25 : | Ligne 25 : | ||
# --rm : Automatically remove the container when it exits | # --rm : Automatically remove the container when it exits | ||
# -p 8080:80 : mapping du port 8080 du host vers le port 80 du container | # -p 8080:80 : mapping du port 8080 du host vers le port 80 du container | ||
# -w /path/to/dir/ : set working directory | |||
# --add-host=host.docker.internal:host-gateway : allow the container to access the host DNS (ex: localhost) | |||
</kode> | </kode> | ||
* [https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66 How to connect to the Docker host from inside a Docker container?] | |||
== [https://docs.docker.com/engine/reference/commandline/start/ start] == | == [https://docs.docker.com/engine/reference/commandline/start/ start] == | ||
Ligne 141 : | Ligne 144 : | ||
= Exemples = | = Exemples = | ||
== [https://github.com/dotnet/dotnet-docker/blob/main/samples/build-in-sdk-container.md .NET SDK] == | |||
<kode lang='bash'> | |||
# pull the docker image for dotnet sdk 6.0 | |||
docker pull mcr.microsoft.com/dotnet/sdk:6.0 | |||
# run | |||
docker run --rm -v $(pwd):/app -w /app mcr.microsoft.com/dotnet/sdk:6.0 dotnet publish -c Release -o out | |||
</kode> | |||
== [https://hub.docker.com/_/php PHP] == | == [https://hub.docker.com/_/php PHP] == | ||
<kode lang='bash'> | <kode lang='bash'> | ||
Ligne 228 : | Ligne 240 : | ||
= [https://docs.docker.com/compose/gettingstarted/ Docker Compose] = | = [https://docs.docker.com/compose/gettingstarted/ Docker Compose] = | ||
<filebox fn='docker-compose.yml'> | <filebox fn='docker-compose.yml'> | ||
version: '3. | version: '3.9' | ||
services: | services: | ||
db: | db: | ||
container_name: 'wiki-mariadb' | container_name: 'wiki-mariadb' | ||
image: mariadb:10. | image: mariadb:10.5.8 | ||
restart: always | restart: always | ||
environment: | environment: | ||
Ligne 242 : | Ligne 254 : | ||
wiki: | wiki: | ||
container_name: 'wiki-mediawiki' | container_name: 'wiki-mediawiki' | ||
image: mediawiki:1. | image: mediawiki:1.35.1 | ||
restart: always | restart: always | ||
ports: | ports: |
Dernière version du 10 juin 2023 à 13:39
Liens
Généralités
Docker permet de créer des environnements isolés du reste du système.
Il ne permet pas de faire de virtualisation et donc de faire fonctionner d'autres OS.
Couplé avec un système de virtualisation (Hyper-V), il permet de créer des environnements isolés sur d'autres OS virtualisés (containers Linux sous un OS Windows).
- une image représente le programme avant son installation (installer ou une archive zip)
- un container représente le programme une fois installé
Les images dockers sont pour les systèmes 64 bits. |
Container
Un container est une instance d'une image. Il est créé à partir d'une image mais ne modifie jamais celle-ci.
run
Lance une commande dans un nouveau container. Téléchargement de l'image si besoin et création du container.
docker run <Repository<:Tag>> # --name <ContainerName> # -it : open a shell on the container # -d : detach, run container in background and print container ID # -v <LocalPath>:<ContainerPath> : monter un dossier local dans le container (-v c:/local/folder:/media/docker/folder) # --rm : Automatically remove the container when it exits # -p 8080:80 : mapping du port 8080 du host vers le port 80 du container # -w /path/to/dir/ : set working directory # --add-host=host.docker.internal:host-gateway : allow the container to access the host DNS (ex: localhost) |
start
# démarrer d'un container docker start <ContainerName ou ContainerId> # -ai : open a shell on the container # arrêter un container docker stop <ContainerName ou ContainerId> |
autres
# lister les containers actifs docker ps # -a tous les containers # lister tous les containers et leur tailles docker ps -as --format "{{.Names}} \t{{.Size}}\t\t{{.Image}}" # info sur un container docker inspect <ContainerName ou ContainerId> # get the IPs of all the running containers docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) # renommer un container docker rename <ContainerName> <NewContainerName> # supprimer un container docker rm <ContainerName ou ContainerId> # supprimer tous les containers docker rm $(docker ps -a -q) # se connecter au container via un terminal bash docker exec -ti <ContainerName> /bin/bash # -t : tty, allocate a pseudo-TTY # -i : interactive, keep STDIN open even if not attached # -e LANG=C.UTF-8 , force the encoding to utf8 # Ctrl+P+Q pour sortir du terminal bash sans tuer le processus # exécuter une commande dans un container docker exec <ContainerName> touch /tmp/test # -e VAR=1 définit une variable d'environnement # -w /root change le working directory # copier un fichier dans un container docker cp /path/local-file.txt <ContainerName>:/tmp/file.txt # suivre le log d'un container en direct docker logs -f <ContainerName> # lister les volumes docker volume ls # supprimer tous les volumes docker volume rm $(docker volume ls -q) |
Images
# lister les images docker images # télécharger une image depuis Docker Store docker pull <Repository<:Tag>> # sauvegarder l'état du container dans une image docker commit <ContainerId> <ImageName> # supprimer une image docker rmi <Repository:<Tag> ou ImageId> # supprimer toutes les image docker image rm $(docker images -a -q) # renommer une image : créer un nouveau tag et supprimer l'ancien docker tag [image_ID] [Nouveau_Tag] docker rmi [Ancien_Tag] # lister les dangling images docker images -f dangling=true # supprimer les dangling images docker images purge # rechercher une image sur docker store docker search <image name> |
Images utiles:
- ubuntu
- debian
- alpine
- microsoft/dotnet
- nginx
build
# use Dockerfile. Build context . docker build -t [image-name] . # use Other-Dockerfile. Build context . docker build -t [image-name] -f ./Other-Dockerfile . |
Dockerfile |
FROM [image-name] RUN [command] COPY [source] [destination] |
Avec COPY, la source doit se trouver dans le build context. |
Exemples
.NET SDK
# pull the docker image for dotnet sdk 6.0 docker pull mcr.microsoft.com/dotnet/sdk:6.0 # run docker run --rm -v $(pwd):/app -w /app mcr.microsoft.com/dotnet/sdk:6.0 dotnet publish -c Release -o out |
PHP
# apache avec php docker run -dit --name apache-php -p 8080:80 -v /host/path:/var/www/html php:7.2-apache |
Dockerfile |
FROM php:7.2-cli COPY . /usr/src/myapp WORKDIR /usr/src/myapp CMD [ "php", "./your-script.php" ] |
apache
docker run -dit --name apache -p 8080:80 -v /host/path:/usr/local/apache2/htdocs/ httpd |
mariadb
docker-compose.yml |
image: mariadb restart: always environment: MYSQL_ROOT_PASSWORD: *** # optional, create a database and a user with full rights on that db MYSQL_DATABASE: mydb MYSQL_USER: myuser MYSQL_PASSWORD: *** # bugfix MYSQL_INITDB_SKIP_TZINFO: 1 |
Restore sql dump file
Depuis un hôte Linux:
# restore sql dump file docker exec -i [mariadb-comtainer] sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /path/host/dump.sql |
Depuis un hôte Windows:
# copy the sql dump file from the host to the container docker cp sql-dump.sql [mariadb-container]:/ # restore the sql dump docker exec [mariadb-container] sh -c 'mysql -u root -p$MYSQL_ROOT_PASSWORD -D mydb -e ''source sql-dump.sql;''' # autre solution, fonctionne mais peut créer des problème d'encoding get-content C:\path\host\dump.sql | docker exec -i [mariadb-container] exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" |
mysql
docker-compose.yml |
image: mysql command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: *** # optional, create a database and a user with full rights on that db MYSQL_DATABASE: mydb MYSQL_USER: myuser MYSQL_PASSWORD: *** |
borg
# créer un container à partir de l'image archlinux # monter Documents dans /media/data docker run -v c:/Users/<user>/Documents:/media/data --name borg -ti alpine # depuis le container # màj apk update apk upgrade # màj puis installer borg apk add borgbackup # se connecter au container docker exec -ti borg ash |
Swarm mode
Faire fonctionner plusieurs engine en même temps (ex: plusieurs services qui communiquent entre eux).
Docker Compose
docker-compose.yml |
version: '3.9' services: db: container_name: 'wiki-mariadb' image: mariadb:10.5.8 restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: mediawikidb # bugfix MYSQL_INITDB_SKIP_TZINFO: 1 wiki: container_name: 'wiki-mediawiki' image: mediawiki:1.35.1 restart: always ports: - 8080:80 |
# Build images if needed # create containers if they don't exist yet or if docker-compose.yml file has changed # start the containers docker-compose up # -d to run in background # to see what is currently running docker-compose ps # stop the containers docker-compose stop # stop the containers and remove the containers and images created during ‘docker-compose up’ docker-compose down # executes a command in a running container docker-compose exec [service name] [command] # displays log output from service docker-compose logs -f [service name] # list images docker-compose images |
Installation
# installer docker et docker-compose pacman -S docker docker-compose # ajouter l'utilisateur au group docker sudo gpasswd -a $USER docker # Anyone added to the docker group is root equivalent # se reloguer ne semble pas suffire, il faut redémarrer # démarrer le service systemctl start docker # vérifier que le service fonctionne docker info |
Image location
/var/lib/docker
Surcharge de docker.service pour le changement de l'emplacement de stockage des images:
/etc/systemd/system/docker.service.d/docker-storage.conf |
[Service] ExecStart= ExecStart=/usr/bin/dockerd --data-root=/path/to/new/location/docker -H fd:// |
Erreurs
Your Linux kernel version is not supported for running docker
Linux kernel version 3.8.x.x-x is not supported for running docker. Please upgrade your kernel to 3.10.0 or newer.
Windows
À l'installation, choisir entre conteneur Windows et Linux.
Au lancement Docker demande l'activation d'Hyper-V (ce qui n'est pas compatible avec VirtualBox) et de Containers features.
Activer Hyper-V à la main: Menu → Turn Windows features on or off → cocher Hyper-V
- Historiquement Windows utilisait Hyper-V pour faire tourner une VM Linux dans laquelle était installée Docker.
- Maintenant, Windows peut faire tourner nativement des conteneurs Linux sans VM.
Windows Containers on Windows 10
Monter un dossier host dans un container
- Clique-droit sur l'icône Docker → Settings → Shared Drives
docker run -v [Host_path]:[Container_path] [image] docker run --mount source=[Host_path],target=[Container_path] [image] |
Installation
choco install docker-desktop # nécessite de se déloguer puis de se loguer à nouveau pour que les nouveaux droits utilisateur soient appliqués |
docker-desktop inclut Docker Engine, Docker CLI client, Docker Compose, Docker Machine, et Kitematic. |
GUI
Kitematic
Clique-droit sur l'icône docker → Kitematic
Si les flèches du clavier ne fonctionne pas c'est parce qu'EXEC à été lancé avec sh Entrer la commande bash |
Portainer
Installation sur Windows avec container Linux
md C:\ProgramData\Portainer docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v C:\ProgramData\Portainer:/data portainer/portainer |
Error response from daemon: driver failed programming external connectivity on endpoint nervous_meninsky (5b7b910bf03ed74ba38b7dc442b6cc6c159ad8bad75b482884de72cd5a555ad4): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:9000:tcp:172.17.0.2:9000: input/output error.