Astuces Docker
Extraire l'ip locale d'un conteneur en fonctionnement :
docker inspect --format '{{ .NetworkSettings.IPAddress }}' nom-de-conteneur
Astuce, changer les DNS de votre instance, éditez /etc/docker/daemon.json :
{ "dns": [ "1.1.1.1", "8.8.8.8" ] }
Install docker sur Debian :
# install de sudo le cas échéant apt install sudo # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Add the repository to Apt sources: echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Commandes basiques
docker ps -a docker ps -aq (juste l id de chaque conteneur) docker images list docker exec -it container-id command (-tty -interactive) docker run -d -p 80:80 --name apache-php -v /docker:/var/www/html php:7.4-apache docker kill apache-php docker rm apache-php docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariad -> recup ip. docker run --name myadmin -d --link mariadb:db -p 9080:80 phpmyadmin docker exec -it mariadb bash docker commit -p db012f940cd7 container1 docker save -o ~/container1.tar container1 docker load -i /root/container1.tar docker run --name webserver -d -p 80:80 -p 443:443 -it debian:latest /bin/bash -l docker exec -it /bin/bash
Sauvegarde d'un container en run :
docker commit container image-custom:version docker save -o archive.tar
Install php à jour dans le conteneur :
apt install wget lsb-release apt-transport-https ca-certificates wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list apt update
Lancer un container avec une image donnée : (detach / interactive), nom : toto, alpine linux
docker run -di --name toto alpine:latest docker exec -ti toto sh docker run -tid -p 8080:80 --name web nginx:latest docker inspect toto docker start toto docker stop toto docker run -tid -p 8080:80 -v /srv/data/toto:/usr/share/nginx/html --name web nginx:latest docker volume create totovol docker volume ls docker volume inspect totovol docker run -tid -p 8080:80 --mount source=totovol,target=/usr/share/nginx/html --name web nginx:latest docker run -tid --name toto --env MYVAR="toto" ubuntu:latest docker run -tid --name toto --env-file vars.txt ubuntu:latest docker run -tid --name toto --hostname toto.io ubuntu:latest
Creer une nouvelle image customisée à partir d'une image standard :
docker commit -m "nouvelle image custom" <id_image_source> toto:custom-1.0 docker image ls docker run -tid --name imagecustom toto-custom-1.0 docker history <id_image_source>
Utilisation dockerfile :
Dockerfile c'est quoi : fichier text avec séquence de tâches -> RUN / ENV (variables d'env) / EXPOSE (port mapping) / VOLUME / COPY (entre host et conteneur) / ENTRYPOINT (processus maitre du conteneur) exemple de dockerfile :
FROM ubuntu:latest MAINTAINER hello c'est moi ENV mavariable valeur RUN apt-get update RUN apt-get install vim RUN apt-get install nmap \ && apt-get clean \ && rm -rf /tmp/* (...) VOLUME /var/www/html COPY source /toto/destination
Network :
docker network create -d macvlan \ --subnet=192.168.2.0/24 \ --ip-range=192.168.2.128/25 \ --gateway=192.168.2.254 \ --aux-address="my-router=192.168.2.129" \ -o parent=eth0 wireguard_interne ? docker built -t monimage:version . <point=dockerfile (Dockerfile en maj dans le rep courant, quoi) docker image ls docker history monimage:version docker rmi monimage:version < suppression de l image custom option "--volumes-from", pour importer les volumes d un autre conteneur
Securisation docker :
docker run -it --net host --pid host --userns host --cap-add audit_control \ -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \ -v /var/lib:/var/lib \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/lib/systemd:/usr/lib/systemd \ -v /etc:/etc --label docker_bench_security \ docker/docker-bench-security
Versioning et push/pull :
docker tag image_source:version image_dest:version
... Rajouter un "tag image_dest:version" à l'image source d'un conteneur idem pour la registry , il faut tagger l'image à push par son nomd'image complet (voir la doc gitlab par ex)
Sauvegarder un conteneur :
docker save -o dir/fichier conteneur:version docker load -i dir/fichier
Réseaux :
Le Bridge docker0 (en général 172.17.0.0/16) creer un autre réseau "bridge"
docker network create -d bridge --subnet 172.30.0.0/16 mynetwork
... et l'utiliser
docker run -tid --name conteneur1 --network mynetwork alpine
... Options de lancement réseau sur les conteneurs : --net : none --net : host --net container:nom-du-conteneur --link nom-du-conteneur > comme --net container mais ajout dans etc/host du conteneur lui-même options --dns dans le resolv.conf ou --add-host toto:ip pour rajouter dans le etc/hosts directement
Docker-compose :
...à partir d'un rep contenant le docker-compose.yml
docker-compose build docker-compose up docker-compose up -d docker-compose ps docker-compose start docker-compose stop docker-compose rm docker-compose down (stop + rm en même temps) docker-compose scale SERVICE=3 docker-compose pull (maj des images)
Mise en place d'une version spécifique
# Obtenir une version spécifique apt-cache madison docker-ce | awk '{ print $3 }' # L'installer apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
Supprimer entièrement docker :
sudo apt-get purge -y docker-engine docker docker.io docker-ce docker-ce-cli docker-compose-plugin sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce docker-compose-plugin sudo rm -rf /var/lib/docker /etc/docker sudo rm /etc/apparmor.d/docker sudo groupdel docker sudo rm -rf /var/run/docker.sock sudo rm -rf /var/lib/containerd sudo rm -r ~/.docker
