Linode 서버에서 실행중인도 커가 있습니다. 때때로 나는 시간이 도커에게 적절하지 않다는 것을 알았습니다. 현재 모든 도커의 실행 스크립트를 다음 코드 줄을 포함하도록 변경했습니다.
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
그러나 내가 이상적으로하고 싶은 것은도 커가 호스트와 시간을 동기화해야한다는 것입니다. 이를 수행하는 방법이 있습니까?
Linode 서버에서 실행중인도 커가 있습니다. 때때로 나는 시간이 도커에게 적절하지 않다는 것을 알았습니다. 현재 모든 도커의 실행 스크립트를 다음 코드 줄을 포함하도록 변경했습니다.
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
그러나 내가 이상적으로하고 싶은 것은도 커가 호스트와 시간을 동기화해야한다는 것입니다. 이를 수행하는 방법이 있습니까?
docker
명령을 실행중인 컴퓨터와 동일하지 않은 경우 시간차가 발생할 수 있으며 볼륨 마운트와 같은 작업이 예상대로 작동하지 않을 수 있습니다. 이것은 예를 들어 DigitalOcean에서 원격 도커 머신을 설정할 때도 발생합니다.
답변:
이 답변의 출처는 다음의 답변에 대한 주석입니다. Docker 컨테이너가 호스트 시스템과 시간을 자동 동기화합니까?
답을 살펴본 결과 도커 컨테이너에서 클럭 드리프트가 발생할 방법이 없다는 것을 깨달았습니다. Docker는 호스트와 동일한 시계를 사용하며 Docker는이를 변경할 수 없습니다. ntpdate
도커 내부에서 수행하는 것이 작동하지 않음을 의미합니다.
올바른 방법은 다음을 사용하여 호스트 시간을 업데이트하는 것입니다. ntpdate
시간대 동기화에 관한 한 -v /etc/localtime:/etc/localtime:ro
작동합니다.
boot2docker restart
또는 자체 VM을 실행하는 경우 ntpdate
거기에서 할 수 있습니다.
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)"
date
명령은 MMDDhhmm[[CC]YY][.ss]
날짜를 설정 하는 형식 만 허용 하므로 초를 추가하려면 다음과 같이 문자열 끝에 입력해야합니다 +%m%d%H%M%Y.%S
..
이것이 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
은 컨테이너를 처음 실행할 때 사용하는 것입니다. 이 링크 에서 찾았습니다 .
도움이 되었기를 바랍니다.
그러면 도커 서버의 시간이 재설정됩니다.
docker run --rm --privileged alpine hwclock -s
다음에 컨테이너를 만들 때 시계가 정확해야합니다.
출처 : https://github.com/docker/for-mac/issues/2076#issuecomment-353749995
docker-machine을 사용하는 경우 가상 머신이 드리프트 될 수 있습니다. 다시 시작하지 않고 가상 머신의 시계를 업데이트하려면 다음을 실행하십시오.
docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org
이렇게하면 NTP를 사용하는 가상 머신의 시계가 업데이트되고 시작된 모든 컨테이너의 날짜가 정확 해집니다.
-1 시간 4 분의 시간 오프셋에 직면했습니다.
Docker 자체를 다시 시작하면 문제가 해결되었습니다.
일반적으로 시간대를 설정하려면 :
컨테이너에 ssh :
docker exec -it my_website_name bash
운영 dpkg-reconfigure tzdata
date
docker-compose exec <servicename> bundle exec dpkg-reconfigure tzdata
이 응답에서 알 수 있듯이 Docker Machine을 사용하는 경우 시간 드리프트가 발생할 수 있습니다. https://stackoverflow.com/a/26454059/105562 VirtualBox로 인해 에서 .
빠르고 쉬운 해결 방법은 VM을 다시 시작하는 것입니다.
docker-machine restart default
작성 파일에 다음이 있습니다.
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
그런 다음 올바른 타임 스탬프로 설정된 replication_log로 Gerrit docker에서 모두 좋습니다.
macOS의 docker의 경우 docker-time-sync-agent를 사용할 수 있습니다 . 그것은 나를 위해 작동합니다.
창문 용 도커를 사용하여
MobyLinuxVM > Settings > Integration Services > Time synchronization
Hyper-V 관리자에서 작동했습니다.
컴퓨터가 잠자기 상태가되면 도커 컨테이너가 동기화되지 않는 것을 발견했습니다.
https://forums.docker.com/t/time-in-container-is-out-of-sync/16566
여기에 대한 게시물을 작성했습니다. 인증서는 Docker에서 항상 5 일 전에 만료됩니다.
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"]
나를 위해 Docker Desktop을 다시 시작해도 도움이되지 않았습니다. Win10을 종료하고 다시 시작하면 도움이되었습니다.
해결책은 매우 간단합니다. 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")"
Windows 기능에서 Hyper-V를 활성화하면 문제가 해결되었습니다. Windows 기능