O docker container sincronizará automaticamente o tempo com a máquina host?

108

Dando eu já alterei o fuso horário do docker container corretamente. Preciso instalar um servidor NTP dentro do contêiner do docker para sincronizar a hora periodicamente ou o contêiner sincronizará a hora de sua máquina host?

vantajoso
fonte

Respostas:

103

Se você estiver no OSX executando boot2docker, veja este problema: https://github.com/boot2docker/boot2docker/issues/290

A sincronização de tempo se torna um problema porque o host boot2docker tem seu tempo oscilante enquanto o sistema operacional está adormecido. A sincronização de tempo com seu contêiner do docker não pode ser resolvida executando seu contêiner com-v /etc/localtime:/etc/localtime:ro

Em vez disso, por enquanto, você deve executar isso periodicamente no OSX:

/usr/local/bin/boot2docker ssh sudo ntpclient -s -h pool.ntp.org

Atualização para usuários do Kitematic

Se você estiver executando o Kitematic , que agora é o mecanismo sugerido para iniciar e executar no Docker no OSX, deverá executar este comando periodicamente:

docker-machine ssh default 'sudo ntpclient -s -h pool.ntp.org'

Ou, para versões mais antigas do docker

docker-machine ssh dev 'sudo ntpclient -s -h pool.ntp.org'

Atualização para usuários do novo Docker nativo para OSX

O novo Docker Beta acaba com VirtualBox e Docker Machine. As últimas compilações do docker (atualmente, 1.12.1-beta25 (compilação: 11807)) parecem ter a capacidade de detectar quando houve uma descontinuidade de tempo e ajustar de acordo. Portanto, isso não deve ser mais um problema ... hooray !!

Esilver
fonte
Obrigado, gentil senhor!
seanmcl
Muito obrigado. Essa foi a única coisa que funcionou.
Mark Bao
1
Veja a suposta correção / mitigação: github.com/boot2docker/boot2docker/pull/661
Max Gasner
7
Observe que, para o Docker para OSX Beta, reiniciar o contêiner não funcionou, nem recriá-lo. Em vez disso, tive que reiniciar o próprio Docker (a partir do ícone da barra de menu).
Pol de
Eu escrevi uma ferramenta CLI com base nesta resposta para sincronizar o tempo em VMs docker-machine a cada 5 minutos. Funciona no meu OSX El Capitan e Windows 7 Pro
dadads de
50

https://github.com/sameersbn/docker-gitlab/issues/77

Veja a resposta de sameersbn.

option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"
user3908675
fonte
2
A opção 2 funcionou para mim. Na verdade, gosto que seja mais explícito do que as outras opções.
Ryan Walls
Obrigado, a opção 2 também funcionou para mim. Recebo um erro no meu Mac com a opção 1 porque não tenho a pasta etc / localtime.
Zergleb
46

A solução mais simples parece ser executar seu contêiner com a -v /etc/localtime:/etc/localtime:roopção. Portanto:

#run without tz info:
docker run --rm -t -i ubuntu date
Wed Apr  2 18:40:07 UTC 2014
# run with tz info:
docker run --rm -t -i -v /etc/localtime:/etc/localtime:ro ubuntu date
Wed Apr  2 11:40:29 PDT 2014
shabbychef
fonte
25
Não sei se a pergunta original era mais sobre fusos horários (por exemplo, certificar-se de que o contêiner honrará o horário de verão e as alterações de fuso horário) ou a precisão da hora (por exemplo, garantir que o relógio do contêiner não desvie). Se for sobre fusos horários, a resposta é perfeita. Se for sobre o desvio do relógio, você não precisa se preocupar: o relógio do contêiner é igual ao relógio do host (exceto que o contêiner não pode alterá-lo, exceto quando está em execução no --privilegedmodo).
jpetazzo
@jpetazzo concordou; Eu deveria ter incluído uma chamada para datena máquina host em meu MWE, caso contrário, talvez não esteja claro se o contêiner obtém seu tempo do host.
shabbychef
1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
Brian Tingle,
Isso não parece funcionar por docker 1.3 no OSX. Mesmo erro de Brian Tingle.
esilver
1
@esilver boot2docker só pode montar subdiretórios em / Usuários por padrão
menghan
27

No Docker para Mac OS X Beta, experimentei um desvio significativo na VM, que é baseada no Alpine Linux. No Alpine Linux FAQ, você pode sincronizar o relógio da VM com o seguinte comando.

ntpd -d -q -n -p pool.ntp.org

No entanto, obter acesso a um terminal na VM é outra questão, que pode ser feita se você usar o comando screen.

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

Esse caminho é um link simbólico, que aponta para o meu sistema /dev/ttys003.

Depois de entrar, observe que o moby loginestá simplesmente rootsem senha. Após terminar, CTRL-A, D se desconectará da sessão de tela.

NOTA: Isso costumava ser documentado no Docker para Mac Trouble Shooting, mas parece ter sido removido. Tive a sorte de vê-lo durante o Dockercon 2016. Parece que o Docker está tentando abstrair a VM completamente da experiência, o que explica por que não está mais documentado.

Martin Woolstenhulme
fonte
3
Esta deve ser a resposta recém-aceita para pessoas que usam os novos RCs sem a docker-machine intermitente
Blizz
2

A solução atual para osx time drift no docker (abril de 2018):

Eu tenho meu mac em um servidor NTP, mas este relógio fixo muda com contêineres:

De https://docs.docker.com/docker-for-mac/troubleshoot/#known-issues :

Se o seu sistema não tiver acesso a um servidor NTP, após uma hibernação, o tempo visto pelo Docker para Mac pode ficar consideravelmente fora de sincronia com o host. Além disso, o tempo pode vagar lentamente fora de sincronia durante o uso. Para redefinir manualmente o tempo após a hibernação, execute:

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

Ou, para resolver os dois problemas, você pode adicionar o relógio local como uma fonte de tempo NTP de fallback de baixa prioridade (estrato alto) para o host. Para fazer isso, edite o /etc/ntp-restrict.conf do host para adicionar:

server 127.127.1.1              # LCL, local clock
fudge  127.127.1.1 stratum 12   # increase stratum

Em seguida, reinicie o serviço NTP com:

sudo launchctl unload /System/Library/LaunchDaemons/org.ntp.ntpd.plist
sudo launchctl load /System/Library/LaunchDaemons/org.ntp.ntpd.plist
Steve Kallestad
fonte
1

uso docker-compose:

Adicione /etc/localtime:/etc/localtime:roao volumesatributo.

Veja este link para demonstrar um exemplo.

Benyamin Jafari
fonte