Docker kann keine Anwendungen im selben Netzwerk miteinander verbinden
P粉627136450
P粉627136450 2024-02-26 20:53:13
0
1
349

Ich habe eine Docker-Compose-Datei, die so aussieht:

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:

Wenn ich den laufenden Container mit dem Befehl docker compose up -d 命令启动容器并使用 ps überprüfe, erhalte ich die folgende Ausgabe:

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

Aber wenn ich versuche, eine API Anfrage an den Server zu stellen, erhalte ich die folgende Fehlermeldung:

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

Warum liegt es daran, dass ich DB_HOST 变量设置为 mysql den Dienstnamen geändert habe?

P粉627136450
P粉627136450

Antworte allen(1)
P粉293550575

出现此问题的原因可能是 expressappmysql 可用于查询之前启动。

要控制服务启动顺序,您可以将 healthcheck 添加到 mysqldb 服务:

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

depends_on 块到 expressapp

depends_on:
      mysqldb:
        condition: service_healthy

查看完整示例此处

有关此内容的更多信息,请参阅此答案

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage