docker 容器 與宿主機容器時間
docker 容器與宿主機時間同步問題
容器的默認時間是UTC時間與宿主機的相差8小時
解決進入容器
export TZ=Asia/Shanghai #修改時區
- 創建容器的時候指定啟動參數,自動掛載localtime文件到容器內
docker run --name <name> -v /etc/localtime:/etc/localtime:ro ....
- 把時區設置加入到Dockerfile中
# CentOS
RUN echo "Asia/shanghai" > /etc/timezone;
# Ubuntu
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改容器時間
測試同學,因為特殊場景,希望更改一下服務對應的容器時間
啟動參數 參加 --cap-add SYS_TIME
參考官方文檔https://docs.docker.com/engine/reference/run/
docker run -it --cap-add SYS_TIME --name centos centos:7 /bin/bash
可以修改了容器時間了, 但是當你修改容器時間 宿主機時間也會隨之改變
盡管這是在測試環境,宿主機的時間更改可也不是鬧着玩的呀
僅修改docker容器中的時間,而不影響宿主機的時間
docker 容器都是輕量級的,它們會共享相同的linux內核,而time& date 是kelnel的函數,所有修改docker容器的時間也會造成宿主機時間被修改
在github上有一個libfaketime項目,我們可以使用LD_PRELOAD這個環境變量使date連接這個項目編譯的庫來“欺騙”應用,達到修改docker容器時間的目的,具體做法:
1.pull項目:
mkdir libfaketime && cd libfaketime && git init
git pull https://github.com/wolfcw/libfaketime.git
2 使用make命令編譯src下的代碼,得到動態庫文件:/usr/local/lib/faketime/libfaketime.so.1
3 .運行 docker exec -it <containter_id | containter_name> /bin/bash進入容器
4 使用如下命令修改程序運行時的鏈接,並設置時間為2天前。
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-2d"
#取消的話, 環境變量設置空
# 時間設置 libfaketime
#!/usr/bin/env bash
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1
#export FAKETIME="2020-12-24 20:30:00" #該時間會一直保持不變
export FAKETIME="@2020-12-24 20:30:00" #時間會從這里往后遞增
容器修改時間, 把對應的libfaketime.so.1文件拷貝進去容器
docker cp /usr/local/lib/faketime/libfaketime.so.1 9a5150123100:/usr/local/lib/faketime/
設置為5天前
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-5d"
#從硬件時間獲取
hwclock
#硬件時間設置到系統上來
hwclock -s