Orchestration

Principes de base de l’Orchestration de conteneurs, application avec Docker Compose.

Lecture
Containers
Docker
Docker Compose
Orchestration
Java
Introduction à l’orchestration de conteneurs avec Docker Compose, gestion de services multi-conteneurs, réseaux et volumes.
Auteur
Affiliations

Université de Toulon

LIS UMR CNRS 7020

Date de publication

2026-01-28

Environnement et reproductibilite

Jupyter Kernel: bash

🖥️ Env Ubuntu 24.04.3 LTS / x86_64 • 🐳 Docker Client 29.1.5 / Server 29.1.5 • 🌿 Git Branch @ 7b914bd

Ce support a été généré par Quarto : les cellules sont exécutées par le noyau indiqué lors du rendu.

Certaines parties ont été rédigées avec l’assistance d’un modèle de langage ; le contenu a été relu et validé par l’auteur.

Orchestration de Conteneurs

L’orchestration consiste à coordonner plusieurs conteneurs au sein d’une même application. Si kubernetes de Google est l’outil de référence pour les déploiements complexes, docker compose offre une alternative plus simple pour les architectures modestes.

Docker compose, disponible comme plugin de Docker, permet de décrire une architecture multi-conteneurs dans un fichier YAML (docker-compose.yml). Il gère les services, volumes et réseaux avec la même syntaxe que Docker, simplifiant ainsi le déploiement d’applications conteneurisées.

PROVIDER="github" && \
REPO="ebpro/notebook-containers-intro-sample-java-helloworld" && \
BRANCH="develop" && \
gitpull.sh --provider github --quiet \
  --branch ${BRANCH} ${REPO} \
  --message "Les exemples suivants sont accessibles dans le dépôt :" && \
source get_src_dir.sh ${PROVIDER} ${REPO}

PROVIDER="github" && \
REPO="ebpro/notebook-containers-intro-sample-java-restjpa" && \
BRANCH="develop" && \
gitpull.sh --provider github  \
  --branch ${BRANCH} ${REPO} \
  --message "Les exemples suivants sont accessibles dans le dépôt :" && \
source get_src_dir.sh ${PROVIDER} ${REPO}

cd ${SRC_DIR}

✅ Updated existing repository: ebpro/notebook-containers-intro-sample-java-helloworld

Détails
git clone -b develop https://github.com/ebpro/notebook-containers-intro-sample-java-helloworld

[2026-01-28 14:36:47] Updating existing repository in /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa ✅ Updated existing repository: ebpro/notebook-containers-intro-sample-java-restjpa

Détails
git clone -b develop https://github.com/ebpro/notebook-containers-intro-sample-java-restjpa
docker-compose.yml
services:
  # Database service
  db:
    image: 'postgres:15.2-alpine'
    environment:
      - POSTGRES_USER=dba
      - POSTGRES_PASSWORD=secret  # Consider using .env file for secrets
      - POSTGRES_DB=demo-db
    volumes:
      - restjpa-pg-data:/var/lib/postgresql/data
    networks:
      - backend
    healthcheck:  # Adding healthcheck for better orchestration
      test: ["CMD-SHELL", "pg_isready -U dba -d demo-db"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Application service
  app:
    image: 'restjpa:latest'
    build: 
      context: .
      dockerfile: Dockerfile
    depends_on:
      db:
        condition: service_healthy  # Wait for db to be healthy before starting
    environment:
      - DATASOURCE_URL=jdbc:postgresql://db:5432/demo-db
      - DATASOURCE_USERNAME=dba
      - DATASOURCE_PASSWORD=secret  # Consider using .env file for secrets
    ports:
      - "8088:8080"
    networks:
      - frontend
      - backend
    restart: unless-stopped  # Adding restart policy for better reliability

# Named volumes for persistent data
volumes:
  restjpa-pg-data:
    name: restjpa-pg-data  # Explicit naming for better management

# Network configuration
networks:
  frontend:
    name: restjpa-frontend
  backend:
    name: restjpa-backend

Pour démarrer une application multi-conteneurs, utilisez la commande docker compose up dans le répertoire contenant le fichier docker-compose.yml. L’option -d (detach) permet d’exécuter les conteneurs en arrière-plan :

# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker compose --progress=quiet up -d --quiet-pull
WARN[0000] No services to build                         

La commande docker compose ls fournit une vue d’ensemble de tous les projets Docker Compose en cours d’exécution, affichant pour chacun son nom, le répertoire source, l’état des services et le nombre de conteneurs actifs.

# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker compose ls
NAME                                            STATUS              CONFIG FILES
notebook-containers-intro-sample-java-restjpa   running(2)          /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa/docker-compose.yml

La commande docker compose ps affiche les conteneurs du projet en cours, avec leurs noms générés automatiquement selon le format <projet>-<service>-<numéro>. Cette convention de nommage permet d’exécuter plusieurs instances du même projet dans différents répertoires ou de dupliquer des services sans conflits, à condition d’éviter les liaisons de volumes (bind mounts) et les mappages de ports fixes vers l’hôte.

# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker compose ps
NAME                                                  IMAGE                  COMMAND                  SERVICE   CREATED          STATUS                                     PORTS
notebook-containers-intro-sample-java-restjpa-app-1   restjpa:latest         "java -jar app.jar"      app       11 seconds ago   Up Less than a second (health: starting)   0.0.0.0:8088->8080/tcp, [::]:8088->8080/tcp
notebook-containers-intro-sample-java-restjpa-db-1    postgres:15.2-alpine   "docker-entrypoint.s…"   db        12 seconds ago   Up 11 seconds (healthy)                    5432/tcp

Docker Compose gère automatiquement les réseaux et volumes en les préfixant avec le nom du projet (par défaut, le nom du répertoire parent), permettant ainsi d’isoler les ressources entre différents projets et d’éviter les conflits de nommage, tout en facilitant leur identification et leur gestion avec des commandes comme docker compose down -v pour le nettoyage complet.

# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker network ls
NETWORK ID     NAME               DRIVER    SCOPE
300ffa5a1b7c   bridge             bridge    local
70f1a98a168f   host               host      local
6d2a2ceb1d58   none               null      local
1a745a4417d7   restjpa-backend    bridge    local
a6feae8af022   restjpa-frontend   bridge    local
# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker volume ls
DRIVER    VOLUME NAME
local     restjpa-pg-data

La commande docker compose logs permet de visualiser les journaux d’un ou plusieurs services, avec des options utiles comme -f pour suivre les logs en temps réel, --tail pour limiter le nombre de lignes affichées, et --since pour filtrer par date, facilitant ainsi le diagnostic et la surveillance des applications multi-conteneurs.

# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker compose logs --tail 5
db-1   | 2026-01-28 14:36:51.526 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

db-1   | 2026-01-28 14:36:51.537 UTC [24] LOG:  database system was shut down at 2026-01-28 14:36:49 UTC

db-1   | 2026-01-28 14:36:51.544 UTC [1] LOG:  database system is ready to accept connections

db-1   | 2026-01-28 14:37:03.332 UTC [36] ERROR:  relation "person" does not exist at character 15

db-1   | 2026-01-28 14:37:03.332 UTC [36] STATEMENT:  SELECT 1 FROM PERSON

app-1  | [EL Fine]: sql: 2026-01-28 14:37:03.353--ServerSession(1050768030)--Connection(24057252)--INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)

app-1  | [EL Fine]: sql: 2026-01-28 14:37:03.36--ServerSession(1050768030)--Connection(24057252)--INSERT INTO public.person (id, email, firstname, lastname) VALUES (1, 'a.b@ici.fr', 'a', 'b');

app-1  | [EL Fine]: sql: 2026-01-28 14:37:03.365--ServerSession(1050768030)--Connection(24057252)--INSERT INTO public.person (id, email, firstname, lastname) VALUES (2, 'c.d@la.fr', 'c', 'd');

app-1  | [EL Fine]: sql: 2026-01-28 14:37:03.371--ServerSession(1050768030)--Connection(24057252)--INSERT INTO public.person (id, email, firstname, lastname) VALUES (3, 'e.f@encore.com', 'e', 'f');

app-1  | [EL Fine]: sql: 2026-01-28 14:37:03.376--ServerSession(1050768030)--Connection(24057252)--INSERT INTO public.person (id, email, firstname, lastname) VALUES (4, 'g.h@encore.com', 'g', 'h');

Docker Compose offre plusieurs commandes pour gérer le cycle de vie des services : stop pour arrêter les conteneurs, rm pour les supprimer, restart pour les redémarrer, et down pour tout nettoyer (conteneurs et réseaux) - avec l’option -v pour inclure également la suppression des volumes, qu’ils soient nommés ou anonymes.

AvertissementAttention

La commande docker compose down -v supprime définitivement toutes les données persistées dans les volumes.

# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker compose down -v
[+] down 0/1

  Container notebook-containers-intro-sample-java-restjpa-app-1 Stopping  0.1s 

[+] down 0/1

  Container notebook-containers-intro-sample-java-restjpa-app-1 Stopping  0.2s 

[+] down 0/1

  Container notebook-containers-intro-sample-java-restjpa-app-1 Stopping  0.3s 

[+] down 0/1

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removing  0.4s 

[+] down 1/2

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Stopping  0.0s 

[+] down 1/2

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Stopping  0.1s 

[+] down 1/2

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Stopping  0.2s 

[+] down 1/2

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Stopping  0.3s 

[+] down 1/2

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Removing  0.4s 

[+] down 3/5

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Removed   0.5s 

  Volume restjpa-pg-data                                        Removed   0.0s 

  Network restjpa-frontend                                      Removing  0.0s 

  Network restjpa-backend                                       Removing  0.0s 

[+] down 3/5

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Removed   0.5s 

  Volume restjpa-pg-data                                        Removed   0.0s 

  Network restjpa-frontend                                      Removing  0.1s 

  Network restjpa-backend                                       Removing  0.1s 

[+] down 3/5

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Removed   0.5s 

  Volume restjpa-pg-data                                        Removed   0.0s 

  Network restjpa-frontend                                      Removing  0.2s 

  Network restjpa-backend                                       Removing  0.2s 

[+] down 4/5

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Removed   0.5s 

  Volume restjpa-pg-data                                        Removed   0.0s 

  Network restjpa-frontend                                      Removed   0.3s 

  Network restjpa-backend                                       Removing  0.3s 

[+] down 4/5

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Removed   0.5s 

  Volume restjpa-pg-data                                        Removed   0.0s 

  Network restjpa-frontend                                      Removed   0.3s 

  Network restjpa-backend                                       Removing  0.4s 

[+] down 5/5

  Container notebook-containers-intro-sample-java-restjpa-app-1 Removed   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Removed   0.5s 

  Volume restjpa-pg-data                                        Removed   0.0s 

  Network restjpa-frontend                                      Removed   0.3s 

  Network restjpa-backend                                       Removed   0.5s 


L’autre service app est une application JPA/REST Java dont l’image docker est produite par sample-java/restjpa/Dockerfile. L’option build dans docker-compose.yml indique qu’il faut fabriquer l’image à partir du contexte courant (image sera alors son tag). La fabrication de l’image sera automatique au démarrage au besoin elle peut être faite manuellement avec docker compose build (ou --build avec --up).

# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker compose --progress=quiet build &&
  docker compose up --quiet-pull --detach
WARN[0000] No services to build                         

[+] up 1/2

  Network restjpa-frontend Created                                        0.0s 

  Network restjpa-backend  Creating                                       0.0s 

[+] up 3/4

  Network restjpa-frontend                                     Created    0.0s 

  Network restjpa-backend                                      Created    0.0s 

  Volume restjpa-pg-data                                       Created    0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1 Creating   0.1s 

[+] up 3/4

  Network restjpa-frontend                                     Created    0.0s 

  Network restjpa-backend                                      Created    0.0s 

  Volume restjpa-pg-data                                       Created    0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1 Creating   0.2s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Created   0.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Creating  0.1s 

[+] up 5/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Created   0.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 5/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Created   0.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   1.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   2.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   3.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   4.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   5.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   6.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   7.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   8.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   9.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.6s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.7s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.8s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  10.9s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 4/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting  11.0s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 5/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Healthy  11.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 5/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Healthy  11.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 5/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Healthy  11.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 5/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Healthy  11.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 

[+] up 5/5

  Network restjpa-frontend                                      Created   0.0s 

  Network restjpa-backend                                       Created   0.0s 

  Volume restjpa-pg-data                                        Created   0.0s 

  Container notebook-containers-intro-sample-java-restjpa-db-1  Healthy  11.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Created   0.1s 


La directive depends_on dans Docker Compose permet de gérer les dépendances entre services, mais va au-delà du simple ordre de démarrage grâce à la condition service_healthy qui, combinée avec des HEALTHCHECK (cf. Dockerfile), assure qu’un service est réellement opérationnel avant le démarrage des services qui en dépendent - par exemple, vérifier qu’une base de données accepte effectivement les connexions avant de lancer l’application qui l’utilise.

#| echo: true
#| output: true

sleep 5
#| echo: true
#| output: true

#cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa

docker run --network notebook-containers-intro-sample-java-restjpa_frontend \
           --rm --quiet curlimages/curl:7.88.1 \
               curl --verbose --silent \
                 -H "Accept: application/json" \
                 http://notebook-containers-intro-sample-java-restjpa-app-1:8080/restjpa/persons

Un exemple avancé

L’exemple ci-dessous présente un exemple un peu plus avancé en ajoutant un reverse proxy (https://traefik.io) pour gérer les points d’entrées de l’application (sécurité, répartition de charges, …).

PROVIDER="github"
REPO="ebpro/notebook-containers-intro-sample-java-restjpa"
source get_src_dir.sh ${PROVIDER} ${REPO}

cd ${SRC_DIR}

# display_file.sh --lang dockerfile --numbers ${SRC_DIR}/docker-compose-proxy.yml
docker-compose.yml
services:
  # Application service with Traefik integration
  app:
    labels:
      - traefik.enable=true  # Enable Traefik for this service
      - traefik.http.routers.app.rule=PathPrefix(`/restjpa)  # Route all /restjpa/* requests
      - traefik.http.services.app.loadbalancer.server.port=80
    image: 'restjpa:latest'
    build:
      context: .
    depends_on:
      db:
        condition: service_healthy  # Ensures database is ready before starting
    environment:
      - DATASOURCE_URL=jdbc:postgresql://db:5432/demo-db
      - DATASOURCE_USERNAME=dba
      - DATASOURCE_PASSWORD=secret  # Should use .env file for secrets
    networks:
      - frontend  # For Traefik communication
      - backend   # For database communication
    restart: unless-stopped  # Add restart policy for reliability

  # PostgreSQL Database service
  db:
    image: 'postgres:15.2-alpine'
    ports:
      - "5432:5432"  # Consider removing if external access isn't needed
    environment:
      - POSTGRES_USER=dba
      - POSTGRES_PASSWORD=secret  # Should use .env file for secrets
      - POSTGRES_DB=demo-db
    volumes:
      - restjpa-pg-data:/var/lib/postgresql/data  # Persistent storage
    networks:
      - backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U dba -d demo-db"]  # Improved healthcheck
      interval: 10s
      timeout: 5s
      retries: 5

  # Traefik reverse proxy service
  traefik:
    image: 'traefik:v3.3'
    ports:
      - '10080:80'    # HTTP entrypoint
      - '10443:443'   # HTTPS entrypoint
      - '18080:8080'  # Traefik dashboard
    networks:
      - frontend      
    restart: unless-stopped
    command:
      - --api.dashboard=true
      - --log.level=INFO
      #- --log.filepath=/var/log/traefik.log
      - --accesslog=true
      #- --accesslog.filepath=/var/log/traefik-access.log
      - --providers.docker.network=frontend
      - --providers.docker.exposedByDefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entryPoints.web.http.redirections.entrypoint.scheme=https
      #- --entrypoints.websecure.address=:443
      # - --entrypoints.websecure.asDefault=true 
      #- --entrypoints.websecure.http.tls.certresolver=myresolver
      #- --certificatesresolvers.myresolver.acme.email=mail@example.com
      #- --certificatesresolvers.myresolver.acme.tlschallenge=true
      #- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
    labels:
      - traefik.enable=true
      - traefik.http.routers.mydashboard.rule=Host(`traefik.example.com`)
      - traefik.http.routers.mydashboard.service=api@internal
      #- traefik.http.routers.mydashboard.middlewares=myauth
      #- traefik.http.middlewares.myauth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/
    depends_on:
      - db
      - app

    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock:ro'         # Docker socket for auto-discovery

volumes:
  restjpa-pg-data:
  certifactes:

networks:
  frontend:
  backend:
# cd /home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpa
docker compose --file docker-compose.yml up --quiet-pull --detach
WARN[0000] No services to build                         

[+] up 1/2

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.1s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Running   0.0s 

[+] up 1/2

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.2s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Running   0.0s 

[+] up 1/2

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.3s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Running   0.0s 

[+] up 1/2

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.4s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Running   0.0s 

[+] up 1/2

  Container notebook-containers-intro-sample-java-restjpa-db-1  Waiting   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Running   0.0s 

[+] up 2/2

  Container notebook-containers-intro-sample-java-restjpa-db-1  Healthy   0.5s 

  Container notebook-containers-intro-sample-java-restjpa-app-1 Running   0.0s 


Réutilisation