소프트웨어는 때때로 업데이트됩니다. 그 이유로 새로운 기능의 추가, 버그의 수정, 보안 위협에 대한 대응, 딱히 변한 것은 없으나 이 이미지는 잘 관리되고 있다는 표시 (…) 정도가 있겠네요. 아무튼, 소프트웨어는 업데이트가 필요합니다.

그럼 도커 이미지는 어떻게 업데이트될까요? 도커 이미지를 매우 잘 만든 경우, 컨테이너 내부에서 최신 버전을 찾아 자동으로 업데이트하는 스케줄러를 넣습니다. 사용자가 딱히 신경 쓰지 않아도 자연스럽게 최신 버전이 유지가 되죠. 하지만 이 방법은 그리 흔하지 않습니다.

도커 이미지 제작자가 실력이 없다거나 불친절하기 때문은 아닙니다. 가상화 기술의 발전으로 서비스 업데이트 방법에 대한 관점이 바뀌었거든요. 가상화 환경을 구성하기 위한 시간과 수고가 획기적으로 줄어들었으니, 업데이트를 추가로 설치하지 말고 업데이트가 완료된 서버를 새로 배포하는 것이 더 효과적이라는 생각이 들었거든요.

그래서 상당수의 도커 이미지는 이미지 자체를 재배포하여 업데이트합니다. 이렇게요.


한 달 전까지는 이렇게 했다

우선 Portainer의 Containers 탭에서 업데이트할 이미지와 관련된 컨테이너를 모두 제거합니다. 그리고 Images 탭에 가면 해당 이미지가 Unused로 표시되어 있는데요. 이걸 삭제합니다. 그리고 다시 컨테이너를 생성합니다. 컨테이너 생성 명령어가 생각이 안 날 수도 있지만, 저희는 Stacks에 관련 설정을 기록해 두었으니 괜찮습니다. 포테이너를 사용하길 정말 잘했어요!

… 원래 신문물을 접하고 나면 과거의 자신은 부끄럽고 어리석어 보이는 법이에요.

이미지를 자동으로 업데이트하는 방법

전 세계의 개발자들이 이걸 고민하지 않았을 리가 없습니다. 그 사람들은 원래 세 번 이상 반복하기 시작하면 뭔가를 만들기 시작합니다

그래서 인터넷을 찾아보니, 도커 이미지의 최신 버전을 자동으로 적용해 주는 방법을 Watchtower이라고 부르는 것 같아요. 감시탑이라는 의미가 잘 와닿네요. 지난번 Heimdall도 그렇고, 이름을 참 잘 짓네요.

도커 허브에는 크게 두 제작자의 워치타워 이미지가 유명한데, 저는 containrrr에서 배포한 이미지를 사용하기로 했어요.

Watchtower

Watchtower 로고
containrrr/watchtower 공식 홈페이지

이 이미지를 선택한 이유는 이렇습니다.

  • 서비스를 소개하는 별도의 홈페이지가 있었고,
  • 서비스 출시 당시 방법론과 함께 소개한 글도 있고,
  • 이 이미지가 비교적 최근에 업데이트되었고,
  • 무엇보다도 헤임달 설치 안내에서 이거 쓰라고 추천해 줬습니다. (…)

그런 이유로 이쪽이 관리가 잘되고 있는 원조가 아닐까 싶어 선택했어요.

사전 작업

없습니다. 없어요! 그래서 저는 지금 너무 행복합니다. 사실 이 부분을 검증하는 것이 은근히 번거롭거든요.

도커 컨테이너 생성

그래서 이 서비스는 바로 docker-compose 파일 내용을 포테이너의 Add Stack > Web editor 아래의 공간에 복사하여 붙여넣으면 됩니다. 공식 사이트의 Quick Start에 있는 내용을 도커 컴포즈로 만들고, 몇 가지 설정을 추가한 내용이에요.

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      TZ: Asia/Seoul
      WATCHTOWER_CLEANUP: 'true'
      WATCHTOWER_POLL_INTERVAL: 43200
    restart: unless-stopped

여기서 environment 부분이 옵션인데요. 적용된 옵션은 이런 의미에요.

  • TZ: Asia/Seoul - 컨테이너의 시간대를 서울 (KST) 로 설정합니다. 나중에 업데이트 이력을 로그에서 확인할 수 있는데, 시간대가 적용되지 않으면 헷갈릴 수 있으니까요.
  • WATCHTOWER_CLEANUP: ‘true’ - 이미지 업데이트 후 과거 버전을 삭제합니다. 일반적일 때 과거 버전으로 돌아갈 이유가 없으니, 나스 용량을 위해 지워주는 것이 좋겠죠?
  • WATCHTOWER_POLL_INTERVAL: 43200 - 업데이트를 확인할 주기입니다. 초 단위고요, 43,200은 12시간이에요. 기본값은 86,400 (24시간) 인데 옵션 설명을 위해 12시간으로 적용해봤어요. 사실 업데이트가 그렇게 즉각적으로 필요한 때는 없으니, 기본값을 사용해도 좋습니다.

이것 말고도 다양한 옵션이 있습니다. 여기에서 확인해보세요!

서비스 동작 확인 및 설정

이 이미지는 별도의 웹 UI가 없어요. 대신에 업데이트 기록이 로그로 남습니다. 포테이너에서 생성한 컨테이너를 클릭하여 상세 정보로 들어가면 Logs라는 메뉴가 있어요. 여기에서 업데이트 기록을 볼 수 있습니다.

물론 지금 누르면… 매우 높은 확률로 아무것도 없습니다. 당연하잖아 사용하는 이미지의 제작자가 업데이트를 해 주기를 기다리며 며칠 동안 기다려봅시다.

Watchtower 업데이트 기록

참고용으로 제 기록을 가져왔어요. 다른 이미지는 없고 Netdata 이미지만 매일 업데이트한 기록이 있네요. 이 이미지가 Daily build (매일 업데이트하는 버전) 이기 때문인 것 같아요.


그리고 남은 이야기

주의할 점이 있습니다. 도커 업데이트는 컨테이너를 삭제하고 새로운 이미지를 받아 컨테이너를 다시 만들기 때문에, 이 과정에서 볼륨이나 환경 변수, 기타 설정으로 고정되지 않은 내용은 유실될 수 있어요. 하지만 대부분의 도커 이미지가 컨테이너 재생성 시 유지되어야 하는 내용을 따로 관리하게 제작되고 있으니 대부분은 크게 신경 쓰지 않아도 됩니다.

그리고 갑자기 궁금해졌는데요. 워치타워는 워치타워 자신의 업데이트를 할 수 있을까요?

댓글남기기