Docker修改容器中的时间

前言

在公司开发时使用 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

注意点:

  1. 要运行 SQL Server 的 Docker 镜像,主机运行内存不能少于2G
  2. 对于 SQL Server 的 Docker 镜像,密码不能设置的太简单,否则容器运行后会直接报错退出。建议字母、数字、特殊符号,且不少于8位
  3. 使用 -p 设置端口号时,不要与主机已有冲突(这个应该都知道XD)
  4. 使用 -v 设置共享目录时,即使目录不存在也没关系,Docker会自动新建(主机的和容器的都会新建)
  5. 使用 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 输出的内容,可能较原来清晰一些。

Docker修改容器中的时间的更多相关文章

  1. docker修改容器gogs时区时间

    问题描述: 公司内部搭建了一个gogs-git,是用docker部署的,但是发现提交的代码什么的时间跟服务器时间不一致 提交上去的世界是UTC时间不是中国的时间CST,相当于慢了8个小时 1.dock ...

  2. Docker 在容器中部署静态网站

    Docker 在容器中部署静态网站 在容器中部署静态网站 设置容器的端口映射 run -P``--publish-all=true|false:容器暴露的所有端口进行映射 -p``--publish= ...

  3. docker从容器中怎么访问宿主机

    docker从容器中怎么访问宿主机  我来答 浏览 3160 次 2个回答 #热议# 2019年全国两会召开,哪些提案和政策值得关注? 好程序员 知道合伙人 推荐于2017-11-22   dock ...

  4. docker 修改容器env配置

    docker 修改容器env配置 场景:修改zabbix数据库密码 zabbix容器构成: 数据库:zabbix-mysql server端:zabbix-server-mysql web端:zabb ...

  5. 【Docker】-NO.132.Docker.1 -【Docker 修改容器端口】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  6. Docker:容器与主机时间不同步问题解决

    在Docker容器运行后,可能会发现容器时间与宿主机时间不一致,一般会差8个小时.这样会造成在容器中运行的web程序打出的日志时间与实际时间不一致,如果web程序中有定时任务也会造成影响等,需要对宿主 ...

  7. Docker 修改容器内的时区

    利用docker发布服务,发现 程序用获取的系统时间比正常时间晚了8个小时 进入容器 docker exec -it /bin/sh 查询时间 date -R 发现时区为0时区 解决思路 1.复制相应 ...

  8. docker 修改容器配置文件

    启动docker镜像命令docker run 可以指定端口映射,但是容器一旦创建就无法在通过命令修改.通常是保存镜像在创建一个新的容器.有没有办法不保存镜像直接修改这个容器呢?答案是有的,本文已mys ...

  9. 【Docker】容器中找不到vi命令

    在Docker容器中找不到vi命令 解决办法: 1.通过命令获取最新的软件包 apt-get-update 2.安装vi命令 apt-get install vim 安装过程中提示是否进行输入Y即可. ...

随机推荐

  1. LaTex公式语法教程及手册(附emlogpro公式显示插件katex说明)

    目录 第一列 第二列 第三列 效果 求和(使用\sum标签) 文本效果 本插件简介 积分(使用\int标签) 文本大小 LaTex是什么 空格 特殊符号 LaTex公式使用教程及手册 定界符 LaTe ...

  2. [C++]-map 映射

    map用来存储排序后的由键和值组成的项的集合.键必须唯一,不同的键可以对应同一个值,在map中键保持逻辑排序后的顺序(以键为标准). 代码 #include<iostream> #incl ...

  3. 关于const声明一些东西

    const int a;        int const a;        const int *a;     int *const a;    const int *const a;   前两个 ...

  4. Java程序员的推荐阅读书籍

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  5. 题解 Connect

    传送门 各种骗分无果,特殊性质还手残写挂了-- 首先完全图上直接输出边权 \(\times (n-2)\) 就行了,然而我脑残乘的 \(n-1\) 看数据范围肯定是状压,但是压边肯定炸了,考虑压点 因 ...

  6. Azkaban入门(启动一个Simple Example)

    Azkaban简介 azkaban是一个开源的任务调度系统 Azkaban是一套简单的任务调度服务,整体包括三部分webserver.dbserver.executorserver. 开发语言为Jav ...

  7. docker部署minio

    快速部署 docker run -p 9000:9000 --name myminio \ -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \ ...

  8. SpringCloud(5)之分布式锁实现

    01为什么用分布式锁 在讨论这个问题之前,我们先来看一个业务场景:系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用 ...

  9. dataTemplate 使用

    App ----------------------------------------------------------------- <Application x:Class=" ...

  10. HttpClient4.3 教程 第五章 快速API

    5.1.Easy to use facade API HttpClient从4.2开始支持快速api.快速api仅仅实现了HttpClient的基本功能,它只要用于一些不需要灵活性的简单场景.例如,快 ...