Docker ne peut pas connecter des applications entre elles dans le même réseau
P粉627136450
P粉627136450 2024-02-26 20:53:13
0
1
351

J'ai un fichier Docker Compose qui ressemble à ceci :

version: "3.9"
services:
  mysqldb:
    image: mysql:5.7
    container_name: mysqlcontainer
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./db/init.sql:/docker-entrypoint-initdb.d/0_init.sql
    ports:
      - 3306:3306
    expose:
      - 3306
    environment:
      MYSQL_DATABASE: "todos"
      MYSQL_USER: "admin"
      MYSQL_PASSWORD: "password"
      MYSQL_ROOT_PASSWORD: "password"
      SERVICE_TAGS: dev
      SERVICE_NAME: mysqldb
    restart: on-failure
    networks:
      - internalnet
  expressapp:
    container_name: api
    build: .
    image: expressapp:1.0
    ports:
      - "3001:3001"
    expose:
      - "3001"
    environment:
      DB_HOST: mysqldb
      DB_PORT: 3306
      DB_USER: "admin"
      DB_PASSWORD: "password"
      DB_NAME: todos
      DB_CONNECTION_LIMIT: 20
      SERVICE_TAGS: dev
      SERVICE_NAME: expressapp
      PORT: 3001
    depends_on:
      - mysqldb
    networks:
      - internalnet
networks:
  internalnet:
    driver: bridge
volumes:
  database:

Si je vérifie le conteneur en cours d'exécution à l'aide de la commande docker compose up -d 命令启动容器并使用 ps, j'obtiens le résultat suivant :

CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS                               NAMES
9f338b733a1c   expressapp:1.0   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:3001->3001/tcp              api
edef8027dc0a   mysql:5.7        "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysqlcontainer

Mais lorsque j'essaie de faire une requête API au serveur, j'obtiens le message d'erreur suivant :

"There was an error processing your request: connect ECONNREFUSED 172.24.0.2:3306"

Pourquoi est-ce parce que j'ai changé DB_HOST 变量设置为 mysql le nom du service ?

P粉627136450
P粉627136450

répondre à tous(1)
P粉293550575

Ce problème peut survenir car expressappmysql est démarré avant que la requête ne soit disponible.

Pour contrôler l'ordre dans lequel les services sont démarrés, vous pouvez healthcheck 添加到 mysqldb Services :

healthcheck:
      test: mysql ${MYSQL_DATABASE} --user=${MYSQL_USER} --password='${MYSQL_PASSWORD}' --silent --execute "SELECT 1;"
      interval: 30s
      timeout: 10s
      retries: 5

et depends_on 块到 expressapp

depends_on:
      mysqldb:
        condition: service_healthy

Voir l'exemple complet ici

Pour plus d'informations à ce sujet, consultez cette réponse.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal