본문 바로가기

개발/Infra

Docker-compose Watch Tower 적용

개요


현재 프로젝트의 배포 환경에서는 docker-compose를 이용해 backend docker image와 frontend docker image가 한번에 배포되고 있습니다.

 

이 때문에, frontend 개발자가 코드 변경 사항을 실 서버에 배포하려면 직접 배포 프로세스를 모두 익히거나, 배포 담당자에게 따로 부탁을 해야했습니다. 

 

이러한 비 효율적인 방법을 개선하기 위해, frontend 개발자가 github에 코드를 push 했을 때 자동으로 실 서버에 배포되는 환경을 구현했습니다.

 

 

 

watchtower 란


Docker Watchtower는 도커 컨테이너를 자동으로 업데이트해주는 도구입니다.

 

Watchtower는 실행 중인 도커 컨테이너의 이미지를 주기적으로 확인하고, 새로운 버전의 이미지가 Docker Registry에 업로드되면 해당 컨테이너를 중단하고 새 이미지를 적용한 뒤 컨테이너를 다시 시작합니다.

 

이를 통해 사용자는 일일이 수동으로 컨테이너를 업데이트할 필요 없이, 최신 버전의 애플리케이션 이미지를 자동으로 적용할 수 있습니다.

 

 

 

watchtower 적용


사용 방법은 간단합니다.

 

아래와 같이 docker-compose 파일에 watchtower 관련 정보를 설정해주면 됩니다.

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: always
    environment:
      - REPO_USER=[도커허브 ID]
      - REPO_PASS=[도커허브 엑세스 토큰]
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --cleanup --interval 120
    networks:
      - dev-icon

 

 

이 때, command 옵션이 중요합니다.

 

--cleanup 속성은 Watchtower가 컨테이너를 업데이트할 때, 더 이상 사용하지 않는 오래된 이미지들을 자동으로 삭제하는 옵션입니다.

 

도커 이미지는 디스크 용량을 상당히 많이 차지하기 때문에 이를 통해 디스크 공간을 절약하는 것이 좋습니다.

 

--interval 은 Watchtower가 이미지 업데이트를 폴링 기법을 이용해 체크하는 주기를 설정하는 옵션입니다.

 

저는 120초마다 이미지 업데이트를 확인하도록 설정했습니다.

 

 

 

배포 파이프라인


최종 배포 파이프라인은 아래와 같습니다.

 

1. main 브랜치 push

2. Github Action 작동하여 도커 허브에 이미지 업로드

3. EC2 서버에 컨테이너로 구동된 watchtower가 폴링 기법으로 2분마다 dockerHub 확인

4. 새로운 이미지가 업로드 됐을 경우 이미지를 pull 받고 docker container 재 실행