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


79

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

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

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



容器将与主机使用相同的时间。请参阅此问答以及Docker核心开发人员之一的回答。
Ben Whaley 2014年

这是一个肯定的重复问题,但即使是另一个问题,答案也都在谈论时区,而我并不是很在意。答案的注释清楚地表明,由于Docker和主机使用相同的时钟,因此不会发生时钟漂移。感谢Ben指出。
Ranjith Ramachandra 2014年

8
警告:关于主机是什么有些困惑。在linux和带有linux子系统的Windows 10+之外的其他操作系统上,docker计算机(主机)实际上是虚拟机。当Docker主机与运行docker命令的主机不在同一台机器上时,您可能会发现时间偏移,并且诸如挂载卷之类的事情将无法按预期工作。当您在例如DigitalOcean上设置远程docker计算机时,也会发生这种情况。
编码

Answers:


83

该答案的来源是对该答案的评论:docker容器会自动与主机同步时间吗?

查看答案后,我意识到docker容器上不会发生时钟漂移。Docker使用与主机相同的时钟,并且Docker无法更改它。这意味着ntpdate在docker内部进行操作不起作用。

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

就同​​步时区而言,它是可行的-v /etc/localtime:/etc/localtime:ro


4
告诉我那怎么可能?案卷是否使用与系统相同的时钟。docker时钟与主机有何不同?如果发生时钟偏移,它将在需要修复时钟偏移的docker主机上发生。我有兴趣知道我是否错了。
Ranjith Ramachandra 2014年

10
在具有boot2docker的Mac上使用Docker时,boot2docker VM可能会浪费时间。Docker与其主机保持同步,但是其主机提供了错误的时间。重启虚拟机是最简单的解决方案。
纳撒尼尔(Nathaniel Waisbrot)2014年

56
VM失去了时间,这是完全不同的问题。从技术上讲,泊坞窗仍与其主机即虚拟机保持同步。
Ranjith Ramachandra 2014年

3
@ISJ:boot2docker restart或者,如果您运行自己的VM,则可以ntpdate在那里。
纳撒尼尔(Nathaniel Waisbrot)2014年

3
我在Windows上。主机时间是15:06,容器时间是18:41 ... wtf
willem

35

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

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

这样,您将以字符串形式发送计算机的当前时间(以UTC时区为单位)以设置Docker VM时间date(再次以UTC时区为单位)。

注意:在Windows的bash shell内(来自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

33

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

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

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

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


好干净!ty!
wopolow

27

这是使用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

24

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

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

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

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


3
这就是我一直在寻找的秘密!几天前休假,证书脾气暴躁。谢谢!
约西亚

2
谢谢你 像魅力一样工作。
Ryan Nutt

如何在docker-compose中使用它?
Surya Swanoff

1
我看到大量报道的适用于Windows的Docker在睡眠错误后没有及时同步,此修复工作就像魔术一样!到底在做什么
StackG

10

如果您使用的是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


8

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

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

然后,在Gerrit泊坞窗中将其复制日志设置为正确的时间戳,一切都会好起来。


我在CentOS(7)主机中有Debian(9)容器,并且可以挂载本地时间,但是时区不能,因为在主机上它是目录,而在容器中是文件。
6


5

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

MobyLinuxVM > Settings > Integration Services > Time synchronization 

在Hyper-V管理器中,并且可以正常工作


不过有一个问题。看来,重新启动主机后,该设置未选中
user725408 '17

是的-这似乎对一些窗口发生的构建(见github.com/docker/for-win/issues/409
基督教奥皮茨

1
就我而言,该复选框已被选中,但是容器时间比主机时间晚三天。
Scott Hutchinson

5

docker-compose用法:

添加/etc/localtime:/etc/localtime:rovolumes属性:

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应用构建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"]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.