도커 컴포즈로 여러 개의 컨테이너를 띄우다가 충돌이 발생했다. 분명 둘 다 다른 이미지들을 사용하고, 다른 디렉터리 안에서 구성되는데 A를 켜면 B가 꺼지고, B를 켜면 A가 종료되었다.
이유를 찾아보며 그 원인을 정리해 보았다.
docker-compose 프로젝트
- 기본적으로 docker-compose는 프로젝트 단위로 동작한다.
- 여기서 말하는 프로젝트는 컨테이너, 네트워크, 볼륨 이름을 묶어 관리하는 단위
기본 동작 방식
- docker-compose는 디폴트로 현재 디렉토리명을 프로젝트 이름으로 사용한다.
cd /home/labs/jenkins/workspace/TEST/docker-compose/
docker-compose up -d
- 네트워크 : docker-compose_default
- 볼륨 : docker-compose_postgres-volume
- 컨테이너 : docker-compose_tomcat
근데 위에서 언급한 충돌이 발생한 까닭은 아래와 같은 경우이다.
# 1
cd /home/labs/jenkins/workspace/TEST/docker-compose/
docker-compose up -d
# 2
cd /home/labs/jenkins/workspace/TEST-2/docker-compose/
docker-compose up -d
TEST, TEST-2로 나뉜 디렉터리이지만 docker-compose 파일이 존재하는 상위 디렉터리는 docker-compose로 동일해서, 결론적으로는 두 환경에서 동일한 이름이 만들어져 충돌이 나게 된다.
-p 옵션의 역할
- 아래처럼 -p로 프로젝트 이름을 직접 지정하면, 아래처럼 모든 내부 자원에 접두사가 바뀐다.
docker-compose -p test_dev up -d
docker-compose -p test_qa up -d
- 네트워크 : test_dev_default, test_qa_default
- 볼륨 : test_dev_postgres-volume, test_qa_postgres-volume
- 컨테이너 : test_dev_tomcat, test_qa_tomcat
이렇게 하면 서로 완전히 격리된 환경이 되기 때문에, 동시에 띄워도 충돌이 나지 않는다.
정리하자면, -p 옵션을 사용하여 생성되는 컨테이너, 네트워크, 볼륨 이름에 고유 prefix 부여하여 충돌을 막을 수 있다. 이번처럼 CI/CD, Jenkins, 또는 로컬 테스트 환경을 여러 개 띄우는 구조에서는 -p 옵션을 써야 안정적일 것이다.
'Docker' 카테고리의 다른 글
[Docker] dockerd / docker.socket (0) | 2025.06.15 |
---|---|
[Docker] Docker Compose - 예제 (도커 강의 정리 #6) (0) | 2025.05.16 |
[Docker] Docker Compose (도커 강의 정리 #5) (0) | 2025.05.08 |
[Docker] Dockerfile (도커 강의 정리 #4) (0) | 2025.04.30 |
[Docker] Docker Volume (도커 강의 정리 #3) (0) | 2025.04.23 |