今天我写一点在 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 的一些技巧相关推荐

  1. docker连不上宿主机mysql_宿主机连接docker中的mysql

    宿主机连接docker中的mysql dokcer安装mysql docker run \ --name mysql \ -v $PWD/mysql:/var/lib/mysql \ -p 3306: ...

  2. Docker中部署mysql后SpringBoot连接时提示表不存在(修改表名忽略大小写)

    场景 Docker中部署mysql数据库: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99213563 在上面使用Docker ...

  3. 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用

    使用nginx反向代理主主备份的两台mysql,连接时连接nginx,当其中一台myql停止后,仍然可以正常使用,如果使用k8s 会简单许多.所谓主主复制就是在主从复制的基础上掉了个头. 请博主买块糖 ...

  4. 如何在docker中运行MySQL实例(转载)

    如何在docker中运行MySQL实例 转自:https://blog.csdn.net/siying8419/article/details/79670246 通常初学者学习docker时,不太清楚 ...

  5. Docker中创建MySQL容器,将宿主机目录直接挂载到目录

    Docker中创建MySQL容器,将宿主机目录直接挂载到目录 1.在Docker中下载MySQL镜像 docker pull mysql:5.7.25 2.创建目录/tmp/mysql/data和/t ...

  6. docker 中安装 MySQL 以及使用

    环境:我使用3A服务器搭建centos7 简介 这里的实现思路是,先拉取完 MySQL 镜像之后,启动 MySQL 容器,然后将 MySQL 的配置文件拉取到本地,关闭之前启动的容器,重新使用挂载的方 ...

  7. 连接云服务器Docker中的Mysql 详细图文操作(全)

    目录 前言 1. 安装mysql 2. 开启远程连接 3. 防火墙 4. 入站规则 5. 连接mysql 前言 在云服务器上通过docker搭建的mysql 本地的navicat连接mysql的时候一 ...

  8. 远程连接不上docker中的mysql解决办法

    远程连接不上docker中的mysql解决办法 查看docker中线程,发现mysql中行动状态 我首先删除docker中的映射(先停止,再删除): //停止运行mysql01 dcoerk stop ...

  9. Docker中修改MySQL的密码

    前言: ​ 在Docker中修改MySQL的密码时遇到密码修改了,但是远程连接时还是使用旧密码才能连,新密码连接不上,但mysql -uroot -p登陆时需要使用新密码才能登陆. 解决办法: 首先确 ...

最新文章

  1. java 中的单元测试_浅谈Java 中的单元测试
  2. 抢占大数据产业发展先机
  3. linux下的find文件查找命令与grep文件内容查找命令(转)
  4. python交集和补集的符号_python的交集、并集、差集
  5. 视频防抖 Opencv
  6. 零基础自学python看什么书-零基础想要学习Python编程 ,不知道看哪本书?
  7. linux下为php添加curl扩展的方法
  8. CRM reference product的UI界面
  9. mfc 子窗体 按钮不触发_VBA与Excel入门——用户窗体1
  10. android源码下载过程的一些注意事项,windows下载android源码
  11. 拍照区域遮盖层_真石漆与一般涂料所用外墙腻子层,有什么区别?
  12. C++实现二阶行列式的计算
  13. css给div四角添加效果
  14. 一款拥有漂亮外表的Typecho简洁主题-Scarfskin
  15. 如何将音乐导入iphone手机,怎么将歌曲导入到iphone
  16. 复盘49个硬币资本投资项目,8大维度解析其投资逻辑与布局
  17. 如何下载顺义区卫星地图高清版大图
  18. 【C# 教程系列第 29 篇】求1-100之内所有的质数(素数)
  19. 令牌桶过滤器(TBF)
  20. 智能家居设备安全分析技术综述

热门文章

  1. 用nodejs做一个svn密码修改页面
  2. ASP.NET MVC模型绑定int超出范围时
  3. 关于Linux系统下若干易混淆目录的分析
  4. 敏捷个人A1组第二次讨论纪要 你在事业上打算何去何从?
  5. 西塘游(2007-08-14)
  6. 揭秘新的供应链攻击:一研究员靠它成功入侵微软、苹果等 35 家科技公司
  7. 使用rdbtools分析redis内存使用
  8. Xshell 登录 AWS CentOS 出现“所选择的用户秘钥未在远程主机上注册“,最终解决办法!...
  9. RHEL6 Tiny Linux 的制作
  10. 批量生产insert 或者update语句