실습 구조
클라이언트(브라우저)
│ ▲
│ │
▼ │
Nginx Container
│ ▲
│ │
▼ │
Backend Container
Step 1. Backed 서버에 대한 폴더 및 파일 생성
먼저 실습 폴더(nginx-lab)에 새로운 디렉터리(backend)를 만든다.
mkdir backend

그리고 다음 코드로 /backend/app.py 파일을 생성한다.
from http.server import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler): # HTTP GET 요청을 받으면
def do_GET(self):
body = "Hello from Backend!\n"
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(body.encode()) # "Hello from Backend!\n" 문자열을 반환한다.
server = HTTPServer(("0.0.0.0", 8000), Handler) # 컨테이너 내부의 8000번 포트에서 요청을 기다린다.
print("Backend server started on port 8000")
server.serve_forever()

8000번 포트로 HTTP 요청을 받으면 문자열 "Hello from Backend!\n" 을 반환하는 아주 단순한 파이썬 HTTP 서버이다.
Step 2. Backend 컨테이너에 대한 Dockerfile 작성
다음 내용의 Dockerfile을 생성한다.
FROM python:3.13-slim
COPY app.py /app/app.py
CMD ["python", "/app/app.py"]

Step 3. Compose에 Backend 추가하기
기존의 compose.yaml 파일의 내용을 다음과 같이 수정하여 Backend를 추가한다.
services:
nginx:
build: .
container_name: my-nginx
ports:
- "8080:80"
backend:
build: ./backend
container_name: my-backend
backend 컨테이너의 build context는 현재 폴더(nginx-lab)의 하위 폴더인 backend 폴더이다.
(Backend 컨테이너를 생성할 때 해당 Backend 폴더 내부에 있는 Dockerfile을 통해 생성한다는 의미이다.)
이제 Compose가 관리하는 컨테이너는 nginx와 backend 두 개가 된다.
+ Backend의 포트 설정을 하지 않는 이유
Nginx는 외부에서 접근할 수 있어야 하기 때문에 compose.yaml 파일에서 ports 설정을 사용했지만
Backend는 외부 사용자가 직접 접근할 필요가 없기 때문에 ports 설정을 하지 않고
클라이언트의 요청을 Nginx가 Backend에 대신 전달한다.
Step 4. Docker Compose 네트워크 이해하기
Compose로 서비스를 실행하면 기본적으로 같은 블록에 있는 서비스들이 동일한 Compose 네트워크에 연결된다.
따라서, 예를 들어, Nginx 컨테이너에서 Backend 컨테이너를 찾을 때 실제 IP 주소 대신에 이름(Service Name)으로 찾을 수 있다.
즉, Docker 내부 DNS 서버에서 컨테이너들이 서로의 이름을 가지고 통신할 수 있습니다.
Step 5. Nginx 설정 변경하기
nginx/nginx.conf 파일을 다음과 같이 수정한다.
events {}
http {
server {
listen 80;
location / {
proxy_pass http://backend:8000;
}
}
}
이번에는 root나 index가 없고
proxy_pass http://backend:8000;
가 등장한 것을 볼 수 있는데
이 proxy_pass 설정은 Nginx에게 다음과 같이 말하는 것이다.
/로 들어온 요청을 backend 컨테이너의 8000번 포트로 전달해라.
즉 예를 들어, 브라우저가 GET / 을 요청하면 Nginx는 해당 요청을 backend 컨테이너의 8000번 포트로 전달하고 Backend 컨테이너는 문자열 "Hello from Backend!\n" 을 Nginx에 반환하고 다시 Nginx는 그 응답을 브라우저에 전달한다.
Step 6. 컨테이너 실행 후 브라우저에서 확인하기
compose.yaml 파일이 있는 프로젝트 루트에서 다음 Compose 명령어를 실행한다.
docker compose up -d --build
여기서 --build는 Dockerfile이 변경되었으므로 이미지를 다시 빌드하라는 의미이다.
그리고 다음 명령어를 통해 컨테이너들을 확인하면
docker compose ps

정상적으로 두 서비스가 실행중인 것을 볼 수 있다.
이제 브라우저에서 다음으로 접속하면
http://localhost:8080

Nginx의 기존 HTML 페이지가 아니라 backend 서버에서 반환한 문자열이 출력되는 것을 볼 수 있다.
즉, 브라우저는 Backend의 존재를 모르지만 결과적으로 Backend가 응답한 내용을 브라우저가 보게 된다.
Client가 Backend에 직접 요청하고 응답받는 것이 아니라 Nginx가 Client와 Backend 사이에서 요청을 대신 전달하는 바로 이 구조를 Reverse Proxy라고 한다.
'개발 > Docker' 카테고리의 다른 글
| [Docker] Docker Compose (0) | 2026.08.11 |
|---|---|
| [Docker] Dockerfile (0) | 2026.08.10 |
| [Nginx] alias 설정 (0) | 2026.08.10 |
| [Nginx] location 설정 (0) | 2026.08.10 |
| [Docker] Nginx 설정 파일인 nginx.conf 이해하기 (0) | 2026.08.06 |