如何确保docker的时间与主机的时间同步?

时间:2014-07-03 10:46:05

标签: docker ntp

我在Linode服务器上运行了docker。有时,我看到码头工人的时间不对。目前,我已经更改了每个docker中的运行脚本,以包含以下代码行。

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

然而,我理想的做法是,docker应该与主机同步时间。有没有办法做到这一点?

20 个答案:

答案 0 :(得分:49)

此答案的来源是对答案的评论:Will docker container auto sync time with the host machine?

在看了答案之后,我意识到Docker容器上不会发生时钟漂移。 Docker使用与主机相同的时钟,而docker无法更改它。这意味着在docker中执行ntpdate不起作用。

正确的做法是使用ntpdate

更新主机时间

就同步时区而言,-v /etc/localtime:/etc/localtime:ro有效。

答案 1 :(得分:29)

如果你正在使用 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 shell(来自msys git)中,使用:

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

答案 2 :(得分:19)

这对我使用Fedora 20主机起了作用。我使用:

运行了一个容器
docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash

最初/etc/localtime是指向印度标准时间/usr/share/zoneinfo/Asia/Kolkata的软链接。在容器内执行date显示我与主机上的时间相同。我退出了shell并使用docker stop <container-id>停止了容器。

接下来,我删除了此文件并将其链接到/usr/share/zoneinfo/Singapore以进行测试。主持人时间设定为新加坡时区。然后docker start <container-id>。然后使用nsenter再次访问它的shell,发现时间现在设置为新加坡时区。

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。我在this link找到了它。

希望它有所帮助。

答案 3 :(得分:12)

您可以在docker-container中将本地文件(/ etc / timezone和/ etc / localtime)添加为卷。

使用以下行更新docker-compose.yml

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

现在,容器时间与主机上的相同

答案 4 :(得分:9)

如果您正在使用泊坞机,虚拟机可能会漂移。要在不重新启动运行的情况下更新虚拟机上的时钟,请执行以下操作:

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

这将使用NTP更新虚拟机上的时钟,然后启动的所有容器将具有正确的日期。

答案 5 :(得分:6)

我面临时间偏移-1小时和4分钟

重启Docker本身为我解决了这个问题。

一般设置时区:

  1. ssh到你的容器中: docker exec -it my_website_name bash

  2. 运行dpkg-reconfigure tzdata

  3. 运行date

答案 6 :(得分:5)

如果您正在使用Docker Machine,那么可能会出现时间漂移,因为这个响应表明:https://stackoverflow.com/a/26454059/105562,归因于VirtualBox。

快速简便的解决方法是重新启动VM:

docker-machine restart default

答案 7 :(得分:5)

对于macOS上的docker,您可以使用docker-time-sync-agent。它对我有用。

答案 8 :(得分:3)

使用docker for windows我必须打勾

MobyLinuxVM > Settings > Integration Services > Time synchronization 
在Hyper-V管理器中

并且它可以工作

答案 9 :(得分:3)

我在撰写文件中有以下内容

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

然后Gerrit docker中的所有好东西,其replication_log设置为正确的时间戳。 :-D

答案 10 :(得分:1)

我在 Windows 上看到了这个,从 docker-compose 启动 Prometheus。我有 15 小时的时间漂移​​。

如果您在 WSL 上运行 Docker 桌面,您可以尝试从 powershell 提示符运行 wsl --shutdown。 Docker Desktop 应该会重新启动,您可以再次尝试运行您的 docker 容器。

为我工作,我不必重新启动。

答案 11 :(得分:1)

对我来说,重新启动Docker Desktop并没有帮助。关闭Win10并重新启动它,确实有帮助。

答案 12 :(得分:1)

Docker使用情况

这是一个完整的示例,它以多阶段构建为go应用构建docker镜像。它显示了如何在图像中包括时区。

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"]

答案 13 :(得分:1)

我发现,如果您的计算机进入睡眠状态,则Docker容器将不同步。

https://forums.docker.com/t/time-in-container-is-out-of-sync/16566

我在这里发表了一篇关于它的文章 Certificate always expires 5 days ago in Docker

答案 14 :(得分:1)

docker-compose用法:

Median添加到/etc/localtime:/etc/localtime:ro属性:

volumes

答案 15 :(得分:0)

尽管这并不是每个主机的通用解决方案,但有人可能会发现它很有用。如果您知道自己的居住地(对我来说是英国),那么请看tianon's回答here

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

这是我添加到Dockerfile ^中的内容,时区问题已修复。

答案 16 :(得分:0)

在Windows功能中启用Hyper-V解决了该问题: Windows Features

答案 17 :(得分:0)

这将重置Docker服务器中的时间:

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

下次创建容器时,时钟应该正确。

来源:https://github.com/docker/for-mac/issues/2076#issuecomment-353749995

答案 18 :(得分:0)

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


我的解决方案受到在docker论坛线程中发现的启发。无论如何,这是在docker桌面上对我唯一有效的解决方案,除了重启我的机器(也可以)。这是原始线程的链接: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")"

答案 19 :(得分:0)

无论出于何种原因,这些答案都没有解决我的问题。

它与我创建的图像的 docker 日期/时间无关。这与我当地的 WSL 日期时间有关。

一旦我运行 sudo ntpdate-debian 一切正常。

如果您没有 ntp,只需安装它并运行命令。如果您不使用 debian,那么您可能没有 shell 脚本 ntpdate-debian,但您也可以使用 ntpd -gq。基本上只需更新主要 WSL 发行版的日期。

相关问题