출처 : https://docs.docker.com/get-started
도커 컴포즈는 다중 컨테이너 어플리케이션을 정의하고 공유하기 위해 개발된 기능이다.
이전에 node.js 애플리케이션과 MySQL을 각 컨테이너에 구동하기 위해서 장문의 명령어를 입력하고 네트워크를 따로 생성해주기도 하였다. 물론 컨테이너를 실행에 필요한 인자들은 입력해야겠지만 실행마다 입력하기에는 번거롭고 실수의 우려도 있다. 또한 내 프로젝트를 타인과 공유하는 경우 명령어나 세팅을 공유하여야 제대로 컨테이너가 동작할 것이다.
하지만 위의 그림과 같이 도커 컴포즈를 사용한다면 docker-compose.yml 파일만 제대로 작성해둔다면 다중 컨테이너를 한번에 실행할 수 있고, 타인과 내 프로젝트를 공유하는데에도 훨씬 편할 수 있다.
그렇다면 이렇게 좋은 도커 컴포즈를 한번 사용해보자.
우선 docker-compose.yml 파일을 만들어 내용을 다 입력하고 한 번 살펴보자.
우선 맨 위에는 도커 컴포즈 스키마 버전을 명시한다. 최신 버전은 3.8 버전이다.
그리고 그 아래에 각 서비스를 run 하기 위한 명령어를 명세로 나타낸다. 여기서 각 서비스는 app과 mysql이다.
app 서비스의 이미지, 실행 시 명령어, 포트, 작업 디렉토리, 바인드 마운트, 환경 변수 등을 명시해준다. 그리고 이어서 mysql의 이미지, 볼륨, 환경 변수를 명시해준다.
여기서 주의깊게 봐야할 부분은 services와 같은 layer에 명시된 volumes이다. 명령어로 어플리케이션은 구동하는 경우에는 볼륨이 따로 생성되어 있지 않으면 자동으로 생성해주었지만, 도커 컴포즈 파일에서는 만들어진 volume과 마운팅할 수 있기 때문에 mysql에서 사용하는 볼륨인 todo-mysql-data
라는 볼륨을 하나 생성해주는 것이다.
그리고 명령어에서 명시했던 네트워크를 따로 만들지 않았다. 도커 컴포즈는 애초에 다중 컨테이너 어플리케이션을 위한 기능이기 때문에 자동으로 하나의 네트워크에 묶어준다. 따라서 따로 명시할 필요가 없다.
docker-compose up -d
명령어로 다중 컨테이너를 실행해보자.
위 사진을 참고하여 실행 로그를 보면, 맨 처음 네트워크와 볼륨이 먼저 생성된다. 그리고 각 서비스들이 구동된다.
그리고 docker-compose logs -f
명령어로 실행 로그를 확인해보면, Waiting for mysql:3306...
이라는 로그를 볼 수 있다. 도커에서는 다른 컨테이너와 connect될 수 있는 상태까지 기다리는 기능은 없다. 하지만 node 기반의 프로젝트에서는 wait-port dependency를 사용해서 이러한 기능을 지원해준다.
어쨌든 두 개의 컨테이너가 정상적으로 동작하고 각 서비스가 <project-name>_<service-name>_<replica-number>
형식으로 네이밍 된 것을 볼 수 있다.
간단하다. docker-compose down
명령어면 어플리케이션이 종료된다.