Chapter 5- Docker Compose

권대규·2021년 8월 29일
0

본 포스트는 Inflearn '따라하며 배우는 도커와 CI환경' 강의를 기반으로 작성되었습니다.

What is Docker compose?

docker compose란 다중 컨테이너 도커 어플리케이션을 정의하고 실행하기 위한 도구라로 합니다. 하지만 해당 설명만 들었을 때는 그닥 잘 이해가 가지 않습니다. 실습을 통해서 docker compose가 무엇인지 알아보도록 하겠습니다. 이번에 실습 때 간단하게 만들어 볼 프로그램은 페이지 refresh 시마다 카운트가 올라가는 웹이고 해당 과정에서 redis가 실행되는 container와 nodejs app이 실행되는 컨테이너, 이렇게 두 가지를 생성해 볼 것입니다.

Make application

우선 npm init으로 package를 생성해준 후, 간단하게 server.js를 다음과 같이 짜줍니다.

지난 업로드와 다른 부분에 대해서 간략히 설명하자면 redis와 관련된 부분이 생겼다는 겁니다. 함수이름에서도 알 수 있듯이, redis Client를 생성하는 함수이고, 해당 부분의 parameter에서 host의 경우에는 원래는 server가 작동되고 있는 곳의 주소를 적어야 하지만, docker-compose 내에서는 docker-compose.yml이 명시한 컨테이너 이름을 주면 된다고 합니다. 포트번호는 기본적으로 레디스에서 세팅된 포트번호라고 합니다.

위에서 언급했던 숫자가 늘어나는 기능도 redis와 연계해서 코드를 작성하면 다음과 같습니다.

Make Dockerfile

다음과 같이 도커파일도 작성해줍니다.

Run Application

이제 어플리케이션을 실행해볼 겁니다. 어플리케이션이 레디스 클라이언트를 사용하기에 레디스 서버를 먼저 켜보겠습니다.

docker run redis를 사용하면 redis server가 정상적으로 부팅됨을 확인할 수 있습니다. 하지만 이 상태에서 다른 터미널에서 위에서 위에서 작성한 이미지를 빌드한 후, 컨테이너에 올릴 경우 다음과 같은 오류가 발생함을 확인할 수 있습니다.

해당 오류는 redis-server와의 연결이 실패했기에 나는 오류입니다. 생각해보면 아직 컨테이너간의 연결에 대해서 어떠한 설정도 안해주었기에 연결되는 것이 더 기이한 일입니다. 그렇다면 컨테이너 사이에 통신은 어떻게 구현할 수 있을까요???

이러한 멀티 컨테이너 상황에서 컨테이너 간의 네트워크를 쉽게 구축하는 방법이 바로 해당 챕터의 핵심임 docker compose를 이용하는 방법입니다.

Write Docker-compose.yml

위에서 말했던 연결과 관련된 정보를 담은 파일은 docker-compose.yml 에 적어줄 것입니다. 이때 담을 정보는 다음과 같습니다.

  1. 버전 명시
  2. 사용할 이미지 명시
  3. 사용할 도커 파일 명시
  4. 포트 매핑

위와 같은 양식으로 진행이 되는데, yml 파일의 경우에는 파이썬처럼 indentation이 중요해서 이를 조심해주셔야 합니다. 우선 맨 위에 버전에 관한 정보를 명시해줍니다. 그 후 사용할 컨테이너들에 대한 정보를 적어 주어야합니다. redis-server의 경우에는 사용할 이미지를 node-app의 경우에는 dockerfile의 경로와 사용할 포트에 대한 정보를 적어줍니다. 이제는 도커파일이 아니라 docker-compose 파일을 활용해서 앱을 실행해보겠습니다. 이는 docker-compose up이라는 명령어로 실행할 수 있습니다.

How to run docker-compose

그 결과 아래와 같이 잘 실행됨을 확인할 수 있습니다.

추가로 변동사항이 있어서 docker-compose 파일로 다시 빌드할 때는 docker-compose up --build 명령어를 사용해서 빌드를 해야 수정사항이 적용이 됩니다.

How to stop docker-compose

up의 반대는 down이죠?
docker-compose down
명령어를 다른 터미널에서 실행시켜주면 해당 docker-compose file과 관련된 컨테이너들이 모두 잘 종료되는 것을 확인할 수 있습니다.

하지만 이러한 방식으로 down을 하는 것은 두 개의 터미널이 필요하다는 단점이 있습니다. 이를 해결하는 방법은 다음과 같습니다.
docker-compose up -d
해당 파라미터를 붙이면 container가 background에서 켜지게 되어 해당 터미널에서도 down 명령어를 사용할 수 있게 됩니다.

profile
글많은 개발자

0개의 댓글