도커의 시간이 호스트의 시간과 동기화되는지 확인하는 방법은 무엇입니까?


84

Linode 서버에서 실행중인도 커가 있습니다. 때때로 나는 시간이 도커에게 적절하지 않다는 것을 알았습니다. 현재 모든 도커의 실행 스크립트를 다음 코드 줄을 포함하도록 변경했습니다.

yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org

그러나 내가 이상적으로하고 싶은 것은도 커가 호스트와 시간을 동기화해야한다는 것입니다. 이를 수행하는 방법이 있습니까?



컨테이너는 호스트와 같은 시간을 사용합니다. Docker 핵심 개발자 중 한 사람의 답변 으로이 Q & A 를 참조하세요 .
Ben Whaley 2014

이것은 분명한 중복 질문이지만 다른 질문에 대한 대답은 내가 실제로 신경 쓰지 않는 시간대에 대해 이야기하는 것입니다. 답변에 대한 주석은 도커와 호스트가 동일한 클럭을 사용하기 때문에 클럭 드리프트가 발생하지 않음을 분명히합니다. 지적 해 주셔서 감사합니다.
란 지트 Ramachandra

9
경고 : 호스트 가 무엇인지에 대해 약간의 혼동 이 있습니다. Linux 하위 시스템이있는 Linux 및 Windows 10+ 이외의 운영 체제에서 Docker 시스템 (호스트)은 실제로 가상 시스템입니다. 도커 호스트가 docker명령을 실행중인 컴퓨터와 동일하지 않은 경우 시간차가 발생할 수 있으며 볼륨 마운트와 같은 작업이 예상대로 작동하지 않을 수 있습니다. 이것은 예를 들어 DigitalOcean에서 원격 도커 머신을 설정할 때도 발생합니다.
Codebling

답변:


84

이 답변의 출처는 다음의 답변에 대한 주석입니다. Docker 컨테이너가 호스트 시스템과 시간을 자동 동기화합니까?

답을 살펴본 결과 도커 컨테이너에서 클럭 드리프트가 발생할 방법이 없다는 것을 깨달았습니다. Docker는 호스트와 동일한 시계를 사용하며 Docker는이를 변경할 수 없습니다. ntpdate도커 내부에서 수행하는 것이 작동하지 않음을 의미합니다.

올바른 방법은 다음을 사용하여 호스트 시간을 업데이트하는 것입니다. ntpdate

시간대 동기화에 관한 한 -v /etc/localtime:/etc/localtime:ro작동합니다.


4
그게 어떻게 될 수 있는지 말해 봐요? 문서가 시스템과 동일한 시계를 사용하는 경우. 도커 시계가 호스트와 어떻게 다를 수 있습니까? 클럭 드리프트가 발생하면 클럭 드리프트를 수정해야하는 도커의 호스트 시스템에서 발생합니다. 내가 틀렸는 지 알고 싶습니다.
Ranjith Ramachandra 2014

10
boot2docker가있는 Mac에서 Docker를 사용할 때 boot2docker VM이 시간을 잃을 수 있습니다. Docker는 호스트와 동기화 상태를 유지하지만 호스트가 잘못된 시간을 제공합니다. VM을 재부팅하는 것이 가장 간단한 해결 방법입니다.
Nathaniel Waisbrot 2014

56
VM이 시간을 잃는 완전히 다른 문제입니다. 기술적으로 Docker는 VM 인 호스트와 여전히 동기화 상태입니다.
Ranjith Ramachandra 2014

3
@ISJ : boot2docker restart또는 자체 VM을 실행하는 경우 ntpdate거기에서 할 수 있습니다.
Nathaniel Waisbrot 2014

5
저는 Windows를 사용하고 있습니다. 호스트 머신 시간은 15:06, 컨테이너 시간은 18:41 ... wtf
willem

37

Docker 컨테이너의 볼륨으로 로컬 파일 (/ etc / timezone 및 / etc / localtime)을 추가 할 수 있습니다.

docker-compose.yml다음 줄로 업데이트하십시오 .

volumes:
    - "/etc/timezone:/etc/timezone:ro"
    - "/etc/localtime:/etc/localtime:ro"

이제 컨테이너 시간은 호스트와 동일합니다.


멋지고 깨끗한! 타이!
wopolow

35

boot2docker 를 사용 중이고 ntp docker VM 내에서 작동하지 않지만 (ntp 패킷을 전달하지 않는 프록시 뒤에 있음) 호스트가 시간 동기화 된 경우 호스트에서 다음을 실행할 수 있습니다.

docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"

이렇게하면 컴퓨터의 현재 시간 (UTC 시간대)을 문자열로 전송하여 date(다시 UTC 시간대로) 도커 VM 시간을 설정합니다 .

참고 : Windows에서는 bash 셸 (msys git에서) 내에서 다음을 사용합니다.

docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"

완전한! 그것은 정확히 내 문제였으며 docker-machine을 재부팅하지 않고도 즉시 해결합니다.
qwertzguy

1
초를 설정할 수 있습니까? % S를 추가하려고했지만 시간이 잘못되었습니다
Sakib

@Sakib,이 date명령은 MMDDhhmm[[CC]YY][.ss]날짜를 설정 하는 형식 만 허용 하므로 초를 추가하려면 다음과 같이 문자열 끝에 입력해야합니다 +%m%d%H%M%Y.%S..
gvlx

28

이것이 Fedora 20 호스트에서 저에게 효과적이었습니다. 다음을 사용하여 컨테이너를 실행했습니다.

docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash

처음에 /etc/localtime/usr/share/zoneinfo/Asia/Kolkata 인도 표준시와 의 소프트 링크였습니다 . date컨테이너 내부에서 실행 하면 호스트와 동일한 시간이 표시되었습니다. 셸을 종료하고 docker stop <container-id>.

다음으로이 파일을 제거 /usr/share/zoneinfo/Singapore하고 테스트 목적으로 링크했습니다 . 호스트 시간이 싱가포르 시간대로 설정되었습니다. 그리고 docker start <container-id>. 그런 다음 사용하여 다시 쉘에 액세스했습니다.nsenter 시간이 이제 싱가포르 시간대로 설정되었음을 알았습니다.

docker start <container-id>
docker inspect -f {{.State.Pid}} <container-id>
nsenter -m -u -i -n -p -t <PID> /bin/bash

따라서 여기서 핵심 -v /etc/localtime:/etc/localtime:ro은 컨테이너를 처음 실행할 때 사용하는 것입니다. 이 링크 에서 찾았습니다 .

도움이 되었기를 바랍니다.


이것은 CentOS Linux 릴리스 7.6.1810에서 저에게 효과적이었습니다
k4cy

26

그러면 도커 서버의 시간이 재설정됩니다.

docker run --rm --privileged alpine hwclock -s

다음에 컨테이너를 만들 때 시계가 정확해야합니다.

출처 : https://github.com/docker/for-mac/issues/2076#issuecomment-353749995


3
이것이 제가 찾던 비밀입니다! 며칠이 지났고 인증서는 심술 궂습니다. 감사합니다!
Josiah

2
감사합니다. 매력처럼 작동했습니다.
Ryan Nutt

docker-compose와 함께 사용하는 방법?
Surya Swanoff

1
수면 버그 이후 시간이 동기화되지 않는 Windows 용 Docker가 많이보고 된 것을 보았습니다.이 수정은 마법처럼 작동했습니다! 무엇을하고 있습니까?
StackG

11

docker-machine을 사용하는 경우 가상 머신이 드리프트 될 수 있습니다. 다시 시작하지 않고 가상 머신의 시계를 업데이트하려면 다음을 실행하십시오.

docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org

이렇게하면 NTP를 사용하는 가상 머신의 시계가 업데이트되고 시작된 모든 컨테이너의 날짜가 정확 해집니다.


명령이 작동하고 시간이 업데이트되었습니다. 그러나 시간이 다시 흐르기 시작했고 명령을 다시 실행해야했습니다. Docker 호스트 내에서 자동으로 동기화하는 방법은 무엇입니까?
chitti

10

-1 시간 4 분의 시간 오프셋에 직면했습니다.

Docker 자체를 다시 시작하면 문제가 해결되었습니다.

일반적으로 시간대를 설정하려면 :

  1. 컨테이너에 ssh : docker exec -it my_website_name bash

  2. 운영 dpkg-reconfigure tzdata

  3. 운영 date

이것은 docker-compose를 사용하는 macOS High Sierra 10.13.6 (17G65)의 콘솔에서 저를 위해 일했습니다 .docker-compose exec <servicename> bundle exec dpkg-reconfigure tzdata
Zack Morris

9

이 응답에서 알 수 있듯이 Docker Machine을 사용하는 경우 시간 드리프트가 발생할 수 있습니다. https://stackoverflow.com/a/26454059/105562 VirtualBox로 인해 에서 .

빠르고 쉬운 해결 방법은 VM을 다시 시작하는 것입니다.

docker-machine restart default

1
시간이 괜찮다고 그 이후에는 기본 기계 없었다 고정 표시기 창에, 나는, 고정 표시기 창 함께 제공되는 고정 표시기의 설정 프로그램에서 리셋 탭을 통해 데몬을 다시 시작
wutzebaer

9

작성 파일에 다음이 있습니다.

volumes:
  - "/etc/timezone:/etc/timezone:ro"
  - "/etc/localtime:/etc/localtime:ro"

그런 다음 올바른 타임 스탬프로 설정된 replication_log로 Gerrit docker에서 모두 좋습니다.


CentOS (7) 호스트에 Debian (9) 컨테이너가 있고 localtime 마운트는 작동하지만 시간대는 할 수 없습니다. 호스트에서는 컨테이너에있는 동안 파일의 디렉터리이기 때문입니다.
tometchy 2012-06-12


5

창문 용 도커를 사용하여

MobyLinuxVM > Settings > Integration Services > Time synchronization 

Hyper-V 관리자에서 작동했습니다.


하지만 한 가지 문제가 있습니다. 호스트를 다시 시작하면 설정이 해제 된 것 같습니다
user725408

예 -이 (참조 빌드 일부 창에 일어날 것으로 보인다 github.com/docker/for-win/issues/409 )
기독교 OPITZ

1
제 경우에는 해당 확인란이 이미 선택되어 있지만 컨테이너 시간은 호스트 시간보다 3 일 늦습니다.
Scott Hutchinson

5

도커 작성 사용법 :

추가 /etc/localtime:/etc/localtime:ro받는 사람 volumes속성 :

version: '3'

services:
  a-service:
      image: service-name
      container_name: container-name
      volumes:
        - /etc/localtime:/etc/localtime:ro

3

이것이 모든 호스트에 대한 일반적인 솔루션은 아니지만 누군가 유용하다고 생각할 수 있습니다. 귀하의 거주지 (저를위한 영국)를 알고 있다면 여기 에서 tianon's답변을 보십시오 .

FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London

이것이 내가 Dockerfile ^에 추가 한 것이며 시간대 문제가 수정되었습니다.



1

Docker 사용

다음은 다단계 빌드에서 go 앱용 도커 이미지를 빌드하는 완전한 예제입니다. 이미지에 시간대를 포함하는 방법을 보여줍니다.

FROM golang:latest as builder

WORKDIR /app

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main

### Certs
FROM alpine:latest as locals

RUN apk --update --no-cache add ca-certificates

RUN apk add --no-cache tzdata

### App
FROM scratch 

WORKDIR /root/

COPY --from=locals /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

COPY --from=builder app/main .

COPY --from=builder app/templates ./templates

COPY --from=locals /usr/share/zoneinfo /usr/share/zoneinfo

ENV TZ=Asia/Singapore

EXPOSE 8000

CMD ["./main"]

1

나를 위해 Docker Desktop을 다시 시작해도 도움이되지 않았습니다. Win10을 종료하고 다시 시작하면 도움이되었습니다.


1

Windows 사용자 :

해결책은 매우 간단합니다. powershell 프롬프트를 열고 다음을 입력하십시오.

docker run --privileged --rm alpine date -s "$(Get-Date ([datetime]::UtcNow) -UFormat "+%Y-%m-%d %H:%M:%S")"

작동하는지 확인하려면 다음 명령을 실행하십시오.

docker run --rm -it alpine date


내 솔루션은 내가 도커 포럼 스레드에서 찾은 것에서 영감을 얻었습니다. 어쨌든, 내 컴퓨터를 다시 시작하는 것을 제외하고는 도커 데스크탑에서 나를 위해 일한 유일한 솔루션이었습니다 (또한 작동합니다). 다음은 원래 스레드에 대한 링크입니다. https://forums.docker.com/t/syncing-clock-with-host/10432/23

스레드 답변과 광산의 차이점은 광산이 시간을 UTC 시간으로 변환한다는 것입니다. 이는 예를 들어 AWS에 필요합니다. 그렇지 않으면 포럼의 원래 답변은 다음과 같습니다.

docker run --privileged --rm alpine date -s "$(date -u "+%Y-%m-%d %H:%M:%S")"


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.