# Werken met meerdere omgevingen in Docker (Test vs Productie)

Als je in de toekomst een aparte **testomgeving** en **productieomgeving** wilt draaien met Docker, is dit heel eenvoudig te realiseren met Docker Compose. De sleutel hiervoor is het gebruik van een _basisconfiguratie_ en _omgevingsspecifieke overrides_.

Dit is hoe het eruit komt te zien:

## 1. De Bestandsstructuur

Je splitst je ene `docker-compose.yml` bestand op in drie bestanden:

1. `docker-compose.yml` (De gedeelde basis voor beide omgevingen)
2. `docker-compose.prod.yml` (Specifiek voor productie: live poorten, live database)
3. `docker-compose.test.yml` (Specifiek voor test: test poorten, test database)

**docker-compose.yml (Basis):**
Hierin definieer je de algemene instellingen zoals de images en de build-contexten. Je laat poorten en specifieke `.env` bestanden nog even weg.
```yaml
version: '3.8'
services:
  db:
    image: mariadb:10.11
    restart: always
    volumes:
      - db_data:/var/lib/mysql

  server:
    build:
      context: ./server
      dockerfile: Dockerfile
    restart: always

  client:
    build:
      context: ./client
      dockerfile: Dockerfile
    restart: always

volumes:
  db_data:
```

**docker-compose.prod.yml (Productie Overrides):**
Hierin definieer je de productie-specifieke poorten en koppel je de productie `.env`.
```yaml
version: '3.8'
services:
  db:
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASS_PROD}
      MYSQL_DATABASE: coin_trader_live

  server:
    ports:
      - "3005:3005"
    env_file:
      - ./server/.env.production

  client:
    ports:
      - "80:80" # Of 8080 als je een reverse proxy hebt
```

**docker-compose.test.yml (Test Overrides):**
Hier doe je exact hetzelfde, maar dan voor de testomgeving, met andere poorten zodat ze niet botsen met productie.
```yaml
version: '3.8'
services:
  db:
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASS_TEST}
      MYSQL_DATABASE: coin_trader_test

  server:
    ports:
      - "3006:3006" # Andere poort dan productie!
    env_file:
      - ./server/.env.test

  client:
    ports:
      - "8081:80" # Andere poort dan productie!
```

## 2. Het Opstarten van de Omgevingen

Nadat je deze bestanden hebt aangemaakt, vertel je Docker met een vlaggetje (`-f` wat staat voor _file_) welke configuratie hij moet combineren.

**Starten van de Productieomgeving:**
```bash
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build
```
*Dit mergt de basis en de prod bestanden samen en start de containers.*

**Starten van de Testomgeving:**
Je kunt ervoor kiezen om in je testomgeving alles een andere prefix mee te geven met `-p` (projectnaam) zodat de containers los van productie draaien:
```bash
docker-compose -p coin-test -f docker-compose.yml -f docker-compose.test.yml up -d --build
```

### Samenvattend
Door simpelweg een extra `docker-compose.[omgeving].yml` aan te maken, kun je onbeperkt verschillende omgevingen lanceren (dev, test, acc, prod) op dezelfde server, zolang je zorgt dat de **poorten** en de **database-namen** in de override bestanden niet met elkaar in conflict komen. Geen enkele aanpassing aan de code of de actuele `Dockerfile` is verder benodigd!
