recherche

Maison  >  Questions et réponses  >  le corps du texte

Docker ne peut pas connecter des applications entre elles dans le même réseau

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粉627136450P粉627136450277 Il y a quelques jours358

répondre à tous(1)je répondrai

  • P粉293550575

    P粉2935505752024-02-27 19:47:11

    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.

    répondre
    0
  • Annulerrépondre