2개 이상의 컨테이너로 구성된 도커 어플리케이션을 정의하고 동작시키는 도구다. 컴포즈는 YAML 파일을 이용해서 각 컨테이너를 설정한다. 하나의 명령어로 설정된 모든 컨테이너를 생성하고 실행한다. 제품, 개발, 테스트, CI 단계에서 활용가능하다. 도커 컴포즈의 활용을 보기위해 Node.js 와 redis를 각각의 컨테이너로 구성하고 이를 도커 컴포즈로 관리해보자.
💡 실습 코드는 github에서 볼 수 있습니다.
nodemon 과 redis 모듈을 node.js에 설치해주어야 한다. 그렇게 하기 위해서 package.json
파일에 종속성을 추가하자.
server.js
파일에 express와 redis를 실행하는 기본 코드를 작성한다.
server.js
에서 구현한 redis client의 host는 원래 redis가 떠있는 서버의 Url을 설정해 준다. 하지만 도커 컴포즈를 이용할 때는 host 옵션을 docker-compose.yml
에 명시한 서비스 이름으로 설정한다. 다음은 Dockerfile
을 작성해준다.
COPY ./package.json ./
을 세번째로 넣어준 이유는 도커 레이어 캐싱을 이용하기 위함이다. 이 상태에서 도커 이미지를 빌드하고 컨테이너를 동작시키면 node.js가 redis를 찾지 못한다. 이는 위에서 설명한 것 처럼 docker-compose.yml
에서 명시되어져야 한다.
docker-compose.yml
파일에 정의된 코드들을 한줄씩 살펴보자
version : "3"
도커 컴포즈의 버전을 의미한다. 버전마다 지원하는 옵션이 다르다. "3"은 도커 컴포즈의 "3"버전중 제일 최신 버전을 의미한다.
services :
이 아래에서부터 컨테이너들을 정의해준다.
redis-server :
image: "redis"
redis-serve
는 서비스의 이름을 명시하는 것이고 그 서비스는 redis
라는 이미지로 구동된다는 뜻이다.
node-app :
build : .
ports:
- "5000:8080"
node-app
이라는 서비스는 현재 디렉토리에 있는 Dockerfile
을 이용해서 빌드하고 로컬포트 5000번과 컨테이너 포트 8080번을 매핑한다. 라는 뜻이다.
도커 컴포즈 실행은 매우 간단하다. 이미 실행 명령어를 docker-compose.yml
에 정의했기 때문에 짦은 명령어로 실행이 가능하다.
docker-compose up
실행 결과는 아래와 같다.
새로 고침을 할 때마다 숫자가 1씩 올라간다.
코드