찾다

 >  Q&A  >  본문

Node.js는 MySQL Docker 컨테이너 ECONNREFUSED에 연결합니다.

이 질문을 중복으로 표시하기 전에 다른 답변을 읽었으나 문제가 해결되지 않았다는 점에 유의하세요.

두 가지 서비스가 포함된 Docker compose 파일이 있습니다.

으아아아

/web/Dockerfile:

으아아아

이후 docker-compose up --build 서비스가 시작되지만 mySQL 연결이 시작되기를 기다리는 동안 "wait-for-it.sh" 스크립트가 시간 초과되어(그래서 DB를 테스트하는 동안 지금은 사용하지 않습니다) 콘솔에 MySQL이 들어오는 연결을 수락할 준비가 되었다고 표시됩니다.)

MySQL이 호스트에서 실행될 때 Sequel Pro를 사용하여 로그인하고 데이터베이스를 쿼리하고 ./mysql/migrations

에서 샘플 레코드를 얻을 수 있습니다.


실행 중인 MySQL 컨테이너에 SSH로 접속하여 동일한 작업을 수행할 수도 있습니다.

그러나 내 Node.js 앱은 연결할 때 ECONNREFUSED 127.0.0.1:3307

을 생성합니다.

MySQL 초기화:

으아아아

MySQL 쿼리:

으아아아

URL을 클릭하면 호출되는 경로 /

으아아아

Node.js가 실패하는 동시에 Sequel Pro 또는 SSH를 사용하여 실행 중인 Docker 컨테이너를 쿼리하고 쿼리할 수 있기 때문에 경쟁 조건이 아닐 가능성이 높습니다. 그러면 이는 Node.js가 MySQL 컨테이너에 액세스할 수 없는 경우일 수 있습니까?

으아아아


P粉296080076P粉296080076311일 전638

모든 응답(1)나는 대답할 것이다

  • P粉399090746

    P粉3990907462024-01-22 12:20:58

    이것:

    으아악

    은 Docker가 호스트의 3307端口映射到容器的3306 포트에 연결됨을 나타냅니다. 따라서 Sequel에서 localhost:3307에 액세스할 수 있습니다.

    그러나 이것이 컨테이너가 듣고 있다는 의미는 아닙니다 3307;事实上容器仍在监听 3306。当其他容器尝试访问 mysql DNS 时,它会被转换为内部容器 IP,因此您必须连接到 3306.

    따라서 노드 구성은 다음과 같아야 합니다.

    으아악

    이는 docker-compose.yml에 있습니다:

    으아악

    참고: wait-for-it.sh 스크립트 출처: https://github.com/vishnubob/wait-for-it

    회신하다
    0
  • 취소회신하다