이 질문을 중복으로 표시하기 전에 다른 답변을 읽었으나 문제가 해결되지 않았다는 점에 유의하세요.
두 가지 서비스가 포함된 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 컨테이너에 액세스할 수 없는 경우일 수 있습니까?
으아아아
이것:
으아악은 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