[Docker] 컨테이너 시간대 설정하기

서로 다른 시간대를 가진 Docker 컨테이너의 시간대를 일원화 해봅니다

[Docker] 컨테이너 시간대 설정하기

Photo by NASA on Unsplash

대부분은 UTC, 그러나 꼭 그렇진 않다

Docker를 통해 컨테이너를 실행시킨 후 docker logs 명령어를 통해 로그를 확인해 보면, 대부분의 컨테이너의 시간대는 UTC(협정 세계시)로 설정되어 있다.

정확히는 UTC+0이다

이는 전세계의 개발자들은 다양한 시간대에서 개발하기 때문에 UTC를 쓰는게 당연하기 떄문이다. 그러나 어떤 컨테이너는 기본값이 해당 개발자가 거주하는 국가의 시간대로 잡혀있기도 하기 떄문에 컨테이너의 시간대를 일원화 하는 것이 더 편하게 로그를 볼 수 있다.

컨테이너의 시간대를 바꿔보자

컨테이너의 시간대를 바꾸기 위한 방법으로는 2가지가 있다.

  • /etc/localtime 마운트
  • TZ 변수 수정

그러나 컨테이너의 Base Image에 따라 둘 중 하나의 방법이 작동하지 않는 경우가 있어서 필자는 두 방법을 한꺼번에 사용한다. 그리고 이 중 /etc/localtime 마운트 방법의 경우 호스트의 시간대를 확인 및 변경해야 한다.

호스트의 시간대 확인하기

timedatactl 명령어를 사용해서 시간대를 먼저 확인하자.

ubuntu@blog:~$ timedatectl
               Local time: Thu 2022-01-06 16:31:05 KST
           Universal time: Thu 2022-01-06 07:31:05 UTC
                 RTC time: Thu 2022-01-06 07:31:05
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

이렇게 Local time에 KST가 나오면 정상적으로 설정된 것이나 보통 리눅스 인스턴스를 처음 실행시키면 Local time에도 UTC가 나온다. 이는 호스트의 시간대가 UTC로 설정된 것이므로 시간대를 바꿔주어야 한다.

호스트 시간대 변경

sudo timedatectl set-timezone Asia/Seoul

간단하게 위 명령어를 실행시키면 Local time이 KST로 설정된다.

시간대 설정과 함께 컨테이너 실행

컨테이너의 시간대를 설정하기 위해서는 컨테이너를 실행할 때 바인딩 하나와 환경 변수 하나를 추가해주면 된다.

docker run ... -v /etc/localtime:/etc/localtime:ro -e TZ=Asia/Seoul ...

위와 같이 각 국가의 시간대를 저장하고 있는 /etc/localtime 파일을 ro 로 마운트하고 TZ=Asia/Seoul 로 설정하면 대한민국의 시간대인 UTC+9이 컨테이너의 시간대로 설정된다. 만약 모든 컨테이너를 UTC로 설정하고 싶다면 TZ=ETC/UTC 로 설정하면 된다.