7.2.도커 컴포즈를 사용해 여러 컨테이너로 구성된 애플리케이션 실행하기

version: '3.7'

services:

  accesslog:
    image: diamol/ch04-access-log
    networks:
      - app-net

  iotd:
    image: diamol/ch04-image-of-the-day
    ports:
      - "80"
    networks:
      - app-net

  image-gallery:
    image: diamol/ch04-image-gallery
    ports:
      - "8010:80" 
    depends_on:
      - accesslog
      - iotd
    networks:
      - app-net

networks:
  app-net:
    external:
      name: nat
  • accesslog:
  • 공개하는 포트나 docker container run 명령에서 사용할 법한 설정값도 없다.
  • iotd:
  • 80번 포트를 호스트 컴퓨터의 무작위 포트를 통해 공개
  • image-gallery:
  • 8010번 포트를 통해 공개
  • depends_on 항목을 추가해 다른 두 서비스에 의존한다는 사실 기술
  • 이 의존성을 만족하기 위해 컴포즈는 나열된 두 서비스를 먼저 실행하려 시도하게 된다.

다이어그램

스케일링

  • 웹 컨테이너(image-gallery)가 API에 데이터를 요청하면 도커가 여러 개의 API 컨테이너에 이 요청을 고르게 분배
001)  docker-compose up -d --scale iotd=3
002) [+] Running 5/5
003)   Container image-of-the-day-accesslog-1      Running                                                              0.0s 
004)   Container image-of-the-day-iotd-3           Started                                                              8.5s 
005)   Container image-of-the-day-iotd-1           Started                                                              8.3s 
006)   Container image-of-the-day-iotd-2           Started                                                              8.8s 
007)   Container image-of-the-day-image-gallery-1  Started 

컨테이너 로그 출력

  • API 서비스가 요청을 처리할 때마다 남기는 컨테이너 로그를 확인
  • 모든 컨테이너 혹은 원하는 컨테이너의 로그만 골라 출력하도록 할 수 있다
001)  docker-compose logs --tail=1 iotd
002) image-of-the-day-iotd-2  | 2023-06-29 02:01:05.969  INFO 1 --- [           main] iotd.Application                         : Started Application in 2.23 seconds (JVM running for 2.627)
003) image-of-the-day-iotd-3  | 2023-06-29 02:01:05.905  INFO 1 --- [           main] iotd.Application                         : Started Application in 2.532 seconds (JVM running for 2.875)
004) image-of-the-day-iotd-1  | 2023-06-29 02:02:39.699  INFO 1 --- [p-nio-80-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 4 ms
  1. 001: --taiL=1 파라미터는 각 iotd 컨테이너의 마지막 로그를 출력하라는 의미

도커 컴포즈 부 명령어

docker-compose up/down
docker-compose start/stop

주의

  • 도커 엔진 자체는 컨테이너를 실행할 뿐, 여러 컨테이너가 하나의 애플리케이션으로 동작하는지 여부는 알지 못한다.
  • 이를 아는 것은 YAML로 적힌 컴포즈 파일을 읽어 애플리케이션의 구조를 이해한 컴포즈뿐
  • 그러므로 컴포즈를 사용해 애플리케이션을 관리하려면 컴포즈 파일을 작성하고 이 파일을 읽을 수 있게 해야 한다.
  • 컴포즈 파일을 수정하거나 도커 명령행으로 직접 애플리케이션을 수정하면, 애플리케이션이 컴포즈 파일에 기술된 구조와 불일치하게 만들 수도 있다.
  • 이 상태에서 도커 컴포즈로 다시 애플리케이션을 관리하려 하면 비정상적인 동작을 보일 수 있다.
  • 컴포즈 파일 수정 없이 iotd 서비스를 컨테이너 세 개로 스케일링했던 경우가 바로 여기에 해당한다.
  • 이 상태에서 컴포즈로 애플리케이션을 재시작하면 iotd 서비스는 다시 한 개의 컨테이너만으로 동작한다.

links

social