inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

비전공자도 이해할 수 있는 Docker 입문/실전

[실습] Spring Boot, MySQL, Redis 컨테이너 동시에 띄워보기

프론트와 백 통신

213

초보

작성한 질문수 3

1

안녕하세요 선생님, 강의 잘 봤습니다.

선생님이께서 알려주신대로, 제가 하고 있는 프로젝트를 local환경에서 compose를 통해 성공적으로 띄웠습니다.

근데 여기서 궁금한 점이 mysql 이나 redis와 같이 spring boot에 연결하는 건 service 이름을 통해 요청을 하는 반면에, 프론트와 백이 통신할 때는 localhost를 사용해서 통신을 합니다.

어떻게 다른 컨테이너에 띄웠는데 localhost로 통신이 되는 지 궁금합니다.

(프론트는 vue.js를 node를 이용해서 정적파일로 build 후 nginx 이미지로 만들었습니다.)

docker docker-compose docker-volume docker-image container ecr

답변 3

2

JSCODE 박재성

안녕하세요 상학님! 강의 잘 봐주셔서 감사합니다:D

강의 내용을 잘 이해하셨기에 할 수 있는 질문을 해주셨네요~!!

 

아래 AI가 잘 답변해준 것 같은데, 이 내용을 조금 더 풀어서 설명드려볼게요!

여러분의 Vue.js로 작성된 프론트엔드 애플리케이션은 클라이언트 사이드에서 실행됩니다. 즉, 사용자의 브라우저에서 실행되기 때문에 “localhost”는 해당 사용자의 로컬 시스템을 응답합니다. 이 때 백엔드는 외부 세계에 서비스되고 있어서, 두 시스템이 동일한 네트워크 내에 있는 경우에만 localhost를 통해 백엔드에 접근하게 됩니다.

웹 프론트엔드 프로젝트를 도커 컨테이너를 기반으로 실행시켰습니다.

하지만 정적 파일로 구성된 웹 프론트엔드 프로젝트의 특성상

정적 파일이 브라우저로 전송된 다음에 브라우저 자체에서 웹 프론트엔드가 실행됩니다.

즉, 웹 프론트엔드 프로젝트가 컨테이너 내부에서 실행되지 않고,

호스트 컴퓨터에 설치된 브라우저에서 실행된다는 뜻입니다.

따라서 localhost를 사용하더라도 호스트 컴퓨터의 localhost를 가리키고 있기 때문에

localhost로 백엔드 컨테이너와 통신이 가능한 것입니다!

 

위 설명을 보시고 이해 안 되시는 점 있으시면 추가로 댓글 남겨주세요:D

0

초보

감사합니다. 혹시 제가 잘 이해한 게 맞나 잘 모르겠는데

브라우저에서 get 요청을 하면 nginx가 정적파일을 브라우저에게 던져주고, 이 파일을 브라우저에서 실행.

그렇기 때문에 spring boot와의 연결은 nginx 컨테이너가 아닌 브라우저와 통신하기 때문에 서비스 이름이 아닌, IP로 통신하는 거라고 생각해도 될까요?

1

JSCODE 박재성

와우!! 정확하게 잘 이해하셨습니다👍👍👍

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 이상학님.

프론트엔드와 백엔드의 통신 방식에 대해 궁금하신 부분에 대해 설명드리겠습니다.

  1. 서비스 이름을 통한 통신:

    • Docker Compose를 사용하면 동일한 Docker 네트워크 내에서는 컨테이너 간에 서비스 이름을 통해 서로의 서비스를 찾을 수 있습니다. 그래서 MySQL이나 Redis 같은 백엔드 서비스는 service 이름을 통해 연결합니다.
  2. localhost 통신:

    • 여러분의 Vue.js로 작성된 프론트엔드 애플리케이션은 클라이언트 사이드에서 실행됩니다. 즉, 사용자의 브라우저에서 실행되기 때문에 “localhost”는 해당 사용자의 로컬 시스템을 응답합니다. 이 때 백엔드는 외부 세계에 서비스되고 있어서, 두 시스템이 동일한 네트워크 내에 있는 경우에만 localhost를 통해 백엔드에 접근하게 됩니다.
  3. NGINX와 리버스 프록시:

    • NGINX가 리버스 프록시로 설정되어 있는 경우, 프론트엔드에서 “localhost”로 서버에 요청을 보내면, NGINX가 그 요청을 적절한 백엔드 서비스로 전달할 수 있습니다. 이 때문에 프론트엔드 쪽에서는 localhost를 통해 연결한다고 느낄 수 있는 것입니다.

이러한 구조에서는 Docker의 네트워크 기능을 이용해 컨테이너 간의 직접적인 연결을 진행할 수 있지만, 프론트엔드는 클라이언트 측 웹페이지로 실행되므로 이러한 방식이 조금 달라 보일 수 있습니다.

유사한 사례에 대해 자세히 다루고 있는 게시글을 아래에 첨부해 드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

EC2 터미널에서 docker pull

0

62

2

AWS ECR

0

57

2

FROM openjdk:17-jdk 현재 기준 dockerhub에 없습니다

1

100

2

Redis 볼륨 설정?

0

117

2

컨테이너의 IP

0

80

2

도커 이미지를 만들 때 application.yml

0

105

2

compose.yml 관리

0

87

2

ECR 리포지토리에 이미지가 3개가 보입니다.

0

77

2

액세스 키 등록하는 시점 관련 질문이 있습니다.

0

83

1

depends_on에 따른 컨테이너 실행 순서

0

76

2

실제 웹 서비스 배포 시 질문

0

80

2

도커 volume 질문

0

67

3

HTTPS로도 받고 싶으면 docker compose에 443도 쓰면 될까요?

0

72

2

sql 볼륨 폴더 지우면 데이터베이스 데이터 날라가는거 아닌가요?

0

72

2

39강 도커파일 빌드 경로 질문이 있습니다.

0

69

2

도커파일 copy

0

70

2

실무에서 docker compose up --build를 할 때

0

185

2

mysql_data 폴더 내부에 다른 파일이 있는데도 잘 되는 경우

0

85

2

도커 허브에서 postgres 버전 확인하는 법

0

127

2

보충 자료와도 관련된 추가 내용

1

82

1

현업에서 MySQL은 RDS와 도커 볼륨 중 어떤 걸 사용하나요?

0

110

2

노션 자료에 안 보이는 이미지가 있습니다

0

100

1

도커 허브에서의 latest가 가장 최신인 게 맞나요?

0

119

2

docker image ls 실행 시 나오는 내용이 다릅니다

0

86

2