Docker部署MySQL服务

安装部署环境

  • Ubuntu 20.04.1 LTS
  • Docker 20.10.11
  • MySQL latest(8.0.27)

下载镜像

从仓库中拉取mysql镜像,如果没加标签的话,默认获取最新版本(latest)

$ docker pull mysql:tag
复制代码

简单启动 MySQL服务器

启动 MySQL 实例很简单:

$ docker run --name some-mysql \
-e MYSQL_ROOT_PASSWORD='my-secret-pw' \
-d mysql:tag
复制代码
  • some-mysql:分配给容器的名称
  • root:为root用户设置的密码
  • tagmysql镜像标签

挂载数据卷以及配置文件启动

查找配置文件位置

不同版本部署的 MySQL 内,可能文件路径不一致,如 /etc/mysql/my.cnf/etc/mysql/conf.d 或者 /etc/mysql/mysql.conf.d等。运行以下命令查找mysql配置文件my.cnf的位置:

$ docker run --rm mysql mysql --help | grep my.cnf
复制代码

得到结果:

                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
复制代码

意思是按照/etc/my.cnf/etc/mysql/my.cnf~/.my.cnf路径按优先排序。

依次访问上述路径:

$ docker run --rm mysql cat /etc/my.cnf
cat: /etc/my.cnf: No such file or directory

$ docker run --rm mysql cat /etc/mysql/my.cnf
# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
...
复制代码

可以得到镜像中mysql配置文件路径为/etc/mysql/my.cnf

查找数据文件位置

运行以下命令查看mysql镜像信息:

$ docker inspect mysql
复制代码

得到结果:

...
            "Volumes": {
                "/var/lib/mysql": {}
            },
...
复制代码

可以得到mysql挂载的数据文件路径为/var/lib/mysql

创建本地路径

在物理机上,创建指定数据和配置文件的挂载路径(须在docker进程有写权限的目录下,如/home/docker

$ mkdir -p /home/docker/mysql/conf && mkdir -p /home/docker/mysql/datadir
复制代码

将容器的mysql默认配置文件/etc/mysql/my.cnf拷贝出来

$ CID=`docker run -d mysql` \
&& docker cp $CID:/etc/mysql/my.cnf /home/docker/mysql/conf \
&& docker stop $CID \
&& docker rm $CID
复制代码

挂载启动MySQL

知道了mysql配置文件和数据文件位置,就可以挂载启动mysql服务了

$ docker run --name some-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /home/docker/mysql/conf/my.cnf:/etc/my.cnf \
-v /home/docker/mysql/datadir:/var/lib/mysql \
--restart=on-failure:3 \
-d mysql
复制代码
  • --name:为容器指定一个名字
  • -p:指定端口映射,格式为:主机(宿主)端口:容器端口
  • -e:设置环境变量
  • --restart=on-failure:3:是指容器在未来出现异常退出(退出码非0)的情况下循环重启3次
  • --mount:目录挂载
  • -d:后台运行容器,并返回容器 id

MySQL 命令行客户端

命令启动另一个mysql容器实例进入命令行客户端:

$ docker run -it --rm mysql mysql \
-hsome.mysql.host -usome-mysql-user -p
复制代码

查看MySQL日志

$ docker logs some-mysql
复制代码

环境变量说明

在启动mysql镜像时,可以通过在docker run命令行中传递一个或多个环境变量来调整 MySQL 实例的配置。请注意,如果您使用已经包含数据库的数据目录启动容器,则以下任何变量都不会产生任何影响:在容器启动时,任何预先存在的数据库将始终保持不变。

MYSQL_ROOT_PASSWORD

此变量是必需的,它指定将为 MySQLroot超级用户帐户设置的密码。在上面的例子中,它被设置为root

MYSQL_DATABASE

此变量是可选的,允许您指定要在映像启动时创建的数据库的名称。如果提供了用户/密码(见下文),则该用户将被授予对该数据库的超级用户访问权限(对应于GRANT ALL)。

MYSQL_USER, MYSQL_PASSWORD

这些变量是可选的,结合使用来创建新用户和设置该用户的密码。该用户将被授予对MYSQL_DATABASE变量指定的数据库的超级用户权限(见上文)。

MYSQL_ALLOW_EMPTY_PASSWORD

这是一个可选变量。设置为非空值,例如yes,以允许使用 root 用户的空白密码启动容器。

MYSQL_RANDOM_ROOT_PASSWORD

这是一个可选变量。设置为非空值,如yes,为 root 用户生成随机初始密码(使用pwgen)。生成的 root 密码将打印到控制台 ( GENERATED ROOT PASSWORD: .....)。

MYSQL_ONETIME_PASSWORD

初始化完成后,将root(不是MYSQL_USER! 中指定的用户)用户设置为过期,强制在首次登录时更改密码。任何非空值都将激活此设置。注意:此功能仅在 MySQL 5.6+ 上受支持。在 MySQL 5.5 上使用此选项将在初始化期间引发适当的错误。

MYSQL_INITDB_SKIP_TZINFO

默认情况下,入口点脚本会自动加载CONVERT_TZ()函数所需的时区数据。如果不需要,任何非空值都会禁用时区加载。

备份和恢复

创建数据库转储

启动mysql镜像使用mysqldump命令备份:

$ docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
复制代码

从转储文件中恢复数据

启动mysql镜像执行.sql文件

$ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
复制代码

Guess you like

Origin juejin.im/post/7035388660283342878