前言
在公司開發時使用 Docker 創建數據庫(SQL Server)的實例十分方便,還原數據庫也只要設置好共享文件夾,在 SQL Server Management Studio 的圖形化界面中選擇數據庫的備份文件即可還原。但在處理與時間有關的業務邏輯時發現有問題,查詢后發現docker容器中的時間使用的是“標准時間”,與“北京時間”相差8小時,因此解決一下問題(順便復習一下 Linux 的一些命令 #滑稽)。
本人使用的是 Windows 10 專業版系統,Docker(之前發現 Docker Toolbox 會有一些問題,比如還原數據庫出錯)。
1. 創建容器
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YOUR_PASSWORD>" ` -p <YOUR_PORT>:1433 --name <YOUR_NAME> -v <HOST_SHARE_DIR>:<DOCKER_SHARE_DIR> -d microsoft/mssql-server-linux
注意點:
- 要運行 SQL Server 的 Docker 鏡像,主機運行內存不能少於2G
- 對於 SQL Server 的 Docker 鏡像,密碼不能設置的太簡單,否則容器運行后會直接報錯退出。建議字母、數字、特殊符號,且不少於8位
- 使用 -p 設置端口號時,不要與主機已有沖突(這個應該都知道XD)
- 使用 -v 設置共享目錄時,即使目錄不存在也沒關系,Docker會自動新建(主機的和容器的都會新建)
- 使用 Powershell 時,如果命令一行太長,可以使用 ` 換行
2. 查看時間
首先進入容器
docker exec -it <YOUR_CONTAINER_NAME> /bin/bash
使用 date 命令查看時間
root@de3281e271c0:/# date
Sat Apr 11 08:21:26 UTC 2020
而我們主機此時的時間為(使用Powershell查看):
PS C:\Users\XXX> GET-DATE
2020年4月11日, 星期六 16:26:10
可以看到相差8個小時
而手動設置時區也不行(正常的話應該會出現選擇時區):
root@de3281e271c0:/# tzselect
/usr/bin/tzselect: line 180: /usr/share/zoneinfo/iso3166.tab: No such file or directory
/usr/bin/tzselect: time zone files are not set up correctly
3. 解決
我們此時要做的就是從另一台電腦上拷貝時區文件,放入Docker容器中,並將設置軟鏈接起來。
此處我使用 WinSCP 從雲服務器中拷貝文件(雲服務器中的系統為 CentOS,而 SQL Server 容器中的系統為 Ubuntu,但可以通用)
先查看一下\😃
[root@VM_0_2_centos ~]# file /usr/share/zoneinfo/Asia/Shanghai
/usr/share/zoneinfo/Asia/Shanghai: timezone data, version 2, 2 gmt time flags, 2 std time flags, no leap seconds, 16 transition times, 2 abbreviation chars
為了方便我拷貝到了主機的d盤根目錄下。由於容器中甚至沒有 /usr/share/zoneinfo/Asia/ 文件夾,需要先新建,再復制進去
新建文件夾(在容器的 shell中):
mkdir -p /usr/share/zoneinfo/Asia
復制(在主機的 Powershell中):
docker cp d:\Shanghai <YOUR_COINTAINER_NAME>:/usr/share/zoneinfo/Asia/Shanghai
最后建立軟鏈接:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
查看效果
root@de3281e271c0:/# date
Sat Apr 11 16:57:18 CST 2020
結束!
吐槽
新版本的 Docker Desktop 中加入了 Dashboard 功能,可以圖形化的管理已有的容器(開啟、關閉、日志),但其命令行操作實在不給力,按 Tab 鍵無法自動補全,因此還是建議使用 exec -it 的方式執行。
后記
本文新使用了 > 符號來表示 shell 輸出的內容,可能較原來清晰一些。