🌐 네트워크 흐름 이해하기
외부에서 내 웹 서버로의 접근 흐름:
외부 사용자 → 공인 IP (xxx.xxx.xx.xx:80) → 공유기 → 내부 IP (your.internal.ip:80) → 도커 컨테이너 (80:80)
1️⃣ 외부 요청
- 사용자가
http://xxx.xxx.xx.xx 또는 Cloudflare DNS에 등록된 도메인으로 접속
- 요청이 포트 80을 통해 공유기에 도달
2️⃣ 공유기 포트 포워딩
- 공유기가 포트 80으로 들어오는 요청을 내부 IP의 포트 80으로 전달
- 설정: 외부 포트 80 → 내부 IP(your.internal.ip):80
3️⃣ 도커 컨테이너
- 호스트 머신의 포트 80이 도커 컨테이너의 포트 80과 연결됨
- 설정:
-p 80:80 (호스트 포트:컨테이너 포트)
4️⃣ 스프링부트 서버
- 도커 컨테이너 내에서 스프링부트 서버가 포트 80으로 실행
- 설정:
server.port=80
🚨 발생했던 문제들
❌ 포트 불일치 문제
처음에는 포트 설정이 일치하지 않아 문제 발생:
- 공유기: 외부 80 → 내부 8080
- 스프링부트: 포트 80
- 도커: 8080:8080
🔄 해결: 모든 포트를 80으로 통일
- 공유기: 외부 80 → 내부 80
- 스프링부트: 포트 80
- 도커: 80:80
❌ 데이터베이스 연결 문제
도커 컨테이너에서 MySQL 접근 시 문제 발생:
- 컨테이너 내부에서
localhost 또는 127.0.0.1로 접근 시도
- 컨테이너는 독립된 네트워크 환경을 가지므로 호스트의 MySQL에 접근 불가
🔄 해결: 호스트 머신의 내부 IP 주소 사용
spring.datasource.url=jdbc:mysql://your.internal.ip:3306/mydatabase
💡 배운 교훈
-
포트 일관성의 중요성
- 모든 계층(공유기, 호스트, 도커, 애플리케이션)에서 포트 설정이 일치해야 함
- 포트 불일치는 연결 문제의 주요 원인
-
도커 네트워크 이해
- 도커 컨테이너는 독립된 네트워크 환경을 가짐
localhost는 컨테이너 자신을 가리키므로, 호스트 서비스에 접근할 때는 호스트 IP 필요
-
데이터베이스 연결 설정
- MySQL이 호스트에서 실행 중일 때, 컨테이너에서는 호스트 IP로 접근해야 함
- 내부 네트워크에서는 3306 포트가 열려 있어야 함 (외부에서는 필요 없음)
-
보안 고려사항
- Cloudflare DNS 등록으로 원본 서버 IP 보호 가능
- 불필요한 포트는 외부에 노출하지 않는 것이 좋음
🛠️ 최종 설정
공유기 설정
- 외부 포트: 80
- 내부 IP: your.internal.ip
- 내부 포트: 80
도커 컨테이너 설정
docker run -p 80:80 my-web-server-image
스프링부트 설정
server.port=80
spring.datasource.url=jdbc:mysql://your.internal.ip:3306/mydatabase
Cloudflare DNS 설정
- A 레코드: 도메인 → 공인 IP
- 프록시 활성화로 원본 IP 보호
이제 외부에서 도메인을 통해 웹 서버에 안전하게 접근할 수 있습니다! 🎉
🌐 네트워크 흐름 이해하기
외부에서 내 웹 서버로의 접근 흐름:
1️⃣ 외부 요청
http://xxx.xxx.xx.xx또는 Cloudflare DNS에 등록된 도메인으로 접속2️⃣ 공유기 포트 포워딩
3️⃣ 도커 컨테이너
-p 80:80(호스트 포트:컨테이너 포트)4️⃣ 스프링부트 서버
server.port=80🚨 발생했던 문제들
❌ 포트 불일치 문제
처음에는 포트 설정이 일치하지 않아 문제 발생:
🔄 해결: 모든 포트를 80으로 통일
❌ 데이터베이스 연결 문제
도커 컨테이너에서 MySQL 접근 시 문제 발생:
localhost또는127.0.0.1로 접근 시도🔄 해결: 호스트 머신의 내부 IP 주소 사용
spring.datasource.url=jdbc:mysql://your.internal.ip:3306/mydatabase💡 배운 교훈
포트 일관성의 중요성
도커 네트워크 이해
localhost는 컨테이너 자신을 가리키므로, 호스트 서비스에 접근할 때는 호스트 IP 필요데이터베이스 연결 설정
보안 고려사항
🛠️ 최종 설정
공유기 설정
도커 컨테이너 설정
스프링부트 설정
Cloudflare DNS 설정
이제 외부에서 도메인을 통해 웹 서버에 안전하게 접근할 수 있습니다! 🎉