Tool 활용법/Docker 활용법

Docker 컨테이너 간 통신이 필요한 이유와 Nginx Reverse Proxy

gksyb4235 2026. 2. 6. 21:37

컨테이너 환경에서 통신이 필요한 이유


Docker를 사용하면 프로그램을 컨테이너 형태로 실행할 수 있다.
각 컨테이너는 겉보기에는 하나의 프로그램처럼 보이지만, 실제로는 서로 완전히 분리된 독립적인 가상 컴퓨터에 가깝다.

이 구조 때문에 단일 컨테이너만 실행하는 경우에는 문제가 없지만,
여러 개의 컨테이너를 함께 사용해야 하는 순간부터 새로운 문제가 등장한다.

바로 컨테이너 간 통신이다.

 

 

Reverse Proxy란?


출처 : https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/

 

 

컨테이너 간 통신이 필요한 가장 대표적인 예시는 웹 서버 구성이다.
우리가 이전에 만든 웹 서버 앞단에는 보통 Reverse Proxy를 함께 둔다.

Reverse Proxy란 "클라이언트와 웹 서버 사이에 위치해, 클라이언트의 요청을 대신 받아 내부 백엔드 서버로 전달하고,

응답을 클라이언트에게 반환하는 중개 서버"이다.

 

즉, Reverse Proxy는 다음과 같은 역할을 한다.

  • 외부 요청을 서버 대신 먼저 받는다
  • 요청을 내부 서버로 전달한다
  • 서버의 실제 구조와 위치를 외부에 노출하지 않는다

즉, 사용자는 웹 서버에 직접 접속하지 않고, 항상 Reverse Proxy를 통해서만 서버에 접근하게 된다.

 

겉으로 보면 요청을 한 번 더 거치는 비효율적인 구조처럼 보일 수 있지만 Reverse Proxy는 실무에서 중요한 장점을 제공한다.

  • 실제 서버의 정체를 외부에서 숨길 수 있다
  • HTTPS 인증서 적용이 훨씬 쉽다
  • 로드 밸런싱이 가능하다
  • 접속 로그를 한 곳에서 관리할 수 있다
  • 특정 IP 차단, 접근 제어가 가능하다

이 때문에 실무 환경에서는 Reverse Proxy가 사실상 필수 구성 요소다.

우선 이 Reverse Proxy의 동작에 대해 알아보고, 왜 컨테이너간의 통신이 필수적인지를 살펴보자.

 

 

대표적인 Reverse Proxy : Ningx


Reverse Proxy로 가장 많이 사용되는 소프트웨어는 다음 두 가지다.

  • nginx
  • caddy

 

 

이 중에서 우리는 nginx를 사용할 것인데, 그 이유는 다음과 같다.

  • 가장 널리 사용되는 Reverse Proxy
  • 설정 문서와 예제가 매우 풍부
  • Docker 환경에서 사용하기 쉽다

이제 nginx를 컨테이너 형태로 실행하기 위해, 먼저 nginx가 어떻게 동작하는지 최소한의 설정을 살펴본다.

 

 

 

Nginx를 Docker 컨테이너로 실행하기


nginx 설정 파일의 기본 구조


nginx는 설정 파일을 기반으로 동작한다.
실제 로컬 환경에서는 nginx를 설치하고 설정 파일을 작성한 뒤 실행하는데 Docker 환경에서도 원리는 동일하다.
차이점은 설치와 실행 과정을 Dockerfile로 옮긴다는 것뿐이다.

먼저 nginx 설정 파일부터 작성한다.

 

우선 프로젝트에 nginx 폴더를 하나 생성하고 그 안에 설정 파일을 하나 만든다.

myconfig.conf
 

그리고 다음과 같은 설정을 작성한다.

 

server {
    listen 80;
    location / {
        proxy_pass http://localhost:8080;
    }
}

 

 

이 설정의 의미는 단순하다.

  • 누군가 80번 포트로 접속하면
  • 모든 경로 요청을
  • localhost:8080으로 전달한다

즉, nginx는 요청을 가로채서 웹 서버가 실행 중인 포트로 다시 안내하는 역할만 한다.

 

 

nginx 설정 파일이 적용되는 위치


리눅스 환경에서 nginx는 다음 디렉터리에 있는 설정 파일들을 자동으로 읽는다.

/etc/nginx/conf.d


따라서 우리가 작성한 설정 파일을 이 디렉터리에 복사하면 된다.

단, 주의할 점이 하나 있다.

기본적으로 다음과 같은 파일이 존재하는데, 이 파일이 우리가 작성한 설정보다 우선 적용될 수 있다.

/etc/nginx/conf.d/default.conf

 

그래서 실제 환경에서는 다음 중 하나를 해야 한다.

  • default.conf를 삭제한다
  • default.conf를 덮어쓴다

이 작업은 Dockerfile에서 처리할 수 있다.

 

 

nginx Dockerfile 작성


이제 nginx를 실행하기 위한 Dockerfile을 작성한다.
nginx 폴더 안에 Dockerfile을 생성한다.

구성은 매우 단순하다.

FROM nginx:1.27.2-alpine

COPY ./myconfig.conf /etc/nginx/conf.d/myconfig.conf
RUN rm /etc/nginx/conf.d/default.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off"]

 

각 줄의 의미는 다음과 같다.

  • nginx 공식 이미지를 기반으로 사용한다
  • 우리가 작성한 설정 파일을 nginx 설정 디렉터리로 복사한다
  • 기본 설정 파일을 삭제한다
  • 80번 포트를 사용한다고 명시한다
  • nginx를 포그라운드 모드로 실행한다

 

 

nginx 이미지 빌드 및 실행


이제 이미지를 빌드한다.

docker build -t nginx:v1 ./nginx

 

 

에러가 없다면 이미지 생성은 정상적으로 완료된다.
Docker Desktop에서도 이미지를 확인할 수 있다.

 

 

이제 컨테이너를 실행한다. 

Docker Desktop에서 해도 되고 명령어로 수행해도 된다.

docker run -d -p 80:80 nginx:v1

 

 

이 설정은 다음 의미를 가진다.

  • 내 컴퓨터의 80번 포트로 들어온 요청을
  • nginx 컨테이너의 80번 포트로 전달한다

브라우저에서 주소창에 다음을 입력해본다.

localhost:80

 

정상이라면 nginx 서버 화면이 표시된다.

 

 

 

 

컨테이너간의 통신이 되지 않을 때의 문제


 

 

 

이제 웹 서버를 8080 포트에 실행한다.
이론적으로는 다음 흐름이 기대된다.

  • 사용자가 80번 포트로 접속
  • nginx가 요청을 가로챔
  • 8080번 포트의 웹 서버로 전달

 

 

하지만 실제로는 웹 서버가 보이지 않는다.

이유는 간단하다.

  • nginx 컨테이너와 웹 서버 컨테이너는
  • 서로 완전히 분리된 다른 가상 컴퓨터이기 때문이다

nginx 설정에 작성한 localhost:8080은 nginx 컨테이너 자신을 가리킨다.

nginx 컨테이너 내부에는 8080 포트도, 웹 서버도 존재하지 않는다.

이 문제를 해결하려면 컨테이너끼리 서로를 찾을 수 있는 방법이 필요하다.

 

 

 

이때 등장하는 것이 Docker 네트워크다.

다음 포스트에서는 Docker 네트워크를 이용해 nginx와 웹 서버를 실제로 연결하는 방법을 다뤄볼 것.