복수 개의 컨테이너를 실행시키는 도커 어플리케이션이 정의를 하기 위한 툴이다.
Compose를 사용하면 YAML파일을 사용하여 애플리케이션의 서비스를 구성할 수 있다.
그런 후, signal command를 사용하여 구성에서 모든 서비스를 만들고 시작한다.
Compose는 모든 환경((workflow에서 production, staging, development, testing 및 CI 워크플로우)을 포함합니다.
기본적으로 3Step의 프로세스를 사용한다.
1. 앱의 환경을 정의하여 어디에서나 재사용할 수 있는 Dockerfile을 정의.
2. docker-compose.yml 에서 앱을 구성할 수 있는 서비스를 정의. 그래서 단 하나의 환경에서 실행할 수 있게 함.
3. docker-compose up 명령어를 실행합니다. 그리고 Compose를 시작시키고 전체의 앱을 실행
Compose는 프로젝트 이름을 사용하여 서로 환경을 분리, 이 프로젝트 이름을 다른 컨텍스트에서 사용할 수 있다.
+) 컨텍스트 :
기본적인 프로젝트 이름은 프로젝트 디렉토리의 basename이다. 프로젝트 이름을 -p 명령어 옵션 또는 COMPOSE_PROJECT_NAME 환경 변수를 사용하여 프로젝트 이름을 커스텀할 수 있습니다.
서비스에 의해 사용되어 지는 모든 볼륨을 막을 수 있다. docker-compose up명령어를 실행했을 때, docker-compose를 실행하면 이전 실행에서 컨테이너를 찾았을 때, 이 전 컨테이너의 볼륨을 새 컨테이너로 복사를 합니다.
이 프로세스를 통해 볼륨에서 만든 데이터가 손실되지 않도록 합니다.
docker-compose명령어를 윈도우에서 실행을 한다면 환경변수 설정이 필요할 수 있습니다.
Compose가 컨테이너를 생성하기 위해서 설정을 캐싱해놓습니다.
변경되지 않은 서비스를 재시작 하였을 때 Compose는 기존 컨테이너를 다시 사용합니다.
컨테이너를 다시 사용한다는 것은 환경을 매우 빠르게 변경 할 수 있다는 것을 의미합니다.
Compose는 Compose files 에서 변수를 지원합니다. 이러한 변수를 사용하여 다른 환경 또는 다른 사용자에 대한 Compose를 사용자 정의 할 수 있습니다.
docker-compose.yml
가 위치한 디렉토리 이름 뒤에 _default
가 붙는다. ex) 디렉토리 이름이 our_app이라면 our_app_default$ docker-compose exec web ping db
PING db (192.168.48.2) 56(84) bytes of data.
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=2 ttl=64 time=0.162 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=3 ttl=64 time=0.080 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=4 ttl=64 time=0.348 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=5 ttl=64 time=0.195 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=6 ttl=64 time=0.187 ms
docker-compose.yml
에 web서비스의 ports설정이 아래와 같다면,services:
web:
build: .
ports:
- "8001:8000"
호스트 컴퓨터에서 접속할 떄는 8001 포트를 사용해야 하고, 같은 디폴트 네트워크 내의 다른 컨테이너에서 접속할 때는 포트 8000을 사용해야한다.
$ curl -I localhost:8001 // 호스트 컴퓨터에서 web서비스 컨테이너 접속
$ docker-compose exec alpine curl -I web:8000 // 같은 네트워크 내의 다른 컨테이너에서 web서비스 컨테이너 접속