사실 이전에 멀티 컨테이너 애플리케이션 환경을 다뤄봤지만, Docker network를 정리하면서 다시 다룬다.
실제 애플리케이션을 개발하다 보면 하나 이상의 컨테이너가 필요한 경우가 많다.
두 가지 주요 이유
- 관심사 분리 (Separation of Concerns)
- 각 컨테이너는 하나의 주요 작업에 집중하는 것이 좋은 관행
- 예: 웹 서버 실행, 데이터베이스 실행, 캐시 서버 실행 등을 각각 분리
- 구성의 복잡성
- 하나의 컨테이너에서 여러 "주요 작업"을 수행하도록 설정하는 것은 매우 어려움
- 예: 웹 서버 + 데이터베이스를 한 컨테이너에서 실행하는 것은 비현실적
통신의 필요성
- 멀티 컨테이너 환경에서는 통신이 필수적이다.
- 컨테이너끼리 통신
- 컨테이너와 호스트 머신 간 통신
- 컨테이너와 외부 인터넷(WWW) 간 통신
통신 방법(3가지)
1. 외부 인터넷과 통신 (WWW)
특징
- 가장 간단함
- 별도 설정 불필요
- 컨테이너에서 외부 API로 HTTP 요청 등을 보낼 수 있음
예시: JavaScript
fetch('https://some-api.com/my-data').then(...)
작동 방식
- 컨테이너에서 실행 중인 애플리케이션이 외부 서버로 요청을 보냄
- Docker가 자동으로 처리
- 추가 설정 없이 즉시 작동
언제 사용하는가
- 외부 API 호출 (날씨 API, 결제 API 등)
- 외부 데이터베이스 서비스 접속
- 써드파티 서비스와 통신
2. 호스트 머신과 통신
문제 상황
- 개발 중 로컬 머신에서 실행 중인 서비스에 접속해야 할 때
- 예: 호스트에서 실행 중인 개발용 데이터베이스
일반적인 코드 (작동하지 않음)
fetch('localhost:3000/demo').then(...)
왜 작동하지 않는가?
- localhost는 컨테이너 내부를 가리킴
- 호스트 머신을 가리키지 않음
- 컨테이너는 격리된 환경이므로 "localhost"의 의미가 다름
해결책: 특수 주소 사용
fetch('host.docker.internal:3000/demo').then(...)
host.docker.internal의 의미
- Docker가 제공하는 특수 식별자
- 컨테이너를 호스팅하는 머신의 IP 주소로 변환됨
- Docker가 자동으로 요청을 감지하고 IP를 해석함
중요한 주의사항
- 주로 개발 환경에서만 필요
- 프로덕션 환경에서는 거의 사용하지 않음
- 서버에 배포한 컨테이너는 보통 호스트와 통신할 필요가 없음
사용 예시
# 호스트에서 MySQL 실행 중 (포트 3306)
# 컨테이너에서 접속:
mysql://host.docker.internal:3306/mydb
3. 다른 컨테이너와 통신
시나리오
- 웹 서버 컨테이너가 데이터베이스 컨테이너와 통신
- 백엔드 API 컨테이너가 Redis 캐시 컨테이너와 통신
두 가지 방법
- 방법 1: 수동으로 IP 주소 찾기(비권장)
- 문제점
- 컨테이너의 IP를 수동으로 찾아야 함
- IP가 변경될 수 있음
- 유지보수가 어려움
- 권장하지 않음
- 문제점
- 방법 2: Docker Networks 사용(권장)
- 작동 방식
- Docker Network를 생성
- 통신할 컨테이너들을 같은 네트워크에 연결
- 컨테이너 이름으로 서로 통신 가능
- 작동 방식
Network 생성(방법 2)
docker network create my-network
컨테이너를 네트워크에 연결
docker run --network my-network --name cont1 my-image
docker run --network my-network --name cont2 my-other-image
컨테이너 간 통신
// cont2에서 cont1으로 요청
fetch('cont1/my-data').then(...)
핵심 장점
- 컨테이너 이름을 직접 사용 가능
- Docker가 자동으로 IP를 해석
- IP 변경에 대해 걱정할 필요 없음
- 명확하고 유지보수하기 쉬움
정리
통신 대상 주소/식별자 추가 설정 용도 환경
| 외부 인터넷 (WWW) | 실제 URL<br>(https://api.com) | 불필요 | 외부 API 호출 | 개발/프로덕션 모두 |
| 호스트 머신 | host.docker.internal | 불필요 | 로컬 개발용 서비스 접속 | 주로 개발 환경 |
| 다른 컨테이너 | 컨테이너 이름<br>(container-name) | Docker Network 필요 | 마이크로서비스 간 통신 | 개발/프로덕션 모두 |
Docker Network Commands
# 네트워크 생성
docker network create <network-name>
# 네트워크 목록 조회
docker network ls
# 네트워크 상세 정보
docker network inspect <network-name>
# 네트워크 삭제
docker network rm <network-name>
# 사용하지 않는 네트워크 정리
docker network prune
실행 중인 컨테이너를 네트워크에 연결
# 네트워크에 연결
docker network connect <network-name> <container-name>
# 네트워크에서 분리
docker network disconnect <network-name> <container-name>
반응형
'Infra > Docker' 카테고리의 다른 글
| 컨테이너 배포: 자동(관리형 서비스) (0) | 2025.12.15 |
|---|---|
| 컨테이너 배포: 수동(자체 관리형) (0) | 2025.12.14 |
| Docker Data & Volumes (0) | 2025.12.12 |
| Docker Image & Container 명령어 정리 (0) | 2025.12.12 |
| Container의 근반이 되는 기술에 대해 알아보자(완) UnionFS (0) | 2025.12.11 |