docker compose watch 명령어를 사용하여 서비스 자동 재빌드 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker compose watch 명령어를 활용하여 파일 변경에 따라 Docker 서비스를 자동으로 다시 빌드하고 업데이트하는 방법을 배우게 됩니다. 먼저, 기본 애플리케이션 파일, Dockerfile, 그리고 docker-compose.yaml 파일을 포함하는 빌드 컨텍스트 (build context) 를 갖춘 간단한 Docker Compose 프로젝트를 설정하는 것으로 시작합니다.

프로젝트 설정을 완료한 후, 파일 수정을 모니터링하고 자동 재빌드를 트리거하는 docker compose watch의 핵심 기능을 살펴볼 것입니다. 또한 초기 서비스 시작 없이 변경 사항을 감시하기 위한 --no-up 옵션과 빌드 출력을 억제하여 감시 동작을 더 깔끔하게 관찰할 수 있는 --quiet 옵션도 검토할 것입니다.

빌드 컨텍스트를 갖춘 간단한 Docker Compose 프로젝트 준비

이 단계에서는 빌드 컨텍스트를 포함하는 간단한 Docker Compose 프로젝트를 준비합니다. 빌드 컨텍스트는 Docker 이미지를 빌드하기 위해 Docker 데몬 (daemon) 으로 전송되는 지정된 위치 (PATH 또는 URL) 의 파일 집합입니다. Dockerfile 과 필요한 모든 파일 (애플리케이션 코드 등) 이 빌드 컨텍스트 내에 있어야 하므로 이는 중요합니다.

먼저, 프로젝트를 위한 디렉토리를 생성해 보겠습니다. 이름을 my-watch-app으로 지정합니다.

mkdir ~/project/my-watch-app
cd ~/project/my-watch-app

이제 간단한 애플리케이션 파일을 생성해야 합니다. 메시지를 출력하는 기본적인 Python 스크립트를 사용합니다.

nano app.py

app.py에 다음 내용을 추가합니다.

print("Hello from the Docker container!")

파일을 저장하고 닫습니다 (Ctrl+X, Y, Enter).

다음으로, 애플리케이션용 이미지를 빌드할 Dockerfile 을 생성해야 합니다. Dockerfile 은 Python 스크립트를 이미지로 복사한 다음 실행합니다.

nano Dockerfile

Dockerfile 에 다음 내용을 추가합니다.

FROM python:3.9-slim

WORKDIR /app

COPY app.py .

CMD ["python", "app.py"]

이 Dockerfile 은 슬림 (slim) Python 3.9 이미지를 기본 이미지로 사용하고, 작업 디렉토리를 /app으로 설정하고, app.py/app 디렉토리로 복사하고, 마지막으로 컨테이너가 시작될 때 Python 스크립트를 실행하는 명령을 설정합니다.

마지막으로, 서비스를 정의하기 위해 docker-compose.yaml 파일을 생성해야 합니다. 이 파일은 Docker Compose 에게 애플리케이션을 빌드하고 실행하는 방법을 알려줍니다.

nano docker-compose.yaml

docker-compose.yaml에 다음 내용을 추가합니다.

version: "3.8"

services:
  myapp:
    build: .
    volumes:
      - .:/app

docker-compose.yaml 파일은 myapp이라는 서비스를 정의합니다. build: . 지시는 Docker Compose 에게 현재 디렉토리 (빌드 컨텍스트) 의 Dockerfile 을 사용하여 이미지를 빌드하도록 지시합니다. volumes: - .:/app 라인은 호스트 머신의 현재 디렉토리 (.) 를 컨테이너 내부의 /app 디렉토리에 마운트합니다. 이는 호스트의 변경 사항이 컨테이너에 반영되도록 하므로 docker compose watch에 매우 중요합니다.

이제 Docker Compose 를 사용하여 서비스를 빌드하고 실행하여 모든 것이 올바르게 설정되었는지 확인해 보겠습니다. Docker Compose 가 미리 설치되어 있지 않으므로 먼저 설치해야 합니다.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

이제 docker-compose를 사용할 수 있습니다.

docker-compose up --build

이미지가 빌드되고 컨테이너가 실행되어 "Hello from the Docker container!"를 출력하는 것을 볼 수 있습니다. Ctrl+C를 눌러 컨테이너를 중지합니다.

docker compose watch 를 사용하여 파일 변경 감시 및 재빌드

이 단계에서는 docker compose watch 명령어를 사용하여 애플리케이션 코드에 변경 사항이 있을 때 서비스를 자동으로 다시 빌드하고 다시 시작합니다. 이는 개발 워크플로우 (workflow) 를 위한 강력한 기능으로, 빠른 반복을 가능하게 합니다.

docker compose watch 명령어는 빌드 컨텍스트 (build context) 의 파일을 모니터링하고, 변경 사항이 감지되면 자동으로 이미지를 다시 빌드하고 서비스를 다시 시작할 수 있습니다.

~/project/my-watch-app 디렉토리에 있는지 확인하십시오.

cd ~/project/my-watch-app

이제 docker compose watch 명령어를 실행합니다.

docker-compose watch

Docker Compose 가 서비스를 시작하고 파일 변경을 감시하고 있음을 나타내는 출력을 볼 수 있습니다. 초기 출력은 docker-compose up을 실행하는 것과 유사합니다.

docker compose watch가 터미널에서 실행되는 동안, 다른 터미널 또는 탭을 엽니다. 새 터미널에서 프로젝트 디렉토리로 이동합니다.

cd ~/project/my-watch-app

이제 app.py 파일을 수정해 보겠습니다.

nano app.py

내용을 다음과 같이 변경합니다.

print("Hello again from the updated Docker container!")

파일을 저장하고 닫습니다 (Ctrl+X, Y, Enter).

docker compose watch가 실행 중인 터미널로 돌아갑니다. 변경 사항이 감지되었고, 이미지가 다시 빌드되고, 컨테이너가 다시 시작되고 있음을 나타내는 출력을 볼 수 있습니다. 다시 시작 후, 새로운 메시지 "Hello again from the updated Docker container!"가 출력됩니다.

이는 docker compose watch가 코드 변경 시 빌드 및 재시작 프로세스를 자동으로 처리하는 방법을 보여줍니다.

docker compose watch를 실행하는 터미널에서 Ctrl+C를 눌러 프로세스를 중지합니다.

--no-up 옵션을 사용하여 초기 빌드 없이 watch 탐색

이 단계에서는 docker compose watch와 함께 --no-up 옵션을 탐색합니다. 기본적으로 docker compose watch는 파일 변경을 감시하기 전에 docker-compose.yaml 파일에 정의된 서비스를 빌드하고 시작합니다. --no-up 옵션은 이 초기 빌드 및 시작을 방지합니다. 이는 서비스를 즉시 시작하지 않고 변경 사항을 감시하려는 경우, 예를 들어 나중에 수동으로 시작할 계획이거나 이미 실행 중인 경우 유용합니다.

~/project/my-watch-app 디렉토리에 있는지 확인하십시오.

cd ~/project/my-watch-app

이제 --no-up 옵션과 함께 docker compose watch 명령어를 실행합니다.

docker-compose watch --no-up

출력이 이전 단계와 다르다는 것을 알 수 있습니다. Docker Compose 는 파일 변경을 감시하기 시작하지만, 초기에는 이미지를 빌드하거나 컨테이너를 시작하지 않습니다. 출력은 지정된 경로를 감시하고 있음을 나타냅니다.

docker compose watch --no-up이 터미널에서 실행되는 동안, 다른 터미널 또는 탭을 엽니다. 새 터미널에서 프로젝트 디렉토리로 이동합니다.

cd ~/project/my-watch-app

이제 app.py 파일을 다시 수정해 보겠습니다.

nano app.py

내용을 다음과 같이 변경합니다.

print("Watching without initial up!")

파일을 저장하고 닫습니다 (Ctrl+X, Y, Enter).

docker compose watch --no-up이 실행 중인 터미널로 돌아갑니다. 변경 사항이 감지되었고 이미지가 다시 빌드되고 있음을 나타내는 출력을 볼 수 있습니다. 그러나 --no-up 옵션을 사용했기 때문에 컨테이너는 자동으로 다시 시작되지 않습니다.

변경 사항의 효과를 확인하려면, 다시 빌드가 완료된 후 다른 터미널에서 서비스를 수동으로 시작해야 합니다.

docker-compose up

컨테이너에서 새로운 메시지 "Watching without initial up!"가 출력되는 것을 볼 수 있습니다.

docker compose watch --no-up을 실행하는 터미널에서 Ctrl+C를 눌러 감시 프로세스를 중지합니다. docker-compose up을 실행하는 터미널에서 Ctrl+C를 눌러 컨테이너를 중지합니다.

--quiet 옵션을 사용하여 빌드 출력 숨기기

이 단계에서는 docker compose watch와 함께 --quiet 옵션의 효과를 관찰합니다. 기본적으로, docker compose watch가 변경 사항을 감지하고 이미지를 다시 빌드할 때, 빌드 프로세스의 전체 출력을 표시합니다. --quiet 옵션은 이 상세한 빌드 출력을 억제하여, 감시 프로세스 및 서비스 재시작에 대한 필수 정보만 표시합니다. 이는 특히 빈번한 작은 변경 사항에 대해 출력을 더 깔끔하게 만들 수 있습니다.

~/project/my-watch-app 디렉토리에 있는지 확인하십시오.

cd ~/project/my-watch-app

이제 --quiet 옵션과 함께 docker compose watch 명령어를 실행합니다. 또한 --no-up 옵션을 다시 포함하여 초기 서비스 시작이 아닌 감시 및 재빌드 프로세스와 관련된 출력만 볼 수 있도록 합니다.

docker-compose watch --quiet --no-up

Docker Compose 가 파일 변경을 감시하고 있음을 나타내는 출력을 볼 수 있지만, 초기에는 상세한 빌드 출력은 없을 것입니다.

docker compose watch --quiet --no-up이 터미널에서 실행되는 동안, 다른 터미널 또는 탭을 엽니다. 새 터미널에서 프로젝트 디렉토리로 이동합니다.

cd ~/project/my-watch-app

이제 app.py 파일을 마지막으로 수정해 보겠습니다.

nano app.py

내용을 다음과 같이 변경합니다.

print("Quietly watching changes!")

파일을 저장하고 닫습니다 (Ctrl+X, Y, Enter).

docker compose watch --quiet --no-up이 실행 중인 터미널로 돌아갑니다. 변경 사항이 감지되었고 이미지가 다시 빌드되고 있음을 나타내는 출력을 볼 수 있지만, Docker 빌드 프로세스의 상세 단계는 숨겨집니다. 재빌드에 대한 간결한 메시지만 볼 수 있습니다.

이는 --quiet 옵션이 docker compose watch에 의해 트리거된 빌드 단계 동안 출력의 상세성을 줄이는 방법을 보여줍니다.

docker compose watch --quiet --no-up을 실행하는 터미널에서 Ctrl+C를 눌러 감시 프로세스를 중지합니다.

요약

이 랩에서는 로컬 파일에서 Docker 이미지를 빌드하는 데 필수적인 빌드 컨텍스트 (build context) 를 사용하여 간단한 Docker Compose 프로젝트를 준비하는 방법을 배웠습니다. 프로젝트 디렉토리, 기본 Python 애플리케이션 파일 (app.py), 애플리케이션용 이미지를 빌드하기 위한 Dockerfile, 그리고 서비스와 해당 빌드 컨텍스트를 정의하는 docker-compose.yaml 파일을 만들었습니다.

그런 다음, 빌드 컨텍스트 내에서 파일 변경 사항을 자동으로 모니터링하고 관련 서비스의 재빌드를 트리거할 수 있는 docker compose watch 명령어를 탐색했습니다. 이 자동 재빌드 프로세스를 관찰하기 위해 이 명령어를 사용하는 방법을 배웠으며, 초기 빌드 없이 감시하기 위한 --no-up 옵션과 빌드 출력을 억제하기 위한 --quiet 옵션을 탐색하여 개발을 위한 간소화된 워크플로우를 제공했습니다.