- r
- SQL
- 코딩테스트
- 이기적
- Ai
- python
- 데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 오라클
- boostcoures
- Django
- 이것이 취업을 위한 코딩테스트다 with 파이썬
- boostcourse
- 기초다지기
- 빅데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 빅분기
- 인공지능기초다지기
- 파이썬
- [멀티잇]데이터 시각화&분석 취업캠프(Python)
- 정보처리기사
- 빅데이터분석기사
- 코딩테스트 python
- 네이버부스트캠프
- Oracle
- 프로그래머스
- PY4E
- AI 플랫폼을 활용한 데이터 분석
- 데이터베이스
- DB
- unsub
- 부스트코스
- Today
- Total
매일공부
[Docker] docker-compose 없이 Container Manager로 nginx 붙이기 본문
배경
앞 글(DEBUG=False의 함정)에서 다룬 미디어 파일 문제를 nginx로 해결하기로 했다. 문제는 이 프로젝트가 Dockerfile/docker-compose.yml 없이 Synology Container Manager UI로 컨테이너를 수동 생성/관리하는 구조라는 것 — nginx를 붙이는 절차도 그에 맞춰야 했다.
nginx 설정 파일 준비
server {
listen 80;
server_name _;
client_max_body_size 20M;
location /static/ {
alias /app/staticfiles/;
}
location /media/ {
alias /app/media/;
}
location / {
proxy_pass http://<django-컨테이너>:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
볼륨 마운트 3개로 Container Manager에서 연결한다.
- 이 설정 파일 → /etc/nginx/conf.d/default.conf
- 정적 파일 폴더(collectstatic 결과물) → /app/staticfiles
- 미디어 파일 폴더 → /app/media
배포 순서가 꼬였던 부분
처음엔 이 nginx 설정 파일을 git 저장소 안에 만들어뒀는데, 곰곰이 생각해보니 순서가 이상했다 — Container Manager는 NAS 파일시스템만 보기 때문에, git 저장소(로컬 PC)에만 있는 파일은 볼륨 마운트 대상이 될 수 없다. 그리고 애초에 nginx 설정은 Django 앱 코드가 아니라 별도 컨테이너의 인프라 설정이라, 이걸 위해 git 배포 파이프라인(push → CI → 운영 반영)을 거칠 이유도 없었다.
정리: nginx 설정 파일은 git 저장소 밖, NAS의 별도 폴더에 직접 만들어서 그 경로로 볼륨 마운트했다. 로컬 저장소에는 참고용 사본만 남겨두는 정도로 충분했다.
proxy_pass엔 컨테이너 이름이 아니라 실제 접속 가능한 주소가 필요
nginx 설정의 proxy_pass http://<컨테이너이름>:8001;은 두 컨테이너가 같은 Docker 네트워크에 있을 때만 컨테이너 이름으로 서로를 찾을 수 있다. 그런데 기존 Django 컨테이너는 Synology 기본 브릿지 네트워크를 쓰고 있었고, 이 기본 브릿지에서는 컨테이너 이름으로 서로를 찾을 수 없다 (DB 연결은 별도의 레거시 "Link" 기능으로 되어 있었다).
두 가지 선택지가 있었다.
- NAS의 LAN IP + 열려있는 포트로 직접 연결 — Django 컨테이너를 전혀 안 건드려도 되는 간단한 방법
- 커스텀 브릿지 네트워크를 새로 만들어서 관련 컨테이너를 다 그 안에 넣기 — 더 깔끔하지만 기존 컨테이너들을 재생성해야 함
마침 "안정화 단계라 컨테이너를 다시 만들어도 괜찮다"는 상황이라 2번(커스텀 네트워크)으로 진행했다.
참고: Docker 커스텀 브릿지 네트워크는 시놀로지 제어판의 네트워크 설정과는 무관하다. Container Manager 앱 안의 Network 탭에서 별도로 만드는 것.
이 네트워크 전환 과정에서 겪은 DB 연결 사고는 별도 글(네트워크 통합하다가 DB가 끊긴 사고)에서 다뤘다.
마지막 장애물 — 80번 포트는 이미 쓰이고 있었다
nginx 컨테이너의 호스트 포트를 80으로 설정하려니 충돌이 났다. Synology DSM 자체가 기본적으로 80번 포트를 쓰고 있어서(DSM 웹 관리 페이지 등), NAS에서는 80/443을 컨테이너에 그대로 열어주기 어려운 경우가 흔하다.
해결: nginx는 호스트 포트 8080으로 띄우고, DSM의 리버스 프록시 규칙에서 Destination(목적지) 포트만 기존 Django 포트에서 nginx 포트(8080)로 바꿨다.
- Source(외부에서 들어오는 쪽, 보통 443/HTTPS)는 그대로 둔다 — SSL 처리는 DSM이 계속 담당
- Destination(내부로 전달하는 쪽)만 nginx가 열려있는 포트로 바꾼다
Django 컨테이너의 기존 포트(8001)를 nginx가 그대로 가져가는 방법도 있었지만(그러려면 Django 컨테이너를 다시 재생성해야 함), 이미 DB 문제를 한 번 겪은 뒤라 운영 컨테이너를 또 건드리는 리스크를 피하고 더 안전한 쪽(nginx만 새 포트로, 리버스 프록시 설정만 한 줄 수정)을 택했다.
정리
- 인프라 설정 파일(nginx.conf 등)은 앱 코드 배포 파이프라인과 분리해서, 그 설정을 실제로 쓰는 곳(여기서는 NAS 파일시스템)에 직접 둔다
- proxy_pass에 컨테이너 이름을 쓰려면 두 컨테이너가 같은 Docker 네트워크에 있어야 한다 — 아니면 IP로 직접 연결하거나, 네트워크를 통합해야 한다
- NAS 환경에서는 80/443 포트가 이미 관리 UI에 쓰이고 있을 수 있으니, 컨테이너는 다른 포트로 띄우고 리버스 프록시의 목적지 포트만 바꾸는 게 기존 컨테이너를 안 건드리는 안전한 방법이다
'IT > 작업기록' 카테고리의 다른 글
| [MariaDB] 전혀 다른 작업 중에 우연히 발견한 버전 불일치 문제 (0) | 2026.08.28 |
|---|---|
| [Docker] 네트워크 통합하다가 DB가 통째로 끊긴 사고 (0) | 2026.08.28 |
| [Django] 화면에서 로고 이미지가 깨지는데 PDF에는 정상 — DEBUG=False의 함정 (0) | 2026.08.27 |
| [배포] PDF는 한글이 정상인데 운영서버 배포 후에만 깨진 이유 (0) | 2026.08.27 |
| [Django] select_related 하나로 쿼리가 490개→29개 준 이유 (0) | 2026.08.20 |