: 필요한 컨테이너들의 설정을 하나의 파일로 구성해 한번에 띄우도록 하는 것
특징
- 도커에 내장되어있지 않아 별도로 설치해야한다.
- 생산성: 하나의 서비스가 여러개의 컨테이너로 구성되어있을 때 개발 환경을 위해 하나하나 띄우는 것은 생산성을 저하시킨다. 컴포즈를 통해 이러한 생상성 저하를 막을 수 있다.
- Dockerfile을 run할때 부여했던 옵션값들을 모두 컴포즈 yaml에 작성 가능하다.
추가적인 기능
- 스케일링:
docker-compose scale service=2
와 같은 형태로 스케일링이 가능하다.yaml
파일에 scale을 명시할 수도 있다.
depends_on
: 컨테이너간 의존관계와condition
을 설정해, 해당 컨디션이 만족할 때 띄우도록 할 수 있다.
external
프로젝트 생성마다 네트워크, 볼륨을 생성하는 것이 아닌 (외부에) 이미 존재하는 네트워크, 볼륨을 먹일 수 있다.
1 2 3 4 5 6 7 8 9
services: web: image: ubuntu:14.04 networks: - my_network networks: # 사용할 네트워크, 볼륨 my_network: external: true
스웜
: 스웜모드로 생성하면 yaml에 명시한 컨테이너들의 묶음이 하나의 스택이 되고, 해당 컨테이너들은 클러스터에서 일괄 생성된다.
- 이 때는 컴포즈 yaml로 띄웠어도
docker-compose
가 아닌 docker stack으로 제어한다. links
,depends_on
와 같은 컨테이너 간 의존성 정의는 할 수 없다. 스웜 모드이기 때문에 클러스터 내 다른 호스트에 컨테이너가 생성될 수 있는데, 컨테이너간 의존성 정의는 한 호스트에 컨테이너가 생성되어야하기 때문이다.
도커와 컨테이너 생태계
- OCI: 컨테이너 기술이 특정 벤더 or 회사에 의존되지 않도록 중립의 컨테이너 표준을 정의
- 공통적으로 구현되어야 하는 런타임과 이미지 스펙의 표준을 정의한다.
도커: runC + containerd + 도커 엔진
- runC: 컨테이너와 1:1 매칭되는, 런타임 역할
- containerd: 컨테이너 프로세스, 이미지를 관리
- 도커 엔진: containerd와 통신해 runC를 사용할 수 있도록 하는 엔드유저용 도구
- 도커 컨테이너: 각각이 위와 같은 역할을 담당하기 때문에 runC와 containerd는 도커 엔진 없이 독립적으로 사용될 수 있다. 그래도 일반적으로는 도커 엔진과 함께 사용되는데, 따라서 일반적으로 도커 컨테이너라고 부른다.
Reference)
시작하세요! 도커 / 쿠버네티스