# Docker

## Commandes utiles : 

Afficher les conteneurs actifs :

```
docker ps 
```

Killer un conteneur :

```
docker stop <ID>

Ex :
docker stop d61d169912c8
```

Faire de la place sur le system d'exploitation :

```
docker system prune
```

Afficher l'ensemble des images présentes sur le système :

```
docker images -a
```

Entrer dans un conteneur :

```
docker exec --user:root -it mondocker bash
```

Stop all containers :

```
docker stop $(docker ps -a -q)
```

Sauvegarder l'image d'un conteneur en cours d'exécution :

```
docker commit [ID_DU_CONTENEUR] myimage
```

Supprimer toutes les images

```
 docker image ls | awk '{print $3}'| tail -n +2 | xargs docker image rm
```

## Créer son propre conteneur : 

Créer son propre dockerfile :

<p class="callout info">Fichier = Dockerfile</p>

```
FROM debian:9

RUN apt-get update -yq \
&& apt-get install curl gnupg -yq \
&& curl -sL https://deb.nodesource.com/setup_10.x | bash \
&& apt-get install nodejs -yq \
&& apt-get clean -y

ADD . /app/
WORKDIR /app
RUN npm install

EXPOSE 2368
VOLUME /app/logs

CMD npm run start
```

Création de l'image personnalisée :

```
docker build -t ocr-docker-build .
```

[![image-1634681327817.png](https://docs.nehemiebarkia.fr/uploads/images/gallery/2021-10/scaled-1680-/image-1634681327817.png)](https://docs.nehemiebarkia.fr/uploads/images/gallery/2021-10/image-1634681327817.png)

<p class="callout success">L'image a bien été créée ! </p>

Lancement du conteneur personnalisé :

```
docker run -d -p 2368:2368 ocr-docker-build
```

Envoyer un tcpdump dans un conteneur :

```bash
cid=<CONTAINER_ID>
sudo nsenter -n -t $(sudo docker inspect --format "{{ .State.Pid }}" "$cid") tcpdump -nnAi any not host X.X.X.X and port YYYY
```

## Créer un fichier docker-compose.yml : 

Pour GHOST :

```
version: '3'
services:
 mysql:
   image: mysql:latest
   volumes:
     - db_data:/var/lib/mysql
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: monPassword

 ghost:
   depends_on:
     - mysql
   image: ghost 
   ports:
     - "80:2368"
   restart: always
   environment:
    NODE_ENV: production
    MYSQL_ROOT_PASSWORD: monPassword
    url: http://localhost:80    

volumes:
 db_data: {}
```

Pour Wordpress :

```
version: '3'
services:
  db:
    image: mysql:latest
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "80:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress

volumes:
  db_data: {}
```

Lancement du stack :

```
docker-compose up -d  // ou docker-compose up 
```

Résultat :

<p class="callout info">Si je tente d'accéder à http://localhost:80 : </p>

<span style="text-decoration: underline;">**Lister la taille de tous les volumes :** </span>

```bash
for i in $(docker volume ls --format '{{.Name}}')
do
echo "==============================================="
echo "[$i]"
data=`docker volume inspect $i | jq -r '.[0].Mountpoint'`
du -sh $data
echo ""
echo "==============================================="
done
```

## Exemples conteneurs : 

Hello-World :

```
docker run hello-world
```

2048 :

```
docker run -d -p 8080:80 alexwhen/docker-2048
```

Google cloud SDK

```bash
docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login
```

POWERSHELL :

```
docker run -it mcr.microsoft.com/powershell
```

Dockerfile qui créer un Docker serv web qui affiche son nom (utile pour les tests de load balancing par exemple) :

```YAML
# Docker Who display him name
#
# Created by : Néhémie Barkia
# Last Update : 26/12/2023
#
# PRÉREQUITS
FROM debian:latest
RUN apt-get update -y 
RUN apt-get install apache2 php php-pdo php-mbstring php-mysql php-json php-common git -y
RUN apt-get clean
# INSTALLATION WEB 
RUN rm /var/www/html/* -r
# Insertion des informations de connexion dans les fichiers de Fix
RUN echo "<?php" >> /var/www/html/index.php
RUN echo "\$h = getenv('HOSTNAME');" >> /var/www/html/index.php
RUN echo "echo \$h" >> /var/www/html/index.php
RUN echo "?>" >> /var/www/html/index.php
#
WORKDIR /app
VOLUME /app/logs
EXPOSE 80
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

```

```
docker build  -t web_name .
```

```
docker run -d -p 8080:80 --name=srv1 web_name
docker run -d -p 8081:80 --name=srv2 web_name
docker run -d -p 8082:80 --name=srv3 web_name
```

#### Prometheus SRV 

```yaml
configs:
  prometheus_config:
    file: /etc/XXXXXXXXXXXXXXXXXX/prometheus/prometheus.yml
  prometheus_web_config:
    file: /etc/XXXXXXXXXXXXXXXXXX/prometheus/web.yml

  
services:
  prometheus:
    image: prom/prometheus:v2.53.1
    ports:
      - 9090:9090
    configs:
      - source: prometheus_config
        target: /etc/prometheus/prometheus.yml
      - source: prometheus_web_config
        target: /etc/prometheus/web.yml
    volumes:
      - type: bind
        source: /var/lib/rp-stack/prometheus
        target: /prometheus/data
    command: >
      --config.file=/etc/prometheus/prometheus.yml
      --web.listen-address="0.0.0.0:9090"
      --storage.tsdb.retention.time=30d
      --web.config.file=/etc/prometheus/web.yml

```

prometheus.yml

```yaml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: apache
    static_configs:
      - targets: [ 'httpd:8080' ]
        labels: { stack: rp-stack, service: "httpd" }
  - job_name: haproxy
    static_configs:
      - targets: [ 'haproxy:8404' ]
        labels: { stack: rp-stack, service: "haproxy" }
  - job_name: prometheus-node-exporter
    static_configs:
      - targets: ['100.102.238.131:9100']

```

web.yml

```yaml
basic_auth_users:
  user: $2b$12XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXu0C

```

<span style="text-decoration: underline;">**Installer un packet dans un conteneur debian bizzare :** </span>

```bash
apk add curl
apk add jq
```