컨테이너 환경에서 nginx와 웹서버가 통신하지 못하는 이유
컨테이너는 서로 완전히 분리된 컴퓨터다
Docker 컨테이너를 여러 개 띄워두면, 겉보기에는 같은 컴퓨터에서 돌아가는 프로그램처럼 보인다.
하지만 실제로는 각 컨테이너가 독립적인 가상 컴퓨터로 동작한다.
지금 상황을 정리하면 다음과 같다.
- nginx 컨테이너 : 80번 포트에서 실행 중
- Node.js 웹서버 컨테이너 : 8080번 포트에서 실행 중
nginx 설정에서는 이렇게 작성했다.
- “누가 80번 포트로 접속하면 localhost:8080으로 보내라”
그런데 nginx 컨테이너 안에서 localhost는 nginx 컨테이너 자신이다.
즉, nginx는 다음과 같이 생각한다.
- 내 컴퓨터의 8080 포트로 접속하라
하지만 nginx 컨테이너 내부에는
- 8080 포트도 열려 있지 않고
- 8080에서 실행 중인 서버도 없다
웹서버는 완전히 다른 컨테이너, 즉 다른 컴퓨터에 있기 때문이다.
Docker 네트워크로 컨테이너 간 통신 구성하기
Docker 네트워크의 핵심 개념
Docker에서는 컨테이너 간 통신을 위해 네트워크(Network)라는 개념을 제공한다.
네트워크를 하나 만들고, 그 안에 컨테이너들을 집어넣으면 다음이 자동으로 이루어진다.

- 각 컨테이너에 가상 IP 주소가 부여된다
- 같은 네트워크 안의 컨테이너끼리는 서로 통신 가능하다
- 실제 IP처럼 주소와 포트로 접근할 수 있다
즉, 컨테이너들을 같은 사설 네트워크 안에 있는 컴퓨터들처럼 만들어주는 것이다.
Docker 네트워크 생성하기
먼저 네트워크를 하나 생성한다.
docker network create mynet

현재 존재하는 네트워크 목록을 보고 싶다면 다음 명령어를 사용한다.
docker network ls

host 모드도 있지만, 이는 다음과 같은 특징이 있다.
- 컨테이너가 호스트 네트워크를 그대로 사용
- 권한이 과도하게 커짐
- 보안 리스크 증가
대부분의 경우 bridge 모드가 가장 안전하고 적절하다.
네트워크에 컨테이너 포함시켜 실행하기
그 다음, 네트워크 옵션을 포함해 컨테이너를 다시 실행한다.
nginx 컨테이너 실행
docker run -d -p 80:80 --network mynet --name nginx-container nginx:v1

의미는 다음과 같다.
- 호스트의 80번 포트를 nginx 컨테이너의 80번 포트와 연결
- mynet1 네트워크에 포함
- 컨테이너 이름을 nginx-container로 지정
웹서버 컨테이너 실행
docker run -d -p 8080:8080 --network mynet --name server-container nodeserver:v1

이제 두 컨테이너는 같은 네트워크에 속해 있다.
Docker Desktop에서 컨테이너를 선택하고 Inspect 메뉴로 들어가면 네트워크 정보가 보인다.


- 어떤 네트워크에 속해 있는지
- 어떤 가상 IP 주소가 할당되었는지
이 IP 주소는 네트워크 안에서 실제 IP처럼 사용할 수 있다.
컨테이너 간 통신여부 확인하기
nginx 컨테이너 안으로 들어가서 웹서버 컨테이너에 직접 접속해본다.
curl 172.18.0.3

위와 같이 웹서버가 응답을 보내온다면, 컨테이너 간 통신이 정상적으로 이루어지고 있다는 뜻이다.
그런데 IP 주소는 기억하기 어렵다.
다행히 Docker 네트워크에는 내부 DNS가 자동으로 제공되기 때문에 다음과 같은 요청도 가능하다.
curl server-container

nginx 설정에서 localhost를 바꿔야 하는 이유
이제 컨테이너 간 통신은 가능해졌지만 하지만 브라우저에서 여전히 웹서버가 보이지 않는다.
이유는 nginx 설정 때문인데, nginx 설정에는 아직 이렇게 작성되어 있다.
proxy_pass http://localhost:8080;
하지만 nginx 컨테이너 기준에서 localhost는 여전히 자기 자신이다.
따라서 이를 웹서버 컨테이너의 주소로 변경해야 한다.
proxy_pass http://server-container:8080;

nginx 이미지 다시 빌드하고 실행하기
설정을 수정한 뒤 nginx 이미지를 다시 빌드한다.
기존 컨테이너를 모두 삭제한 뒤,
- 웹서버 컨테이너 실행
- nginx 컨테이너 실행
이 순서로 다시 띄우고 이제 브라우저에서 다음 주소로 접속하면 된다.
localhost:80
# localhost와 같음
80번 포트로 접속했지만, 실제로는 nginx를 거쳐 웹서버까지 정상적으로 연결된다.

불필요한 포트 공개 줄이기
이제 nginx가 모든 요청을 받아 웹서버로 전달한다.
따라서 웹서버 컨테이너의 8080 포트를 외부에 공개할 필요가 없다.
-p 8080:8080
위 옵션을 제거하면 구조가 더 단순하고 안전해진다.
'Tool 활용법 > Docker 활용법' 카테고리의 다른 글
| Docker 컨테이너로 DB 실행하고 Volume으로 데이터 보존하기 (0) | 2026.02.09 |
|---|---|
| Docker 컨테이너 간 통신이 필요한 이유와 Nginx Reverse Proxy (0) | 2026.02.06 |
| [Docker 기초 5] Docker Hub로 이미지 업로드하고 공유하기 (0) | 2026.02.06 |
| [Docker 기초 4] Dockerfile 성능 최적화 방법 (Cache, Multi-Stage build) (0) | 2026.02.06 |
| [Docker 기초 3] Docker Container 필수 명령어 정리 (0) | 2026.02.06 |