¿El contenedor Docker sincronizará automáticamente la hora con la máquina host?

108

Dando que ya cambié la zona horaria del contenedor de la ventana acoplable correctamente. ¿Necesito instalar un servidor NTP dentro del contenedor de la ventana acoplable para sincronizar periódicamente la hora o el contenedor sincronizará la hora desde su máquina host?

vantt
fuente

Respuestas:

103

Si está en OSX ejecutando boot2docker, vea este problema: https://github.com/boot2docker/boot2docker/issues/290

La sincronización de tiempo se convierte en un problema porque el host boot2docker tiene su tiempo de deriva mientras su sistema operativo está inactivo. La sincronización de tiempo con su contenedor docker no se puede resolver ejecutando su contenedor con-v /etc/localtime:/etc/localtime:ro

En cambio, por ahora, debe ejecutar esto periódicamente en OSX:

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

Actualización para usuarios de Kitematic

Si está ejecutando Kitematic , que ahora es el mecanismo sugerido para comenzar a ejecutar Docker en OSX, deberá ejecutar periódicamente este comando:

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

O, para versiones anteriores de Docker

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

Actualización para usuarios del nuevo Docker nativo para OSX

La nueva Docker Beta elimina VirtualBox y Docker Machine. Las últimas compilaciones de Docker (actualmente, 1.12.1-beta25 (compilación: 11807)) parecen tener la capacidad de detectar cuándo ha habido una discontinuidad temporal y ajustarse en consecuencia. Por lo tanto, esto ya no debería ser un problema ... ¡¡hurra !!

esilver
fuente
¡Gracias buen señor!
seanmcl
Muchas gracias. Esto fue lo único que funcionó.
Mark Bao
1
Vea la supuesta corrección / mitigación: github.com/boot2docker/boot2docker/pull/661
Max Gasner
7
Tenga en cuenta que para Docker para OSX Beta, reiniciar el contenedor no me funcionó, y tampoco lo hizo recrearlo. En su lugar, tuve que reiniciar Docker (desde el ícono de la barra de menú).
Pol
Escribí una herramienta CLI basada en esta respuesta para sincronizar el tiempo en las máquinas virtuales de la máquina acoplable cada 5 minutos. Funciona en mi OSX El Capitan y Windows 7 Pro
dadads
50

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

Vea la respuesta de sameersbn.

option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"
usuario3908675
fuente
2
La opción 2 funcionó para mí. De hecho, me gusta que sea más explícito que las otras opciones.
Ryan Walls
Gracias, la opción 2 también me funcionó. Recibo un error en mi Mac con la opción 1 porque no tengo la carpeta etc / localtime.
Zergleb
46

La solución más simple parece ser ejecutar su contenedor con la -v /etc/localtime:/etc/localtime:roopción. Así:

#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
fuente
25
No sé si la pregunta original era más sobre zonas horarias (por ejemplo, asegurarse de que el contenedor respetará los cambios de horario de verano y de zona horaria) o el mantenimiento de la hora exacta (por ejemplo, asegurarse de que el reloj del contenedor no se desvíe). Si se trata de zonas horarias, esa respuesta es perfecta. Si se trata de la deriva del reloj, no tiene que preocuparse: el reloj del contenedor es el mismo que el del host (excepto que el contenedor no puede cambiarlo, excepto cuando se está ejecutando en --privilegedmodo).
jpetazzo
@jpetazzo estuvo de acuerdo; Debería haber incluido una llamada a dateen la máquina host en mi MWE, ya que, de lo contrario, quizás no esté claro que el contenedor obtenga su tiempo del host.
shabbychef
1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
Brian Tingle
Esto no parece funcionar según Docker 1.3 en OSX. Mismo error que Brian Tingle.
esilver
1
@esilver boot2docker solo puede montar subdirectorios en / Users de forma predeterminada
menghan
27

En Docker para Mac OS X Beta, experimenté un cambio significativo en la máquina virtual, que se basa en Alpine Linux. Desde las Preguntas frecuentes de Alpine Linux , puede sincronizar el reloj de la máquina virtual con el siguiente comando.

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

Sin embargo, obtener acceso a un terminal en la máquina virtual es otra cuestión, que se puede hacer si usa el comando de pantalla.

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

Esa ruta es un enlace simbólico, que en mi sistema apunta a /dev/ttys003.

Una vez que ingrese, tenga en cuenta que moby loginsimplemente rootno tiene contraseña. Una vez que haya terminado, CTRL-A, D se desconectará de la sesión de pantalla.

NOTA: Esto solía estar documentado en la resolución de problemas de Docker para Mac, pero parece que se ha eliminado. Tuve la suerte de que me lo mostraran en Dockercon 2016. Parece que Docker está tratando de abstraer completamente la VM de la experiencia, lo que explica por qué ya no está documentado.

Martin Woolstenhulme
fuente
3
Esta debería ser la respuesta recientemente aceptada para las personas que usan los nuevos RC sin la máquina acoplable intermitente
Blizz
2

La solución actual para la deriva de tiempo de osx en Docker (abril de 2018):

Tengo mi mac en un servidor NTP, pero esta deriva de reloj fija con contenedores:

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

Si su sistema no tiene acceso a un servidor NTP, luego de una hibernación, el tiempo visto por Docker para Mac puede estar considerablemente desincronizado con el host. Además, el tiempo puede perder la sincronización lentamente durante el uso. Para restablecer manualmente el tiempo después de la hibernación, ejecute:

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

O, para resolver ambos problemas, puede agregar el reloj local como una fuente de tiempo NTP de reserva de baja prioridad (estrato alto) para el host. Para hacer esto, edite /etc/ntp-restrict.conf del host para agregar:

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

Luego reinicie el servicio NTP con:

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

uso de docker-compose:

Agregue /etc/localtime:/etc/localtime:roal volumesatributo.

Mire este enlace para demostrar un ejemplo.

Benyamin Jafari
fuente