- 모든 .md, .html 파일 권한을 644로 정상화 - .gitignore 파일 권한도 644로 수정 - 문서 파일에 실행 권한은 불필요하고 보안상 바람직하지 않음 - deprecated 아이디어 폴더 생성 및 레벨별 UI 변경 아이디어 이동
102 lines
2.8 KiB
Markdown
102 lines
2.8 KiB
Markdown
# Docker 네트워크 격리로 인한 test-api unreachable 문제 해결
|
|
|
|
## 개요
|
|
- **날짜**: 2025-07-14
|
|
- **문제**: 관리자 대시보드에서 test-api (10508) 서비스가 unreachable 상태
|
|
- **원인**: Docker 네트워크 격리 (DOCKER-ISOLATION iptables 체인)
|
|
|
|
## 문제 상황
|
|
|
|
### 증상
|
|
- 관리자 대시보드에서 test-api 서비스가 지속적으로 `unreachable` 표시
|
|
- 호스트에서는 `curl http://localhost:10508/health` 정상 동작
|
|
- 컨테이너 내부에서는 연결 불가
|
|
|
|
### 네트워크 구성
|
|
```
|
|
frontend_default (172.18.0.0/16)
|
|
├── frontend-backend-1 (172.18.0.2)
|
|
└── frontend-frontend-1 (172.18.0.3)
|
|
|
|
appnet (172.21.0.0/16)
|
|
└── rb10508_test (172.21.0.2)
|
|
```
|
|
|
|
## 원인 분석
|
|
|
|
Docker의 기본 bridge 네트워크 드라이버는 네트워크끼리 완전히 격리하도록 iptables 체인(DOCKER-ISOLATION, DOCKER-USER)을 자동으로 생성합니다.
|
|
|
|
**결과**: 같은 호스트라도 서로 다른 bridge 네트워크에 있는 컨테이너는 호스트 포트(`-p 10508:10508`)로도 통신이 차단됨
|
|
|
|
## 해결 방법
|
|
|
|
### 선택한 해결책: 같은 사용자 정의 네트워크에 연결
|
|
|
|
1. **appnet 네트워크 확인**
|
|
```bash
|
|
docker network ls
|
|
docker network inspect appnet
|
|
```
|
|
|
|
2. **frontend 컨테이너들을 appnet에 연결**
|
|
```bash
|
|
docker network connect appnet frontend-backend-1
|
|
docker network connect appnet frontend-frontend-1
|
|
```
|
|
|
|
3. **연결 확인**
|
|
```bash
|
|
docker network inspect appnet
|
|
# 모든 컨테이너가 나타나는지 확인
|
|
```
|
|
|
|
4. **테스트**
|
|
```bash
|
|
docker exec frontend-backend-1 curl -s -o /dev/null -w "%{http_code}" http://rb10508_test:10508/health
|
|
# 200 응답 확인
|
|
```
|
|
|
|
### 다른 가능한 해결 방법들
|
|
|
|
1. **docker-compose.yml에서 네트워크 설정**
|
|
```yaml
|
|
services:
|
|
backend:
|
|
networks:
|
|
- appnet
|
|
networks:
|
|
appnet:
|
|
external: true
|
|
```
|
|
|
|
2. **host 네트워크 사용** (보안상 비추천)
|
|
```yaml
|
|
network_mode: "host"
|
|
```
|
|
|
|
3. **iptables 예외 규칙** (관리 복잡)
|
|
```bash
|
|
iptables -I DOCKER-USER -i br0 -o br1 -j ACCEPT
|
|
```
|
|
|
|
## 주의사항
|
|
|
|
1. **영구 설정**: 컨테이너 재시작 시 네트워크 연결이 유지되려면 docker-compose.yml 수정 필요
|
|
2. **DNS 해결**: 같은 네트워크에 있으면 컨테이너 이름으로 통신 가능
|
|
3. **보안**: 필요한 컨테이너만 같은 네트워크에 연결
|
|
|
|
## 검증 방법
|
|
|
|
```bash
|
|
# 네트워크 연결 상태 확인
|
|
docker network inspect appnet | grep -A 5 "Containers"
|
|
|
|
# 관리자 대시보드에서 서비스 상태 확인
|
|
curl http://localhost:8000/admin/services/status
|
|
```
|
|
|
|
## 참고사항
|
|
|
|
- Docker 네트워크 격리는 보안을 위한 의도된 동작
|
|
- 같은 네트워크에 있는 컨테이너끼리만 직접 통신 가능
|
|
- 서로 다른 네트워크 간 통신은 명시적인 설정 필요 |