在 Docker 中使用 mysql 的一些技巧
今天我写一点在 Docker 容器中使用 MYSQL 的 tips.
要不要在生产环境使用 Docker 运行数据库这么深奥的问题,等我踩足够的坑再来写吧。
但是至少在开发和测试环境你可以用 docker 管理数据库啊。
Compose file
先贴一个我常用的 docker-compose 片段,后边进行详细的解释。这是日常使用的状态,此处省略了别的服务。
version: '2'
services:mysql:image: mysql:5.7.16ports:- ${DB_PORT}:3306environment:- TZ=Asia/Shanghaicommand: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_civolumes:- ./mysql_data:/var/lib/mysqlrestart: unless-stopped
版本
一定要锁定镜像到最小的版本,因为mysql镜像升级后需要你手动在容器中执行命令去 mysql-upgrade
,否则很久之后,你才发现有的数据已经损坏了。
实在想升级,升级步骤如下:
如果是用
docker run
启动的,那么停掉再启动个新的。如果是用docker-compose
启动的,直接改版本号 pull 镜像重新 up。在新的版本启动后执行
docker exec -it 你的容器名称或id mysql-upgrade
端口
如果想在外部通过工具访问,需要将3306端口映射到host上的一个端口,不准备外部访问的环境则不必。
一般来说开发和测试环境还是经常需要登到数据库上查看的。
时区
添加环境变量 TZ
让mysql用你的默认时区启动。
这是因为 mysql 的基础镜像是 debian, 这个环境变量可以声明 debian 的时区,然后被 mysql 继承。
字符编码
mysql 的镜像默认编码是 latin1
这可不行,在中国我们一般都用 UTF8
。
一般我们要是在主机上配置 mysql 的话,是去修改配置文件。但使用容器时映射进去一个配置文件是很复杂的。
于是我们有个简单的办法,mysql 接受很多 flag 通过启动时传入。其中就有声明服务器默认编码的。
我们的 command
命令就是给 mysql 在启动时加了两个参数。
存储
容器中有需要持久化存储的内容时就会有点麻烦。一般有两种方案,一种是映射主机的一个目录,一种是利用数据卷。
在很长时间的使用中,我总结出了这个比较方便的办法。
因为
docker-compose
有个潜规则就是大家一般都在有 compose 文件那个目录执行命令。于是我们做一个以环境名称命名的文件夹,里边是 compose 文件,
.env
文件,和各种需要持久化的文件夹。在 compose 文件中,我们映射文件夹用相对目录。
最后,这个文件夹就是一个整体,只需要把它拷贝在任何机器任何地方都可以启动这个环境。
初始化
mysql 容器在首次启动的时候,必须指定一个root密码才能启动,指定的方式是声明环境变量 MYSQL_ROOT_PASSWORD
。
一旦在指定的数据文件夹发现已经存在库的时候,这个参数就会被忽略掉。
所以我们只需要在第一次启动的时候加上,后面有了数据后都去掉就好了。
导入导出
在容器中运行的 mysql 该怎么导入导出数据或结构呢?照这么做吧:
# Backup
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql# Restore
docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE < backup.sql
就这么多吧,还有什么 Tips ,欢迎大家补充。
在 Docker 中使用 mysql 的一些技巧相关推荐
- docker连不上宿主机mysql_宿主机连接docker中的mysql
宿主机连接docker中的mysql dokcer安装mysql docker run \ --name mysql \ -v $PWD/mysql:/var/lib/mysql \ -p 3306: ...
- Docker中部署mysql后SpringBoot连接时提示表不存在(修改表名忽略大小写)
场景 Docker中部署mysql数据库: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99213563 在上面使用Docker ...
- 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用
使用nginx反向代理主主备份的两台mysql,连接时连接nginx,当其中一台myql停止后,仍然可以正常使用,如果使用k8s 会简单许多.所谓主主复制就是在主从复制的基础上掉了个头. 请博主买块糖 ...
- 如何在docker中运行MySQL实例(转载)
如何在docker中运行MySQL实例 转自:https://blog.csdn.net/siying8419/article/details/79670246 通常初学者学习docker时,不太清楚 ...
- Docker中创建MySQL容器,将宿主机目录直接挂载到目录
Docker中创建MySQL容器,将宿主机目录直接挂载到目录 1.在Docker中下载MySQL镜像 docker pull mysql:5.7.25 2.创建目录/tmp/mysql/data和/t ...
- docker 中安装 MySQL 以及使用
环境:我使用3A服务器搭建centos7 简介 这里的实现思路是,先拉取完 MySQL 镜像之后,启动 MySQL 容器,然后将 MySQL 的配置文件拉取到本地,关闭之前启动的容器,重新使用挂载的方 ...
- 连接云服务器Docker中的Mysql 详细图文操作(全)
目录 前言 1. 安装mysql 2. 开启远程连接 3. 防火墙 4. 入站规则 5. 连接mysql 前言 在云服务器上通过docker搭建的mysql 本地的navicat连接mysql的时候一 ...
- 远程连接不上docker中的mysql解决办法
远程连接不上docker中的mysql解决办法 查看docker中线程,发现mysql中行动状态 我首先删除docker中的映射(先停止,再删除): //停止运行mysql01 dcoerk stop ...
- Docker中修改MySQL的密码
前言: 在Docker中修改MySQL的密码时遇到密码修改了,但是远程连接时还是使用旧密码才能连,新密码连接不上,但mysql -uroot -p登陆时需要使用新密码才能登陆. 解决办法: 首先确 ...
最新文章
- java 中的单元测试_浅谈Java 中的单元测试
- 抢占大数据产业发展先机
- linux下的find文件查找命令与grep文件内容查找命令(转)
- python交集和补集的符号_python的交集、并集、差集
- 视频防抖 Opencv
- 零基础自学python看什么书-零基础想要学习Python编程 ,不知道看哪本书?
- linux下为php添加curl扩展的方法
- CRM reference product的UI界面
- mfc 子窗体 按钮不触发_VBA与Excel入门——用户窗体1
- android源码下载过程的一些注意事项,windows下载android源码
- 拍照区域遮盖层_真石漆与一般涂料所用外墙腻子层,有什么区别?
- C++实现二阶行列式的计算
- css给div四角添加效果
- 一款拥有漂亮外表的Typecho简洁主题-Scarfskin
- 如何将音乐导入iphone手机,怎么将歌曲导入到iphone
- 复盘49个硬币资本投资项目,8大维度解析其投资逻辑与布局
- 如何下载顺义区卫星地图高清版大图
- 【C# 教程系列第 29 篇】求1-100之内所有的质数(素数)
- 令牌桶过滤器(TBF)
- 智能家居设备安全分析技术综述
热门文章
- 用nodejs做一个svn密码修改页面
- ASP.NET MVC模型绑定int超出范围时
- 关于Linux系统下若干易混淆目录的分析
- 敏捷个人A1组第二次讨论纪要 你在事业上打算何去何从?
- 西塘游(2007-08-14)
- 揭秘新的供应链攻击:一研究员靠它成功入侵微软、苹果等 35 家科技公司
- 使用rdbtools分析redis内存使用
- Xshell 登录 AWS CentOS 出现“所选择的用户秘钥未在远程主机上注册“,最终解决办法!...
- RHEL6 Tiny Linux 的制作
- 批量生产insert 或者update语句