Web Backend

Docker 네트워크

Atriel 2025. 4. 7. 14:37

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 구조의 기초

KubernetesIngress 컨트롤러 역할과 유사

실무에서 보안, 로깅, 트래픽 관리에 필수 요소

 

 

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 포트를 양쪽으로 연상태로 실행시켜준다

Docker Desktop으로 본, 포트가 열린상태로 실행된 모습

 

 

이 상태로 외부에서 backend 서버에 8082포트로 접근하려하면 접근이 된다.

 

Postman을 통해서 Docker 내부의 Controller에 접근함