Déploiement de Nacos Server avec Docker : Guide Complet

Nacos : Présentation et Fonctionnalités

Nacos (Dynamic Naming and Configuration Service) est un composant open-source conçu pour les architectures microservices. Il résout deux problématiques majeures : la découverte de services et la gestion centralisée des configurations dynamiques, tout en proposant des vérifications de santé et un support de clustering.

Découverte de services

Dans un environnement distribué, les services enregistrent leurs adresses IP et ports auprès de Nacos. Lorsqu'un service a besoin d'en appeler un autre, il interroge Nacos pour obtenir la liste des instances saines. Cela élimine le besoin de coder en dur les adresses réseau et permet une mise à l'échelle transparente.

Gestion des configurations

Au lieu de stocker les paramètres dans des fichiers locaux, les microservices récupèrent leur configuration depuis Nacos au démarrage. Les modifications effectuées via la console Nacos sont instantanément propagées aux services concernés, sans nécessiter de redémarrage.

Prérequis : Environnement Docker

Le déploiement de Nacos s'appuie sur Docker. Si Docker et Docker Compose ne sont pas encore installés sur votre machine Linux, vous pouvez les configurer via le script officiel :

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

Vérifiez l'installation :

docker --version
docker compose version

Récupération de l'image Nacos

Téléchargez l'image officielle depuis Docker Hub. La version 2.2.3 est utilisée ici pour sa stabilité.

docker pull nacos/nacos-server:2.2.3

Stratégies de Déploiement

Scénario 1 : Démarrage Rapide (Mode Autonome avec Derby)

Idéal pour les tests locaux, ce mode utilise la base de données embarquée Derby. Les données seront perdues si le conteneur est supprimé.

docker run -d \
  --name nacos_dev \
  -p 8848:8848 \
  -e NACOS_MODE=standalone \
  -e JVM_XMS=512m \
  -e JVM_XMX=512m \
  -e JVM_XMN=256m \
  nacos/nacos-server:2.2.3

Accédez à l'interface web sur http://<IP_SERVEUR>:8848/nacos avec les identifiants par défaut nacos/nacos.

Scénario 2 : Persistance des données (Mode Autonome avec MySQL)

Pour un environnement de production, il est crucial de lier Nacos à une base de données MySQL externe et de monter des volumes pour les logs et configurations.

Initialisation de MySQL

Démarrez une instance MySQL et montez le script d'initialisation de Nacos :

docker run -d \
  --name db_nacos \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=SecretPass123 \
  -e MYSQL_DATABASE=nacos_db \
  -v /opt/nacos/mysql:/var/lib/mysql \
  -v /opt/nacos/init_db:/docker-entrypoint-initdb.d \
  mysql:8.0

Assurez-vous de placer le script SQL officiel de Nacos dans /opt/nacos/init_db/ avant le démarrage.

Lancement du conteneur Nacos

docker run -d \
  --name nacos_prod \
  -p 8848:8848 \
  -p 9848:9848 \
  -p 9849:9849 \
  -e NACOS_MODE=standalone \
  -e SPRING_DATASOURCE_PLATFORM=mysql \
  -e MYSQL_SERVICE_HOST=192.168.1.50 \
  -e MYSQL_SERVICE_PORT=3306 \
  -e MYSQL_SERVICE_DB_NAME=nacos_db \
  -e MYSQL_SERVICE_USER=root \
  -e MYSQL_SERVICE_PASSWORD=SecretPass123 \
  -e JVM_XMS=1g \
  -e JVM_XMX=1g \
  -v /opt/nacos/conf:/home/nacos/conf \
  -v /opt/nacos/logs:/home/nacos/logs \
  --restart=always \
  nacos/nacos-server:2.2.3

Scénario 3 : Orchestration avec Docker Compose

Pour simplifier la gestion, utilisez un fichier docker-compose.yml. Créez le fichier de configuraton suivant :

version: '3.8'
services:
  base_donnees:
    image: mysql:8.0
    container_name: mysql_nacos
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: SecretPass123
      MYSQL_DATABASE: nacos_db
    volumes:
      - ./data_mysql:/var/lib/mysql
      - ./init_db:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    networks:
      - reseau_interne

  serveur_nacos:
    image: nacos/nacos-server:2.2.3
    container_name: nacos_app
    restart: always
    depends_on:
      - base_donnees
    environment:
      NACOS_MODE: standalone
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: base_donnees
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_DB_NAME: nacos_db
      MYSQL_SERVICE_USER: root
      MYSQL_SERVICE_PASSWORD: SecretPass123
      JVM_XMS: 1g
      JVM_XMX: 1g
    volumes:
      - ./nacos_conf:/home/nacos/conf
      - ./nacos_logs:/home/nacos/logs
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    networks:
      - reseau_interne

networks:
  reseau_interne:
    driver: bridge

Démarrez l'ensemble avec :

docker compose up -d

Scénario 4 : Haute Disponibilité (Cluster avec Stockage Embarqué)

Pour éviter tout point de défaillance unique, déployez un cluster de plusieurs nœuds Nacos utilisant le mode de stockage embarqué.

version: '3.8'
services:
  nacos_noeud_1:
    image: nacos/nacos-server:2.2.3
    container_name: nacos_n1
    restart: always
    environment:
      NACOS_MODE: cluster
      EMBEDDED_STORAGE: embedded
      NACOS_SERVERS: "nacos_n1:8848 nacos_n2:8848 nacos_n3:8848"
      NACOS_SERVER_IP: nacos_n1
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    networks:
      - reseau_cluster

  nacos_noeud_2:
    image: nacos/nacos-server:2.2.3
    container_name: nacos_n2
    restart: always
    environment:
      NACOS_MODE: cluster
      EMBEDDED_STORAGE: embedded
      NACOS_SERVERS: "nacos_n1:8848 nacos_n2:8848 nacos_n3:8848"
      NACOS_SERVER_IP: nacos_n2
    ports:
      - "8858:8848"
      - "9858:9848"
      - "9859:9849"
    networks:
      - reseau_cluster

  nacos_noeud_3:
    image: nacos/nacos-server:2.2.3
    container_name: nacos_n3
    restart: always
    environment:
      NACOS_MODE: cluster
      EMBEDDED_STORAGE: embedded
      NACOS_SERVERS: "nacos_n1:8848 nacos_n2:8848 nacos_n3:8848"
      NACOS_SERVER_IP: nacos_n3
    ports:
      - "8868:8848"
      - "9868:9848"
      - "9869:9849"
    networks:
      - reseau_cluster

networks:
  reseau_cluster:
    driver: bridge

Initialisez le cluster via :

docker compose up -d

Opérations Fondamentales via l'API

Enregistrement d'un Service

curl -X PUT 'http://<IP_SERVEUR>:8848/nacos/v1/ns/instance?serviceName=api-utilisateurs&ip=192.168.1.101&port=8080'

Découverte d'instances

curl -X GET 'http://<IP_SERVEUR>:8848/nacos/v1/ns/instances?serviceName=api-utilisateurs'

Publication d'une Configuration

curl -X POST "http://<IP_SERVEUR>:8848/nacos/v1/cs/configs?dataId=api-utilisateurs-dev.conf&group=DEFAULT_GROUP&content=db.url=jdbc:mysql://127.0.0.1:3306/user_db"

Récupération d'une Configuration

curl -X GET "http://<IP_SERVEUR>:8848/nacos/v1/cs/configs?dataId=api-utilisateurs-dev.conf&group=DEFAULT_GROUP"

Résolution des Problèmes Courants

Console Web Inaccessible

Vérifiez l'état du conteneur avec docker ps et inspectez les journaux via docker logs nacos_prod. Si le port est bloqué, ouvrez-le dans le pare-feu :

firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --reload

Échec de Connexion à MySQL

Assurez-vous que l'adresse IP du serveur MySQL est correcte. N'utilisez pas 127.0.0.1 dans la configuration de Nacos si les conteneurs sont sur le même hôte, privilégiez l'IP interne de Docker ou le nom du service. Vérifiez également que le script SQL d'initialisation a bien été exécuté.

Arrêt Immédiat du Conteneur

Si le conteneur s'arrête instantanément, cela vient souvent d'une configuration JVM inadéquate ou d'un manque de mémoire. Réduisez les valeurs JVM_XMS et JVM_XMX. En modde cluster, une erreur de configuration des nœuds dans NACOS_SERVERS provoque également un crash.

Activation de l'Authentification

Par défaut, l'accès à l'API est ouvert. Pour sécuriser votre instance, activez l'authentification lors du démarrage :

-e NACOS_AUTH_ENABLE=true \
-e NACOS_AUTH_TOKEN=VotreCleSecreteComplexe456

Étiquettes: Nacos Docker Docker Compose Microservices MySQL

Publié le 13 juillet à 11h15