Docker Compose 컨테이너 네이밍 규칙과 네트워크 주소 풀 문제 해결
Docker Compose 컨테이너 네이밍 규칙과 네트워크 주소 풀 문제 해결
Docker Compose를 사용하여 다중 컨테이너 애플리케이션을 관리할 때, 컨테이너 이름 지정 방식과 네트워크 구성에 대한 이해는 매우 중요합니다. 이 글에서는 Docker Compose의 기본 네이밍 규칙과 흔히 발생하는 네트워크 주소 풀 고갈 문제의 해결 방법을 알아보겠습니다.
목차
Docker Compose 컨테이너 네이밍 규칙
Docker Compose는 여러 컨테이너를 정의하고 실행하기 위한 도구로, 각 컨테이너에 일관된 이름을 자동으로 부여합니다. 이 네이밍 규칙을 이해하면 로그 확인이나 컨테이너 관리가 훨씬 수월해집니다.
기본 네이밍 패턴
Docker Compose에서 컨테이너 이름은 기본적으로 다음 규칙을 따릅니다:
프로젝트이름_서비스이름_번호
각 구성 요소의 의미는 다음과 같습니다:
- 프로젝트 이름:
docker-compose.yml
파일의name:
속성에서 정의한 값이나, 정의되지 않은 경우 디렉토리 이름 - 서비스 이름: Compose 파일에서 정의한 각 서비스의 키 이름
- 번호: 동일한 서비스의 여러 인스턴스를 실행할 경우 1부터 시작하여 증가
실제 예시
예를 들어, supa-dsket-dev
라는 프로젝트 이름을 가진 Docker Compose 구성에서는 다음과 같은 컨테이너 이름이 생성됩니다:
supa-dsket-dev_studio_1
supa-dsket-dev_kong_1
supa-dsket-dev_analytics_1
(의존성에 포함된 서비스)supa-dsket-dev_meta_1
(의존성에 포함된 서비스)
이러한 네이밍 패턴은 Docker Compose의 기본 동작이며, container_name:
속성을 통해 명시적으로 지정하지 않은 경우에 적용됩니다.
네트워크 주소 풀 고갈 오류
Docker Compose로 환경을 구성하다 보면 다음과 같은 오류 메시지를 만날 수 있습니다:
failed to create network supabase-d-sket-dev_default: Error response from daemon: all predefined address pools have been fully subnetted
이 오류는 Docker가 새로운 네트워크를 생성하기 위한 IP 주소 풀이 고갈되었다는 의미입니다.
오류 발생 예시
다음은 실제 오류 로그의 예시입니다:
data-sketchers@datasketchers-Server ~/docker/supabase-d-sket-dev docker compose up
WARN[0000] The "GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOTRUE_EXTERNAL_GOOGLE_ENABLED" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOTRUE_EXTERNAL_GOOGLE_SECRET" variable is not set. Defaulting to a blank string.
[+] Running 1/1
✘ Network supabase-d-sket-dev_default Error 0.0s
failed to create network supabase-d-sket-dev_default: Error response from daemon: all predefined address pools have been fully subnetted
참고: 로그 상단의 GOTRUE 관련 경고는 Google 인증 설정이 제공되지 않았다는 의미이지만, 네트워크 오류와는 관련이 없는 단순 경고입니다.
오류의 원인
이 문제가 발생하는 주요 원인은 다음과 같습니다:
- Docker는 컨테이너 네트워크를 위해 내부적으로 IP 주소 풀을 관리합니다.
- 여러 Docker 네트워크를 생성하고 삭제하는 과정에서, 특히 네트워크를 제대로 정리하지 않으면 이러한 주소 풀이 고갈될 수 있습니다.
- Docker는 기본적으로 172.17.0.0/16, 172.18.0.0/16 등의 주소 범위를 사용하는데, 이 범위가 모두 할당되면 새로운 네트워크를 생성할 수 없게 됩니다.
문제 해결 방법
네트워크 주소 풀 고갈 문제를 해결하는 여러 방법을 살펴보겠습니다.
1. 사용하지 않는 Docker 네트워크 제거
가장 간단한 해결 방법은 사용하지 않는 Docker 네트워크를 정리하는 것입니다:
1docker network prune
이 명령은 현재 사용되지 않는 모든 네트워크를 제거합니다.
2. Docker 시스템 정리
더 광범위한 정리가 필요하다면, 다음 명령을 사용하여 모든 미사용 Docker 리소스(이미지, 컨테이너, 볼륨, 네트워크)를 제거할 수 있습니다:
1# 주의: 실행 중인 컨테이너는 영향받지 않지만, 중지된 컨테이너와 미사용 이미지는 삭제됩니다
2docker system prune -a
3. Docker 데몬 재시작
여전히 문제가 해결되지 않는다면, Docker 데몬을 재시작해보세요:
1sudo systemctl restart docker
4. Docker 주소 풀 설정 변경
위의 방법으로도 문제가 해결되지 않는다면, Docker의 기본 주소 풀 설정을 직접 변경할 수 있습니다. /etc/docker/daemon.json
파일을 생성하거나 편집하여 다음과 같이 설정합니다:
1{
2 "default-address-pools": [
3 {"base": "172.30.0.0/16", "size": 24},
4 {"base": "172.31.0.0/16", "size": 24}
5 ]
6}
이 설정은 Docker에게 172.30.0.0/16과 172.31.0.0/16 범위를 사용하도록 지시하며, 각 네트워크에 /24 서브넷(256개 IP 주소)을 할당합니다.
설정을 변경한 후에는 Docker 데몬을 재시작해야 합니다:
1sudo systemctl restart docker
Docker 네트워크 설정 최적화
Docker를 프로덕션 환경에서 장기간 사용할 계획이라면, 다음 추가 설정을 고려해보세요:
1. 더 큰 주소 범위 사용
대규모 환경에서는 더 큰 주소 범위를 사용할 수 있습니다:
1{
2 "default-address-pools": [
3 {"base": "172.20.0.0/14", "size": 24},
4 {"base": "192.168.0.0/16", "size": 24}
5 ]
6}
2. 정기적인 네트워크 정리 스케줄링
cron 작업으로 정기적인 네트워크 정리를 설정하는 것도 좋은 방법입니다:
1# 매주 일요일 새벽 2시에 미사용 네트워크 정리
20 2 * * 0 docker network prune -f
3. 컨테이너에 고정 IP 할당
중요한 서비스에는 고정 IP를 할당하여 관리를 용이하게 할 수 있습니다:
1services:
2 database:
3 # ... 다른 설정들 ...
4 networks:
5 app_net:
6 ipv4_address: 172.20.0.2
7
8networks:
9 app_net:
10 driver: bridge
11 ipam:
12 config:
13 - subnet: 172.20.0.0/24
요약
Docker Compose를 사용할 때 컨테이너는 프로젝트이름_서비스이름_번호
형식으로 자동 명명됩니다. 네트워크 관련 문제, 특히 주소 풀 고갈 오류가 발생할 경우, 미사용 네트워크 정리, 시스템 프루닝, Docker 데몬 재시작, 또는 주소 풀 설정 변경을 통해 해결할 수 있습니다.
네트워크 구성을 사전에 최적화하고 정기적으로 미사용 리소스를 정리하면 이러한 문제를 예방할 수 있습니다. Docker의 네트워크 관리 방식을 이해하고 적절하게 설정하는 것이 안정적인 컨테이너 환경 운영의 핵심입니다.