修改 Docker 中 MySQL 8 容器时区的问题

    【注】MySQL 5.7 也类似,只是配置文件有所改变,在文章中会详细说明。

    虽然在正式环境中不推荐使用 MySQL 容器来存储数据,但是在内网的开发环境中还是可以使用的,但是 MySQL 容器默认的不是中国时区,而是世界标准时间(UTC),所以在国内使用的话需要配置一下,否则会早8个小时,可以通过下面方法检查一下:

    查看数据库当前时间:

    SELECT NOW()
    
    NOW
    2020-12-08 06:27:46

    查看数据库当前时区:

    SHOW VARIABLES LIKE '%time_zone%';
    Variable_nameValue
    system_time_zoneUTC
    time_zoneSYSTEM

    说明:

    • 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' ,都是一样的效果。

    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 进入容器,并在容器内执行命令

    【注】最佳实践

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注