How to make sure docker's time syncs with that of the host?

I have dockers running on Linode servers. At times, I see that the time is not right on the dockers. Currently I have changed the run script in every docker to include the following lines of code.

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

What I would ideally like to do however is that the docker should sync time with the host. Is there a way to do this?

229615 次浏览

This is what worked for me with a Fedora 20 host. I ran a container using:

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

希望能有帮助。

这个答案的来源是对答案的评论: 码头容器是否会与主机自动同步时间?

在看了答案之后,我意识到时钟漂移不可能发生在码头集装箱上。Docker 使用与主机相同的时钟,而且 Docker 不能更改它。这意味着在码头内执行 ntpdate不起作用。

正确的做法是使用 ntpdate更新主机时间

As far as syncing timezones is concerned, -v /etc/localtime:/etc/localtime:ro works.

如果你在 docker VM 中使用 Boot2docker和 ntp doesn't work(你在一个不转发 ntp 数据包的代理后面) ,但是你的主机是时间同步的,你可以在你的主机上运行以下代码:

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

通过这种方式,您可以将计算机的当前时间(以 UTC 时区为单位)作为字符串发送,以使用 date(同样以 UTC 时区为单位)设置 docker VM 时间。

NOTE: in Windows, inside a bash shell (from the msys git), use:

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

如果您使用 Docker Machine,它似乎可以随时间漂移,正如这个响应所建议的: 由于 VirtualBox,https://stackoverflow.com/a/26454059/105562

快速简单的解决方法就是重新启动你的虚拟机:

docker-machine restart default

If you're using docker-machine, the virtual machines can drift. To update the clock on the virtual machine without restarting run:

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

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

窗户的码头,我不得不滴答

MobyLinuxVM > Settings > Integration Services > Time synchronization

在 Hyper-V 经理和它的工作

对于 macOS 上的 docker,你可以使用 Docker 时间同步代理。它对我很有用。

您可以将本地文件(/etc/timezone 和/etc/localtime)作为卷添加到 Docker 容器中。

用以下代码行更新 docker-compose.yml

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

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

I was facing a time offset of -1hour and 4min

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

设定一般的时区:

  1. 将 ssh 放入容器: docker exec -it my_website_name bash

  2. 运行 dpkg-reconfigure tzdata

  3. 运行 date

我在作文文件中有以下内容

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

那么 Gerrit 的 docker 就没问题了,复制日志设置了正确的时间戳。

码头作业用法:

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

version: '3'


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

This will reset the time in the docker server:

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

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

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

虽然这不是每个主机的通用解决方案,但有人可能会发现它很有用。如果你知道你的基地(英国为我) ,然后看看 tianon's答案 给你

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

This is what I added to my Dockerfile ^ and the timezone problem was fixed.

我发现如果你的电脑进入休眠状态,那么码头集装箱就会失去同步。

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

我在这里发了一篇关于它的文章 证书在 Docker 5天前就过期了

Docker Usage

下面是一个完整的示例,它为一个多阶段构建的 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"]

在 Windows 中启用 Hyper-V 特性解决了这个问题: 视窗功能

对我来说,重新启动 Docker 桌面没有帮助。关闭 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


我的解决方案的灵感来源于我在 Docker 论坛的帖子。无论如何,这是唯一的解决方案,为我工作的多克桌面,除了重新启动我的机器(也工作)。这里有一个原始线程的链接: https://forums.docker.com/t/syncing-clock-with-host/10432/23

线程答案和我的不同之处在于 mine 将时间转换为 UTC 时间,这对于 AWS 来说是必要的。否则,论坛的原始答案是这样的:

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

For whatever reason none of these answers solved my problem.

它与我正在创建的图像的 Docker 日期/时间没有任何关系。这与我当地的 WSL 日期时间有关。

Once I ran sudo ntpdate-debian everything worked.

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

我在窗户上看到这个,从码头上发射普罗米修斯号,我有15个小时的时间漂移。

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

对我有用,我不需要重新开始。

这个简单的解决方案修复了 WSL2中的 docker 内核的时间同步问题。

在 Windows 中打开 PowerShell 并运行此命令来重新同步时钟。

wsl -d docker-desktop -e /sbin/hwclock -s

然后您可以使用

docker run -it alpine date

参考资料: https://github.com/docker/for-win/issues/10347#issuecomment-776580765