修改 Docker 中 MySQL 8 容器时区的问题
提供以下几个方案1. 临时设置,重启后失效2. 已有容器,启动时追加时区参数3. 已有容器,进入容器内部修改配置文件4. 创建新的容器,并指定时区参数5. 高级篇:通过 docker cp 操作配置文件虽然在正式环境中不推荐使用 MySQL 容器来存储数据,但是在内网的开发环境中还是可以使用的,但是 MySQL 容器默认的不是中国时区,而是世界标准时间(UTC),所以在国内使用的话需要配置一下,否
提供以下几个方案
【注】MySQL 5.7
也类似,只是配置文件有所改变,在文章中会详细说明。
虽然在正式环境中不推荐使用 MySQL 容器
来存储数据,但是在内网的开发环境中还是可以使用的,但是 MySQL 容器
默认的不是中国时区
,而是世界标准时间(UTC
),所以在国内使用的话需要配置一下,否则会早8个小时,可以通过下面方法检查一下:
查看数据库当前时间:
SELECT NOW()
NOW |
---|
2020-12-08 06:27:46 |
查看数据库当前时区:
SHOW VARIABLES LIKE '%time_zone%';
Variable_name | Value |
---|---|
system_time_zone | UTC |
time_zone | SYSTEM |
说明:
system_time_zone UTC
: 当前系统时区time_zone:SYSTEM
: MySQL 采取的时区,默认为 SYSTEM,跟随系统。
1. 临时设置,重启后失效
通过SQL
语句设置。
# 仅修改当前会话的时区,停止会话失效(看具体场景使用)
set time_zone = '+8:00';
# 修改全局的时区配置,但是重启后会失效
SET GLOBAL time_zone = 'Asia/Shanghai'
# 或
SET GLOBAL time_zone = '+8:00'
# 强制刷新
flush privileges
2. 创建新的容器,并指定时区参数
如果原有容器可是删除的话,可以直接创建一个新的容器,并指定时区参数,这样容器的 Linux
环境就成为中国标准时间(CST)
,时区的标准比较复杂,这里不做太多探讨。
docker run -d -p 3306:3306 --name mysql-test -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123456 mysql
参数说明:
-e TZ=Asia/Shanghai
:表示时区为中国(上海)。
【注】更多参数请访问:
3. 已有容器,进入容器内部修改配置文件
【注】这样修改后,容器所在的 Linux 系统环境仍然使用的是 UTC 时间,而 MySQL 使用的是我们设置的时间。
3.1 环境准备
【注】 容器内部默认使用的是最小化的 debian 发行版,默认没有文本编辑器,需要自行安装。如果不想安装环境,直接异步:高级篇:通过 docker cp 操作配置文件
# 更新源(速度会比较慢)建议使用阿里镜像
apt-get update
# 安装 vim
apt install vim
3.2 进入容器内部
# 查看正在运行的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
946175835a9f mysql "docker-entrypoint.s…" 29 seconds ago Up 28 seconds 33060/tcp, 0.0.0.0:4000->3306/tcp mysql-test
# 进入容器内部
docker exec -it mysql-test bash
# 或
docker exec -it 946175835a9f bash
3.3 修改配置文件
配置文件放在 /etc/mysql
目录下。
# MySQL 8 默认只有 my.cnf 和 conf.d 等文件
# 修改的时候只修改 my.cnf 文件即可
cd /etc/mysql
vim my.cnf
# MySQL 5.7 默认有 my.cnf、conf.d、mysql.cnf、mysql.conf.d 等文件
# 修改的时候需修改 mysql.conf.d/mysqld.cnf 文件即可
cd /etc/mysql/mysql.conf.d
vim mysqld.cnf
找到 [mysqld]
,并在 datadir
下面另加一行 default-time-zone = '+8:00'
即可,然后保存并退出。
【注】default-time-zone = '+8:00'
比较简单,如果想更容易理解的话也可以:default-time-zone = 'Asia/Shanghai'
,都是一样的效果。图片中应为 default-time-zone
。
3.4 重启镜像
docker restart mysql-test
【注】进入 docker
容器内部更多信息请移步:Docker 进入容器,并在容器内执行命令
4. 高级篇:通过 docker cp 操作配置文件
通过第三种方式需要安装额外的文本编辑器才能对配置文件就行编辑与保存,比较麻烦。一般来说宿主机器都会配置好相关的软件,通过使用 docker cp
命令可以把 MySQL
的配置文件
复制到宿主机器上,在宿主机器上编辑完成后,在复制到容器内部替换掉原有的配置文件,在此操作之前,我们最好是先在容器内,将配置文件备份一下(这里以 MySQL 8 为例,MySQL 5.7 类似)。
4.1 备份配置文件
# 进入容器内部
docker exec -it mysql-test bash
# 或
docker exec -it 946175835a9f bash
# 备份文件目录
cd /etc/mysql
cp my.cnf my.cnf.bak
4.2 从容器中复制配置文件至宿主主机
通过 docker cp
复制容器中的配置文件至宿主主机
# 进入当前用户主目录
cd ~
# 把容器中配置文件复制到当前目录
docker cp mysql-test:/etc/mysql/my.cnf ./
# 修改配置文件(宿主机器)
vim my.cnf
找到 [mysqld]
,并在 datadir
下面另加一行 default-time_zone = '+8:00'
即可,然后保存并退出。
【注】default-time_zone = '+8:00'
比较简单,如果想更容易理解的话也可以:default-time_zone = 'Asia/Shanghai'
,都是一样的效果。
4.3 从宿主主机复制配置文件至容器内
docker cp my.cnf mysql-test:/etc/mysql/my.cnf
4.4 重启镜像
docker restart mysql-test
进入 docker
容器内部更多信息请移步:Docker 进入容器,并在容器内执行命令
【注】最佳实践
- 如果允许删除容器,推荐使用第二种方案:创建新的容器,并指定时区参数
- 如果不允许删除容器,推荐使用第四种方案:高级篇:通过 docker cp 操作配置文件
个人博客:Roc’s Blog
更多推荐
所有评论(0)