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
- 001:
--taiL=1
파라미터는 각 iotd 컨테이너의 마지막 로그를 출력하라는 의미
도커 컴포즈 부 명령어
docker-compose up/down
docker-compose start/stop
주의
- 도커 엔진 자체는 컨테이너를 실행할 뿐, 여러 컨테이너가 하나의 애플리케이션으로 동작하는지 여부는 알지 못한다.
- 이를 아는 것은 YAML로 적힌 컴포즈 파일을 읽어 애플리케이션의 구조를 이해한 컴포즈뿐
- 그러므로 컴포즈를 사용해 애플리케이션을 관리하려면 컴포즈 파일을 작성하고 이 파일을 읽을 수 있게 해야 한다.
- 컴포즈 파일을 수정하거나 도커 명령행으로 직접 애플리케이션을 수정하면, 애플리케이션이 컴포즈 파일에 기술된 구조와 불일치하게 만들 수도 있다.
- 이 상태에서 도커 컴포즈로 다시 애플리케이션을 관리하려 하면 비정상적인 동작을 보일 수 있다.
- 컴포즈 파일 수정 없이 iotd 서비스를 컨테이너 세 개로 스케일링했던 경우가 바로 여기에 해당한다.
- 이 상태에서 컴포즈로 애플리케이션을 재시작하면 iotd 서비스는 다시 한 개의 컨테이너만으로 동작한다.