시놀로지 NAS나 자작 홈서버에서 컨테이너 서비스를 하나둘 늘려가다 보면 가장 먼저 맞닥뜨리는 문제가 포트 충돌과 보안 격리입니다.
기본 bridge나 host 네트워크를 무분별하게 사용할 경우, 컨테이너가 시스템의 모든 포트에 노출되거나 동일한 기본 포트(예: 80, 443, 3000)를 사용하는 서비스끼리 충돌을 일으키게 됩니다.
홈랩에서 운영 중인 여러 서비스를 안정적으로 유지하기 위해 적용한 Docker 사용자 정의 네트워크 분리 전략을 정리합니다.
기본 브릿지(Bridge) 네트워크의 한계
Docker의 기본 bridge 네트워크는 다음과 같은 제약이 있습니다:
- 컨테이너 이름 기반 DNS 해석 불가: IP 주소로만 통신해야 하므로 컨테이너 재시작 시 IP가 바뀌면 서비스 간 연결이 끊어집니다.
- 서비스 간 보안 격리 부재: 외부로 노출되는 웹 프론트엔드와 내부 데이터베이스가 동일한 평면 네트워크에 놓이게 됩니다.
사용자 정의 네트워크 구성 (docker-compose.yml)
외부 트래픽을 처리하는 프론트엔드 네트워크(frontend-net)와 데이터베이스 전용 내부 네트워크(backend-net)를 분리하여 구성합니다.
YAML
version: "3.8"
networks:
frontend-net:
driver: bridge
backend-net:
internal: true # 외부 인터넷 및 타 컨테이너 직접 접근 차단
services:
web-app:
image: my-web-app:latest
networks:
- frontend-net
- backend-net
ports:
- "8080:80"
database:
image: postgres:15-alpine
networks:
- backend-net # frontend-net에는 연결하지 않음
environment:
POSTGRES_PASSWORD: mysecretpassword
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
backend-net에 internal: true를 지정하면, 데이터베이스 컨테이너는 오직 web-app 컨테이너를 통해서만 통신할 수 있으며 외부 인터넷이나 다른 컨테이너에서는 물리적으로 접근할 수 없습니다.
Synology Container Manager 활용 시 주의점
Synology DSM 7.2 이상에서는 Container Manager에서 Docker Compose 프로젝트를 기본 지원합니다.
- YAML 파일 내 볼륨 경로는 반드시
/volume1/docker/...형태의 절대 경로를 사용합니다. - 프로젝트 이름이 네트워크 이름의 접두사로 붙으므로, 서로 다른 프로젝트 간 공유 네트워크가 필요하다면
external: true를 지정한 전역 네트워크를 사전에 생성해 두는 것이 좋습니다.
단순히 포트 번호를 바꿔가며 충돌을 피하기보다는, 컨테이너 목적별로 가상 네트워크를 분리해 두면 포트 충돌 없이 깔끔하고 안전하게 홈랩을 운영할 수 있습니다.
