docker-compose.yml
여러 개의 Docker 컨테이너를 한꺼번에 정의하고 실행하는 도구.
🖋 사용 이유
- 간소화된 제어
- 단일 YAML 파일에서 여러 컨테이너 애플리케이션을 정의하고 관리 가능.
- 효율적인 협업
- 파일 공유가 간편하여 개발자, 운영팀, 기타 이해관계자 간의 협업을 촉진.
- 신속한 애플리케이션 개발
- 컨테이너 생성에 사용된 구성을 캐시함. (변경되지 않은 서비스를 다시 시작하면 기존 컨테이너 재사용)
- 다양한 환경 간 이식성 : 변수를 지원하여 다양한 환경이나 사용자에 맞게 구성을 사용자 지정 가능.
🖋 주요 구성 요소
- version : Compose 파일 형식 버전 (compose V2는 필요 없음)
- service : 여러 개의 컨테이너를 정의하는 부분
- image : Docker Hub에서 다운받을 이미지
- build : Dockerfile을 직접 빌드해서 이미지 생성
- ports :
호스트포트:컨테이너포트
포트 매핑
- restart : 컨테이너가 예기치 않게 꺼졌을 때 설정
- volumes : 데이터 지속 저장을 위한 디렉토리 매핑
- environment : 환경변수 설정 (DB 패스워드 등)
- depends_on : 의존성 설정 (실행 순서 조절)
- container_name : 컨테이너 이름 지정
- networks : Docker 컨테이너들 끼리 서로 통신할 수 있도록 네트워크를 묶어주는 설정
🖋 하나의 파일에 모두 작성 VS 각각 파일 작성
- 하나의 파일에 모두 작성
- 모든 서비스는 자동으로 동일한 default 네트워크에 연결
- depends_on, links 등을 사용해 실행 순서 및 의존성도 표현 가능
- 각각 파일 작성
- 서비스는 완전히 독립적
- 서로 다른 네트워크를 사용하여 직접 연결이 안됨.
- 수동으로 연결해줘야 함
networks:
shared-network:
external: true
docker network create shared-network
Dockerfile
- Dockerfile : 이미지를 만들기 위한 명령어 모음.
- Image : "환경 + 코드 + 설정" 이 포장된 파일.
- Container : 이미지를 실행한 실제 인스턴스.
Dockerfile 과 docker-compose.yml 차이
🖋 Dockerfile
- 이미지를 어떻게 만들지 정의 (환경 설정 포함)
- 새로운 이미지를 만들고 싶을 때 사용
- 단일 이미지 중심 (ex. 나만의 java 서버)
docker build
, docker run
으로 실행
🖋 docker-compose.yml
- 이미지들을 어떻게 실행할지 정의 (컨테이너 조합)
- 여러 컨테이너는 한 번에 실행할 때 사용
- 여러 서비스 조합 (ex. 웹 + DB + 캐시)
docker-compose up
으로 실행