Le conteneur Docker sera-t-il automatiquement synchronisé avec la machine hôte?

108

En donnant j'ai déjà changé correctement le fuseau horaire du conteneur docker. Dois-je installer un serveur NTP à l'intérieur du conteneur Docker pour synchroniser périodiquement l'heure ou le conteneur synchronisera l'heure depuis sa machine hôte?

vantt
la source

Réponses:

103

Si vous êtes sur OSX exécutant boot2docker, consultez ce problème: https://github.com/boot2docker/boot2docker/issues/290

La synchronisation de l'heure devient un problème car l'hôte boot2docker a sa dérive temporelle pendant que votre système d'exploitation est en veille. La synchronisation de l'heure avec votre conteneur Docker ne peut pas être résolue en exécutant votre conteneur avec-v /etc/localtime:/etc/localtime:ro

Au lieu de cela, pour l'instant, vous devez l'exécuter périodiquement sur OSX:

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

Mise à jour pour les utilisateurs de Kitematic

Si vous exécutez Kitematic , qui est maintenant le mécanisme suggéré pour être opérationnel sur Docker sous OSX, vous devrez exécuter périodiquement cette commande:

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

Ou, pour les anciennes versions de docker

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

Mise à jour pour les utilisateurs du nouveau Docker natif pour OSX

La nouvelle version bêta de Docker supprime VirtualBox et Docker Machine. Les dernières versions de docker (actuellement, 1.12.1-beta25 (build: 11807)) semblent avoir la capacité de détecter quand il y a eu une discontinuité temporelle et de s'ajuster en conséquence. Ainsi, cela ne devrait plus être un problème ... Hourra !!

argent
la source
Merci Monsieur!
seanmcl
Merci beaucoup. C'était la seule chose qui fonctionnait.
Mark Bao
1
Voir le correctif / atténuation supposé
Max Gasner
7
Notez que pour Docker pour OSX Beta, le redémarrage du conteneur ne m'a pas fonctionné, ni ne l'a recréé. Au lieu de cela, j'ai dû redémarrer Docker lui-même (à partir de l'icône de la barre de menus).
Pol
J'ai écrit un outil CLI basé sur cette réponse pour synchroniser l'heure sur les machines virtuelles docker-machine toutes les 5 minutes. Fonctionne sur mon OSX El Capitan et Windows 7 Pro
papas
50

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

Voir la réponse de sameersbn.

option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"
user3908675
la source
2
L'option 2 a fonctionné pour moi. J'aime en fait que c'est plus explicite que les autres options.
Ryan Walls
Merci l'option 2 a également fonctionné pour moi. J'obtiens une erreur sur mon Mac avec l'option 1 car je n'ai pas de dossier etc / localtime.
Zergleb
46

La solution la plus simple semble être d'exécuter votre conteneur avec l' -v /etc/localtime:/etc/localtime:rooption. Donc:

#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
la source
25
Je ne sais pas si la question d'origine portait davantage sur les fuseaux horaires (par exemple, en s'assurant que le conteneur respectera l'heure d'été et les changements de fuseau horaire) ou en précisant l'heure (par exemple en s'assurant que l'horloge du conteneur ne dérivera pas). S'il s'agit de fuseaux horaires, cette réponse est parfaite. S'il s'agit de dérive d'horloge, vous n'avez pas à vous inquiéter: l'horloge du conteneur est la même que celle de l'hôte (sauf que le conteneur ne peut pas la changer, sauf lorsqu'il fonctionne en --privilegedmode).
jpetazzo
@jpetazzo était d'accord; J'aurais dû inclure un appel à datesur la machine hôte dans mon MWE, car il n'est peut-être pas clair autrement que le conteneur obtient son heure de l'hôte.
shabbychef
1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
Brian Tingle
Cela ne semble pas fonctionner par docker 1.3 sur OSX. Même erreur que Brian Tingle.
esilver
1
@esilver boot2docker ne peut monter que des sous-répertoires sous / Users par défaut
menghan
27

Sur Docker pour Mac OS X Beta, j'ai constaté une dérive importante sur la VM, qui est basée sur Alpine Linux. À partir de la FAQ Alpine Linux, vous pouvez synchroniser l'horloge de la machine virtuelle avec la commande suivante.

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

Cependant, accéder à un terminal sur la machine virtuelle est une autre question, qui peut être effectuée si vous utilisez la commande screen.

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

Ce chemin est un lien symbolique vers lequel pointe sur mon système /dev/ttys003.

Une fois que vous êtes entré, notez que le moby loginest simplement rootsans mot de passe. Une fois que vous avez terminé, CTRL-A, D se déconnectera de la session d'écran.

REMARQUE: cela était documenté sur le dépannage de Docker pour Mac, mais cela semble avoir été supprimé. J'ai eu la chance de le voir lors de Dockercon 2016. Il semble que Docker tente d'abstraire complètement la VM de l'expérience, ce qui explique pourquoi elle n'est plus documentée.

Martin Woolstenhulme
la source
3
Cela devrait être la réponse nouvellement acceptée pour les personnes utilisant les nouveaux RC sans le docker-machine intermittent
Blizz
2

La solution actuelle pour la dérive temporelle osx sur docker (avril 2018):

J'ai mon mac sur un serveur NTP, mais cette dérive d'horloge fixe avec les conteneurs:

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

Si votre système n'a pas accès à un serveur NTP, après une mise en veille prolongée, l'heure affichée par Docker pour Mac peut être considérablement désynchronisée avec l'hôte. En outre, l'heure peut lentement dériver de la synchronisation pendant l'utilisation. Pour réinitialiser manuellement l'heure après la mise en veille prolongée, exécutez:

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

Ou, pour résoudre les deux problèmes, vous pouvez ajouter l'horloge locale en tant que source de temps NTP de secours de faible priorité (strate haute) pour l'hôte. Pour ce faire, modifiez le fichier /etc/ntp-restrict.conf de l'hôte pour ajouter:

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

Puis redémarrez le service NTP avec:

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

utilisation de docker-compose:

Ajoutez /etc/localtime:/etc/localtime:roà l' volumesattribut.

Regardez ce lien pour montrer un exemple.

Benyamin Jafari
la source