前言
Docker确实是方便。但每次创建Mysql后都头疼,时区问题头疼。今天就专门花时间以及总结一下如何修改。我需要的修改肯定是持久化的,所以临时性的方案就不考虑了。
基础环境
为了保证实验的严谨性,还是申明一下基础环境
- Centos7
- Docker1.13
- mysql:5.7
关于容器运行方式
- 不用docker run
- 不用docker compose
- 使用docker swarm
MySQL时区修改
方法1,挂载 /etc/localtime:/etc/localtime
这种依赖宿主机时区
compose文件
vi docker-mysql.yml mysql
version: '3'
services:
mysql57:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: xxxxxx
volumes:
- mysql:/var/lib/mysql
- mysql_cnf:/etc/mysql/conf.d
- /etc/localtime:/etc/localtime
volumes:
mysql:
mysql_cnf:
执行 docker stack deploy -c docker-mysql.yml mysql
验证
- 连接数据库执行
SELECT NOW()测试发现时间正常 - 连接数据库执行
show variables like '%time_zone%';发现默认时区CST说明正常了 docker ps找到容器id。执行docker exec -it bc75b4576a1d date发现时间正常
结论
利用挂载localtime的方法,可以从物理意义上修复MySQL的时区问题。即整个运行环境都是正确时区了。
方法1,充分性证明
- 将compose中
- /etc/localtime:/etc/localtime删除 - 重新执行一次
docker stack deploy -c docker-mysql.yml mysql - 查看时区,发现恢复成UTC时区了
方法2,TZ=Asia/Shanghai环境变量设置
compose文件
vi docker-mysql.yml mysql
version: '3'
services:
mysql57:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: xxxxxx
TZ: Asia/Shanghai
volumes:
- mysql:/var/lib/mysql
- mysql_cnf:/etc/mysql/conf.d
volumes:
mysql:
mysql_cnf:
执行 docker stack deploy -c docker-mysql.yml mysql
验证
- 连接数据库执行
SELECT NOW()测试发现时间正常 - 连接数据库执行
show variables like '%time_zone%';发现默认时区CST说明正常了 docker ps找到容器id。执行docker exec -it bc75b4576a1d date发现时间正常
结论
利用修改TZ: Asia/Shanghai的方法,可以从物理意义上修复MySQL的时区问题。即整个运行环境都是正确时区了。
方法3,修改MySQL配置文件
修改配置文件 /var/lib/docker/volumes/mysql_mysql_cnf/_data/docker.cnf
[mysqld]
skip-host-cache
skip-name-resolve
default-time_zone = '+8:00'
这里配置时区+8,按照测试流程正常。
但是需要注意的是容器的更新。最好的是删除旧容器然后更新
结论
不推荐修改配置文件,鬼知道因为系统时间是UTC会发生什么。
推荐方法2
本文详细介绍了在Docker环境下如何持久性地修改MySQL的时区,包括挂载本地时区、设置环境变量TZ以及修改MySQL配置文件三种方法,并通过docker-compose进行验证,最终推荐使用设置TZ环境变量的方法。
284

被折叠的 条评论
为什么被折叠?



