资讯专栏INFORMATION COLUMN

在 Docker 中使用 mysql 的一些技巧

617035918 / 1948人阅读

摘要:今天我写一点在容器中使用的要不要在生产环境使用运行数据库这么深奥的问题,等我踩足够的坑再来写吧。这是日常使用的状态,此处省略了别的服务。初始化容器在首次启动的时候,必须指定一个密码才能启动,指定的方式是声明环境变量。

今天我写一点在 Docker 容器中使用 MYSQL 的 tips.
要不要在生产环境使用 Docker 运行数据库这么深奥的问题,等我踩足够的坑再来写吧。
但是至少在开发和测试环境你可以用 docker 管理数据库啊。

Compose file

先贴一个我常用的 docker-compose 片段,后边进行详细的解释。这是日常使用的状态,此处省略了别的服务。

version: "2"
services:
    mysql:
        image: mysql:5.7.16
        ports:
        - ${DB_PORT}:3306
        environment:
        - TZ=Asia/Shanghai
        command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        volumes:
        - ./mysql_data:/var/lib/mysql
        restart: 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 ,欢迎大家补充。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26860.html

相关文章

  • docker】小技巧宿主机器上直接查看docker容器进程

    摘要:最近看了这篇文章,了解到容器内的一个进程对应于宿主机器上的一个进程。在宿主机器上的进程拥有者和在容器内的进程拥有者都是,同理,我们已经验证了第二点。 最近看了这篇文章:Understanding how uid and gid work in Docker containers,了解到: docker容器内的一个进程对应于宿主机器上的一个进程。 容器内的进程,与相对应的宿主进程,由...

    nanfeiyan 评论0 收藏0
  • 数人云工程师手记 | 双剑合璧,分布式部署两步走

    摘要:今天小数给大家带来的是数人云工程师金烨的分享,有关于自动快速部署服务相关组件的一些实践。当与相遇,双剑合璧,一切变得如此简单有趣。通过将服务注册到来做健康检查。 今天小数给大家带来的是数人云工程师金烨的分享,有关于自动快速部署DCOS服务相关组件的一些实践。当Ansible与Docker相遇,双剑合璧,一切变得如此简单有趣。 本次分享将包括以下内容: 云平台部署使用的服务、组件 Do...

    Jonathan Shieber 评论0 收藏0
  • 如何编写最佳Dockerfile

    摘要:将安装与模块安装放在一起的话,则每次修改源代码,都需要重新安装,这显然不合适。使用设置镜像元数据使用指令,可以为镜像设置元数据,例如镜像创建者或者镜像说明。自从年双十一正式上线,累计处理了亿错误事件,付费客户有金山软件百姓网等众多品牌企业。 译者按: Dockerfile 的语法非常简单,然而如何加快镜像构建速度,如何减少 Docker 镜像的大小却不是那么直观,需要积累实践经验。这篇...

    Sike 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<