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

问题描述 投票:43回答:12

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

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

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

docker ntp
12个回答
54
投票

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

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

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

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


3
投票

对于windows的docker,我不得不打勾

MobyLinuxVM > Settings > Integration Services > Time synchronization 

在Hyper-V管理器中,它工作正常


1
投票

docker-compose usage:

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

version: '3'

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

0
投票

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

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

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

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


0
投票

虽然这不是每个主机的通用解决方案,但有人可能会发现它很有用。如果你知道你在哪里(英国对我来说),那么看看tianon's回答here

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

这是我添加到我的Dockerfile ^,并修复了时区问题。


31
投票

如果您正在使用boot2docker并且ntp在docker VM中不起作用(您位于不转发ntp数据包的代理后面)但是您的主机是时间同步的,则可以从主机运行以下命令:

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

这样,您将使用date(再次以UTC时区为单位)将机器的当前时间(以UTC时区为单位)发送为字符串以设置泊坞窗VM时间。

注意:在Windows中,在bash shell(来自msys git)中,使用:

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

20
投票

这对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找到了它。

希望能帮助到你。


15
投票

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

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

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

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


9
投票

如果您使用的是docker-machine,虚拟机可能会漂移。要在不重新启动运行的情况下更新虚拟机上的时钟:

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

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


6
投票

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

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

一般设置时区:

  1. ssh到你的容器:docker exec -it my_website_name bash
  2. 运行dpkg-reconfigure tzdata
  3. 运行date

5
投票

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

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

docker-machine restart default

5
投票

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


4
投票

我在compose文件中有以下内容

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

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

© www.soinside.com 2019 - 2024. All rights reserved.