Profile picture

[Docker] 도커 이미지 자동 업데이트 도구 - Watch Tower

JaehyoJJAng2023년 05월 01일

개요

어떤 프로그램이나 서비스를 사용하다보면 시간이 점점 지나감에 따라 취약점이 발생하고 기능 개선또한 이루어지게 된다.

이럴 경우 해당 프로그램에 대한 업데이트가 당연히 나올 수 밖에 없게 되는데, 일반적인 SW의 경우 관리자 또는 사용자가 수동으로 업데이트 해주면 되지만 Docker image의 경우 이미지를 새로 받고 컨테이너 실행 명령어를 찾아서 실행하는(이 문제는 docker-compose로 해결 가능) 과정이 매우 번거롭다.

이러한 번거로움을 해결해주는 툴이 바로 Watch Tower이다.


Watch Tower


Watch Tower는 호스트에서 실행중인 docker container를 모니터링하고 최신 이미지가 있으면 기존 컨테이너의 설정 값을 그대로 신규 이미지를 통해 최신 컨테이너로 업데이트 해준다.

수동으로 강제 업데이트(컨테이너 중지 - 이미지 새로 받기 - 컨테이너 실행)를 하지 않게 할 수 있고 최신 이미지 업데이트를 제외할 컨테이너를 포함할 수도 있다!

설치 환경

  • Ubuntu 18.04 LTS
  • Docker
  • Docker-Compose

공식 가이드에 docker 및 docker-compose 가이드가 모두 있지만 개인적으로 설정 값을 저장할 수 있는 docker-compose를 사용하도록 하겠다.


사전 작업

watchtower의 설정 값을 보관해줄 디렉토리 생성

$ mkdir -p ./data/watchtower/config

컨테이너 생성하기

version: "3"

services:
  watchtower:
    image: containrrr/watchtower
    restart: always
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    environment:
      - TZ="Asia/Seoul"
      - WATCHTOWER_POLL_INTERVAL=86400
      # - WATCHTOWER_CLEANUP=false
    container_name: watchtower

  • WATCHTOWER_CLEANUP은 업데이트 성공 후 기존 이미지 삭제할 것인지에 대한 것인데 false로 두는 것이 좋을 듯 하다.
  • WATCHTOWER_POLL_INTERVAL은 이미지 체크 주기이며, 86400초는 24시간을 의미함

YAML 작성이 완료되었다면 컨테이너를 생성해보자

$ docker-compose up -d --build

서비스 동작 확인

watchtower의 경우 gui를 지원하지 않기 때문에 CLI에서 동작을 확인해야 한다.


docker ps 명령어로 컨테이너가 정상적으로 띄워졌는지 확인하자

$ docker ps --format {% raw %} "{{.ID}}\t{{.Names}}\t{{.Status}}" {% endraw %}
db065922ef57	watchtower	Up 2 minutes

docker-compose logs <Container Name> 명령어로 watchtower 컨테이너의 로그를 확인하도록 하자

$ docker-compose logs watchtower
watchtower  | time="2023-08-28T02:44:53Z" level=info msg="Watchtower 1.5.3"
watchtower  | time="2023-08-28T02:44:53Z" level=info msg="Using no notifications"
watchtower  | time="2023-08-28T02:44:53Z" level=info msg="Checking all containers (except explicitly disabled with label)"
watchtower  | time="2023-08-28T02:44:53Z" level=info msg="Scheduling first run: 2023-08-29 02:44:53 +0000 UTC"
watchtower  | time="2023-08-28T02:44:53Z" level=info msg="Note that the first check will be performed in 23 hours, 59 minutes, 59 seconds"

업데이트 제외

특정 컨테이너에 대해서 이미지 업데이트를 제외시키고 싶다면 해당 컨테이너에 라벨을 붙여주면 된다.

예를 들어, web라는 이름을 가진 웹서버용 컨테이너에 대해서는 이미지가 업데이트 되지 않기를 바란다면 해당 컨테이너에 라벨을 아래와 같이 붙여주면 된다.


{% include codeHeader.html name="Command: docker run" %}

docker run -d -it --name web \
--label com.centurylinklabs.watchtower.enable="false"
...

{% include codeHeader.html name="docker-compose.yaml" %}

services:
  web:
    image: web:latest
    labels:
      com.centurylinklabs.watchtower.enable="false"
    ...

Loading script...