localhost (127.0.0.1)은 자기 자신을 가르키는 주소이다
그럼 만약 Docker Container에서 localhost를 가리킨다면 어딜 가리킬까
바로 Docker Container 안의 자기자신을 가리킨다. 외부와는 독립된 환경이라는 뜻
그럼 외부와 단절되 있는데 외부와의 통신을 어떻게할까??
🔹 격리 되었다는데 어떻게 사용할 수가 있지?
컨테이너는 기본적으로 외부와 격리되어 있음
프로세스, 네트워크, 파일시스템 등이 분리되어 있어 다른 컨테이너나 호스트와 통신 불가
🔹 "도커 네트워크" 가 통신을 가능하게 함
도커는 컨테이너들 간의 통신을 위해 가상 네트워크 생성 기능을 제공함
컨테이너들을 동일한 네트워크에 넣으면 이름 기반으로 통신 가능함
🔹 네트워크를 통해 격리된 컨테이너를 연결함
격리는 보안과 안정성 확보 목적
통신은 명시적인 네트워크 설정으로만 가능함 → 안전하고 예측 가능함
외부 접근은 포트 포워딩으로 해결 (도커에만 있는 개념이 아니라 네트워크 IP 확장에서 거의 기본으로 쓰임)
도커는 컨테이너 네트워크와 호스트 네트워크 사이에 NAT(Network Address Translation)를 설정함
"외부 포트 : 내부 포트"
여기서 외부포트는 내가 접속할 포트 내부포트는 안에 도커로열린 포트를 애기한다.
먼저 컨테이너로 mysql을 하나 열었다고 생각해보자 mysql의 기본포트는 3306이니
내가원하는 포트 아무거나 뭐 4000번으로 접속하면~ myslq에 접속하겠다 하면
4000: 3306으로 설정하면 된다.
근데 만약 컨테이너가 3306으로 열려있는데
4000: 3307 이런식으로 만들려 하면 당연히 에러가 발생
자 이제 컨테이너로 mysql 을 3개 열었다고 가정해보자
mysql은 무조건 3306일테니 모두 내부포트는 3306으로 열려있을것이다.
이 컨테이너들의 접속포트를 구분만 하면되는데
예를들어
컨테이너_1은 4000번
컨테이너_2은 4001번
컨테이너_3은 4002번으로 접속하겠다~ 하면
4000:3306
4001:3306
4002:3306 이런식으로 구분해놓으면 내가 원하는 포트로 원하는 컨테이너에 접근이가능하다
컨테이너_2에 접근하고싶으면 4001번으로 호출하면 되겠죠?
이런식으로 외부포트:내부포트가 하나의 주소라 생각하면 이해하기 편함
host.docker.internal
localhost는 항상 자기 자신(자기 네임스페이스 안) 을 가리킴
안에서 바깥을 보려면
원래는 컨테이너에서 호스트 머신의 IP를 알아야 함
host.docker.internal 사용: 호스트 머신의 IP 를 미리 매핑해준다.
도커 안에서 "밖"을 바라보는 창구
도커 컨테이너에서 호스트에 접근해보기
nginx 폴더안에 nginx환경구축을 위해
두개의 파일을 만들기
nginx란?
경량 고성능 웹 서버
리버스 프록시, 로드 밸런서, 정적 파일 서버 등 다양한 역할 수행 가능
비유) 대표번호로 전화를 걸면, Nginx가 응답 가능한 서버로 연결해줌 (전화 교환원)
listen: Nginx가 요청을 받을 포트
proxy_pass: 요청을 실제 서버로 전달하는 경로
심화)
API Gateway 구조의 기초
Kubernetes의 Ingress 컨트롤러 역할과 유사
실무에서 보안, 로깅, 트래픽 관리에 필수 요소
default.conf
server {
listen 80;
location / {
proxy_pass http://host.docker.internal:8082; # 또는 직접 호스트 IP
}
}
services:
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf:ro
간단한 예제함
upstream으로 라운드로빈 로드밸런스를 구현할수도 있지만 이번엔 간단하게만
docker-compose up -d 로 nginx를 실행해준뒤
사용하려는 docker 백엔드서버를 포트를 지정해서 열어주기
default.conf 파일을보면
proxy_pass http://host.docker.internal:8082;
도커 파일 내부의 8082 포트로 접근하기로 했으니
백엔드 DOCKERFILE 위치에서
docker run -it --name <제작할 컨테이너이름> -p 8082:8082 <실행할 이미지이름>
을 통해서 8082 포트를 양쪽으로 연상태로 실행시켜준다
이 상태로 외부에서 backend 서버에 8082포트로 접근하려하면 접근이 된다.
'Web Backend' 카테고리의 다른 글
Kubernetess (0) | 2025.04.07 |
---|---|
Docker Swarm (0) | 2025.04.07 |
Docker-compose (0) | 2025.04.07 |
Kubernetess 시작하기 (0) | 2025.04.07 |
Docker (2) | 2025.04.07 |