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

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

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

> 정확히는 UTC+0이다

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

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

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

- `/etc/localtime` 마운트
- `TZ` 변수 수정

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

## 호스트의 시간대 확인하기

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

```plaintext
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로 설정된 것이므로 시간대를 바꿔주어야 한다.

## 호스트 시간대 변경

```bash
sudo timedatectl set-timezone Asia/Seoul
```

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

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

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

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

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