해결된 질문
작성
·
54
0
몇 챕터/몇 강을 수강 중이신가요?
2-4
여기까지 이해하신 내용은 무엇인가요?
어느 부분에서 막히셨나요?
코드의 어떤 로직이 이해가 안 되시나요?
어떤 개념이 헷갈리시나요? apllication.yml 파일에서 url 부분에 localhost로 적용하면 도커 컨테이너끼리 통신이 안되는 것으로 알고 있는데 문제 없이 작동하는 이유가 뭔가요??
혹시 제가 잘못 알고 있는 것이면 말씀해주시면 감사하겠습니다. ㅎㅎ
문제 해결을 위해 어떤 시도를 해보셨나요?
에러가 발생했다면 어떤 에러인가요?
현재 작성하신 코드를 공유해주세요
이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다!
답변 2
1
안녕하세요 모깅님 좋은 질문 해주셔서 감사합니다.
맞습니다! 일반적으로 도커 컨테이너끼리 통신할 때는 localhost 대신 서비스명을 사용해야 합니다. 하지만 현재 상황에서 작동하고 있다면 몇 가지 이유가 있을 수 있습니닷
1. 호스트 네트워크 모드 사용
docker-compose.yml에서 network_mode: host
를 사용하고 있다면 컨테이너가 호스트의 네트워크를 직접 사용하게 됩니다. 이 경우 localhost가 정상 작동합니다.
yaml
services:
app:
network_mode: host
2. 포트 포워딩을 통한 우회 연결
MySQL과 Redis 컨테이너가 호스트로 포트를 노출하고 있고, 애플리케이션이 그 포트로 연결되는 경우입니다.
yaml
services:
mysql:
ports:
- "3306:3306" # 호스트 포트로 노출
redis:
ports:
- "6379:6379" # 호스트 포트로 노출
이때 데이터 흐름: 앱 컨테이너 → localhost:3306 → 호스트 → MySQL 컨테이너
3. Docker Desktop의 특별한 처리
Windows/Mac에서 Docker Desktop을 사용하는 경우, localhost가 자동으로 호스트 머신을 가리키도록 특별히 처리되는 경우가 있습니다.
다만 실무에서는 다음과 같이 서비스명을 사용하는 것이 올바른 방식입니다.
yaml
# application.yml
spring:
datasource:
url: jdbc:mysql://mysql:3306/mydb # 서비스명 사용
redis:
host: redis # 서비스명 사용
환경이 바뀌면 (다른 도커 호스트, 쿠버네티스 등) 문제가 발생할 수 있기 떄문입니다
현재 docker-compose.yml 파일의 네트워크 설정 부분을 확인해보시면 정확한 원인을 파악할 수 있을 것 같습니다 관련해서 한 번 파악해보시고 말씀주셔도 좋을 것 같아요 좋은 질문해주셔서 감사합니다!!
0
안녕하세요, 인프런 AI 인턴입니다.
모깅님이 말씀하신 질문은 Docker와 관련된 네트워킹 이슈입니다.
Docker에서는 기본적으로 모든 컨테이너들이 서로 다른 네트워크에 존재하게 됩니다. 따라서 서로 통신하기 위해서는 같은 Docker 네트워크에 연결되어야 합니다. 일반적으로 localhost
는 호스트 머신을 나타내기 때문에, 도커 컨테이너 간의 통신에서는 사용되지 않습니다. 그러나 Docker Compose를 사용하면 동일한 네트워크에 연결된 다양한 컨테이너 간의 통신이 가능합니다.
혹시 Docker Compose를 사용하고 계신다면, docker-compose.yml
파일 내 서비스들이 동일한 네트워크에 포함되어 있으면 서비스 이름을 통해 서로를 인식하고 통신할 수 있습니다. 이 경우 localhost
대신 서비스 이름을 URL에 사용하면 됩니다.
정확한 설정과 작동 방식을 이해하기 위해서는 Spring Boot의 Docker Compose 지원에 대한 문서를 참고하시면 좋습니다. 관련 문서를 통해 추가 정보를 얻으실 수 있습니다.
도움이 되셨기를 바랍니다. 추가적인 질문이 있다면 언제든지 해주세요!