# Comment partager 1 conteneur BDD avec plusieurs autre conteneurs

Source : https://www.cbtnuggets.com/blog/devops/how-to-share-a-mysql-db-with-multiple-docker-containers

# Partager 1 conteneur BDD avec plusieurs autres conteneur

### Comment partager un conteneur de BDD avec les autres ?

Pour ce faire nous allons mettre en place un nouveau réseau (Network) et connecter les conteneurs entre eux via ce nouveau réseau. L'architecture pourra être schématisé de la manière suivante :

<div drawio-diagram="14"><img src="https://wiki.mira-ceti.ovh/uploads/images/drawio/2022-07/f5RK5CfhuZGycYn3-drawing-5-1657632248.png" alt=""/></div>

#### 1/ Créer le nouveau Network

La création d'un nouveau réseau avec Docker est très simple. Il suffit d'exécuter la commande suivante :

```shell
sudo docker network create "<new_network_name>"
```

Nous pouvons vérifier la création du réseau avec la commande suivante :

```shell
sudo docker network list
```

Ce qui donne la sortie :

```shell
user@servername:~$ sudo docker network list
NETWORK ID     NAME                DRIVER    SCOPE
29f7ba793880   bddnet              bridge    local
21bac3cf5868   bridge              bridge    local
035d5327faeb   host                host      local
041e2c568093   none                null      local
```

Nous pouvons voir que le Network `<span style="font-family: Lucida Console, DejaVu Sans Mono, Ubuntu Mono, Monaco, monospace;"><span style="font-size: 11.76px; white-space: pre-wrap; background-color: #4099ff;">bddnet</span></span>` existe bien.

#### 2/ Créer le conteneur BDD

Après avoir créé le réseau, nous allons maintenant créer le conteneur de la base de données et le connecter a ce nouveau réseau.

Nous pouvons créer un conteneur avec la commande suivante :

<p class="callout info">Un point important dans cet étape, c'est de donner un nom au conteneur de BDD, il sera plus facile par la suite de le lier aux autres conteneurs.</p>

```shell
sudo docker run -d --name postgres --network bddnet -e POSTGRES_USER="postgres" 
```

Ou via un docker compose :

```YAML
version: '3.8'

services:
  db:
    image: postgres:14-alpine
    container_name: postgres			# Nom du conteneur de BDD
    restart: always
    networks:
      - bddnet							# On lie ce conteneur au nouveau réseau
    ports:
      - '5432:5432'
    volumes:
      - /var/lib/postgres/data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=passwordPostgres

volumes:
  postgres-data:
networks:
  bddnet:		# On précise que le réseau déclaré au dessus existe déjà
    external: true
```

#### 3/ Connecter les autres conteneurs 

De la même manière que la création du conteneur de base de données nous allons créer des conteneur et les connecter sur le nouveau réseau.

```shell
sudo docker run -d --name website --network bddnet -p 80:8080 -e URL_SITE="http://exemple.com" -e DB_HOST="postgres" website
```

<p class="callout info">L'étape importante dans la création d'un conteneur utilisant le service d'un autre conteneur est : qu'il faut mettre **le nom du conteneur de destination** dans la variable d'environnement host. </p>

Cet étape est plus visuel dans un docker compose :

```YAML
version: '3'

services:
  web:
    image: website:latest
    container_name: website
    networks:
      - bddnet					# On lie ce conteneur au nouveau réseau
    environment:
      DB_TYPE: postgres
      DB_HOST: postgres			# Nom du conteneur de BDD
      DB_PORT: 5432
      DB_USER: user
      DB_PASS: userPwd
      DB_NAME: bddname
    restart: unless-stopped
    ports:
      - "80:80"

networks:
  bddnet:						# On précise que ce réseau existe déjà
    external: true
```

Il suffit de répéter cet étape a chaque fois que l'on souhaite connecter un conteneur au conteneur de BDD.