# Astuces Docker

#### Extraire l'ip locale d'un conteneur en fonctionnement :
```bash
docker inspect --format '{{ .NetworkSettings.IPAddress }}' nom-de-conteneur
```

#### Changer les DNS de votre instance, éditez /etc/docker/daemon.json :
```bash
{
  "dns": [ "1.1.1.1", "8.8.8.8" ]
}
```

#### Install docker sur Debian :
```bash
# 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
```bash
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 :

```bash
docker commit container image-custom:version
docker save -o archive.tar
```

#### Install php à jour dans le conteneur :
```bash
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
```bash
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 :
```bash
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 :

```text
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 :

```bash
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 :

```bash
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 :

```bash
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 :

```bash
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"

```bash
docker network create -d bridge --subnet 172.30.0.0/16 mynetwork
```

... et l'utiliser

```bash
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

```bash
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

```bash
# 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 :

```bash
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
```
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9