Comment s'assurer que le temps de docker est synchronisé avec celui de l'hôte?
j'ai des dockers sur des serveurs Linode. Parfois, je vois que le temps n'est pas juste sur les panneaux. Actuellement, j'ai changé le script d'exécution dans chaque docker pour inclure les lignes de code suivantes.
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
ce que je voudrais idéalement faire cependant, c'est que le docker soit synchronisé avec l'hôte. Est-il un moyen de faire cela?
11 réponses
la source de cette réponse est le commentaire à la réponse à: est-ce que Docker container auto synchronise le temps avec la machine hôte?
Après avoir examiné la réponse, j'ai réalisé qu'il n'existe aucun moyen d'une dérive de l'horloge aura lieu le conteneur docker. Docker utilise la même horloge que l'hôte et le panneau ne peut pas la modifier. Cela signifie que faire un ntpdate
à l'intérieur du docker ne fonctionne pas.
La bonne chose à faire est de mettre à jour l'Heure de l'hôte en utilisant ntpdate
en ce qui concerne les fuseaux horaires de synchronisation, -v /etc/localtime:/etc/localtime:ro
fonctionne.
si vous utilisez boot2docker et ntp ne fonctionne pas à l'intérieur de la VM docker (vous êtes derrière un proxy qui ne renvoie pas les paquets ntp) mais votre hôte est synchronisé, vous pouvez exécuter ce qui suit depuis votre hôte:
docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
de cette façon, vous envoyez l'heure courante de votre machine (dans le fuseau horaire UTC) comme une chaîne de caractères pour définir l'heure VM du docker en utilisant date
(encore une fois dans le fuseau horaire UTC).
NOTE: dans Windows, à l'intérieur d'un shell bash( du GIT msys), utilisez:
docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
c'est ce qui a fonctionné pour moi avec un hôte Fedora 20. J'ai couru un conteneur en utilisant:
docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash
initialement /etc/localtime
était un lien vers /usr/share/zoneinfo/Asia/Kolkata
qui est L'heure normale de L'Inde. L'exécution de date
à l'intérieur du conteneur m'a montré la même heure que sur l'hôte. Je suis sorti de la coque et j'ai arrêté le container en utilisant docker stop <container-id>
.
ensuite, j'ai supprimé ce fichier et l'ai fait lier à /usr/share/zoneinfo/Singapore
pour le tester. Hôte temps a été réglé sur le fuseau horaire de Singapour. Et puis il a fait docker start <container-id>
. Puis accéda de nouveau à son shell en utilisant nsenter
et découvrit que le temps était maintenant réglé sur le fuseau horaire de Singapour.
docker start <container-id>
docker inspect -f {{.State.Pid}} <container-id>
nsenter -m -u -i -n -p -t <PID> /bin/bash
donc la clé ici est d'utiliser -v /etc/localtime:/etc/localtime:ro
quand vous lancez le conteneur pour la première fois. Je l'ai trouvé sur ce lien .
J'espère que ça aidera.
si vous utilisez docker-machine, les machines virtuelles peuvent dériver. Pour mettre à jour l'horloge sur la machine virtuelle sans redémarrer, Lancez:
docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org
cela mettra à jour l'horloge sur la machine virtuelle en utilisant NTP et ensuite tous les conteneurs lancés auront la date correcte.
vous pouvez ajouter vos fichiers locaux (/etc/timezone et /etc/localtime) comme volume dans votre conteneur docker.
mettez à jour votre docker-compose.yml
avec les lignes suivantes.
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
maintenant l'heure du conteneur est la même que sur votre hôte
il semble que vous pouvez dériver dans le temps si vous utilisez Docker Machine, comme cette réponse suggère: https://stackoverflow.com/a/26454059/105562 , dû à VirtualBox.
la solution rapide et facile est de simplement redémarrer votre VM:
docker-machine restart default
Pour docker sur macOS, vous pouvez utiliser docker temps de synchronisation de l'agent . Il fonctionne pour moi.
avec docker pour windows j'ai dû cocher
MobyLinuxVM > Settings > Integration Services > Time synchronization
dans le gestionnaire Hyper-V et cela a fonctionné
je faisais face à un décalage horaire de -1hour et 4min
redémarrer Docker lui-même a réglé le problème pour moi.
pour définir le fuseau horaire en général:
-
SSH dans votre conteneur:
docker exec -it my_website_name bash
-
exécuter
dpkg-reconfigure tzdata
- exécuter
date
j'ai le texte suivant dans le fichier composer
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
puis tout bon dans Gerrit docker avec sa replication_log jeu avec timestamp correct. :- D
docker-composer usage:
ajouter /etc/localtime:/etc/localtime:ro
à l'attribut volumes
:
version: '3'
services:
a-service:
build: .
image: service-name
container_name: container-name
volumes:
- /etc/localtime:/etc/localtime:ro