快速入门
如何使用MySQL的镜像
启动MySQL服务端 实例
docker run --name mysql-demo -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
- –name mysql-demo 实例的名字
- -e MYSQL_ROOT_PASSWORD=root root用户的密码为root
- -d 后台运行容器,运行成功后返回容器ID
- mysql:tag 镜像名称:版本 (如没有:tag 则默认为最新版本)
通过sheel查看容器日志
docker exec -it mysql-demo bash
或者
docker logs mysql-demo
使用自定义的MySQL配置文件
MySQL默认的配置文件的全路径为 /etc/mysql/my.cnf
除了该配置文件可能还有 /etc/mysql/conf.d 或 /etc/mysql/mysql.conf.d的配置文件,具体配置文件信息需要查看mysql镜像来确认。
假如你的自定义配置文件全路径为/my/custom/config-file.cnf,你可以这样启动mysql容器(注意执行这个命令启动的容器配置为自定义配置):
docker run --name mysql-demo -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
这将启动一个新容器 mysql-demo,其中 MySQL 实例使用来自 /etc/mysql/my.cnf 和 /etc/mysql/conf.d/config-file.cnf 的组合启动设置,后者的设置优先于前者.
不适用cnf文件的配置方式
许多配置项可以启动参数传递给mysqld实例。这样即便不使用cnf文件也可以自定义配置。例如,如果要将所有表的默认编码和排序规则更改为使用 UTF-8 (utf8mb4),只需运行以下命令:
docker run --name mysql-demo -e MYSQL_ROOT_PASSWORD=root -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
如果您想查看所有的配置选项,可以运行以下命令:
docker run -it --rm mysql:tag --verbose --help
实例的环境变量
启动mysql镜像时,可以通过在docker run命令行中传入一个或多个环境变量来调整MySQL实例的配置。
请注意,如果您使用已经包含数据库的数据目录启动容器,则以下任何变量都不会产生任何影响:在容器启动时,任何预先存在的数据库将始终保持不变。
MYSQL_ROOT_PASSWORD
此变量是必需的,它指定将为 MySQL 超级用户帐户设置的密码。在上面的例子中,它被设置为 root。
MYSQL_DATABASE
此变量是可选的,允许您指定要在映像启动时创建的数据库的名称。如果提供了用户/密码(见下文),那么该用户将被授予对该数据库的超级用户访问权限(对应于 GRANT ALL)。
MYSQL_USER, MYSQL_PASSWORD
这些变量是可选的,结合使用来创建新用户和设置该用户的密码。该用户将被授予对 MYSQL_DATABASE 变量指定的数据库的超级用户权限(见上文)。创建用户时需要这两个变量。
请注意,无需使用此机制来创建 root 超级用户,默认情况下会使用 MYSQL_ROOT_PASSWORD 变量指定的密码创建该用户。
MYSQL_ALLOW_EMPTY_PASSWORD
这是一个可选变量。设置为非空值,如 yes,以允许使用 root 用户的空白密码启动容器。注意:除非您真的知道自己在做什么,否则不建议将此变量设置为 yes,因为这将使您的 MySQL 实例完全不受保护,允许任何人获得完全的超级用户访问权限。
MYSQL_RANDOM_ROOT_PASSWORD
这是一个可选变量。设置为非空值,如 yes,为 root 用户生成随机初始密码(使用 pwgen)。生成的 root 密码将打印到 stdout (GENERATED ROOT PASSWORD: …)。
MYSQL_ONETIME_PASSWORD
初始化完成后,将 root(不是 MYSQL_USER 中指定的用户!)用户设置为过期,强制在首次登录时更改密码。任何非空值都将激活此设置。注意:此功能仅在 MySQL 5.6+ 上受支持。在 MySQL 5.5 上使用此选项将在初始化期间引发适当的错误。
MYSQL_INITDB_SKIP_TZINFO
默认情况下,入口点脚本会自动加载 CONVERT_TZ() 函数所需的时区数据。如果不需要,任何非空值都会禁用时区加载。
Docker安全
作为通过环境变量传递敏感信息的替代方法,可以将 _FILE 附加到先前列出的环境变量,从而使初始化脚本从容器中存在的文件中加载这些变量的值。特别是,这可用于从存储在 /run/secrets/<secret_name> 文件中的 Docker 机密加载密码。例如:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag
目前,仅支持 MYSQL_ROOT_PASSWORD、MYSQL_ROOT_HOST、MYSQL_DATABASE、MYSQL_USER 和 MYSQL_PASSWORD。
初始化一个新实例
当容器第一次启动时,将使用提供的配置变量创建和初始化具有指定名称的新数据库。此外,它将执行在 /docker-entrypoint-initdb.d 中找到的扩展名为 .sh、.sql 和 .sql.gz 的文件。文件将按字母顺序执行。您可以通过将 SQL 转储安装到该目录中并提供带有贡献数据的自定义图像来轻松填充您的 mysql 服务。默认情况下,SQL 文件将导入由 MYSQL_DATABASE 变量指定的数据库。
注意事项
数据的存储位置
有多种方式可以对Docker中MySQl的数据进行存储,推荐使用以下几种方式。
- 通过使用容器的内部卷管理将数据库文件写入物理机的磁盘,让 Docker 管理数据库数据的存储。这是默认设置,对用户来说很容易且相当透明。缺点是,很难定位数据在宿主机上的存储位置。
- 在物理机上(容器外部)创建一个数据目录,并将其挂载到从容器内部可见的目录中。这样数据库文件会放置在物理机上的已知位置。缺点是用户需要确保目录存在,例如主机系统上的目录权限和其他安全机制设置正确。
下面介绍以下简单的实现方式:
1.在物理机上创建一个合适的目录, 例如 /my/own/datadir.
2.使用以下命令启动MySQl容器。
docker run --name mysql-demo -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
增加端口映射
docker run --name mysql-demo-v /appdata/mysql-pinda/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql
命令中 -v /my/own/datadir:/var/lib/mysql 部分将底层物理主机中的 /my/own/datadir 目录挂载为容器内的 /var/lib/mysql,默认情况下 MySQL 将写入其数据文件。
在 MySQL init 完成之前没有连接
If there is no database initialized when the container starts, then a default database will be created. While this is the expected behavior, this means that it will not accept incoming connections until such initialization completes. This may cause issues when using automation tools, such as docker-compose, which start several containers simultaneously.
If the application you’re trying to connect to MySQL does not handle MySQL downtime or waiting for MySQL to start gracefully, then putting a connect-retry loop before the service starts might be necessary. For an example of such an implementation in the official images, see WordPress or Bonita.
已有数据库如何操作
如果您使用已包含数据库的数据目录(特别是 mysql 子目录)启动 mysql 容器实例,则应从运行命令行中省略 $MYSQL_ROOT_PASSWORD 变量;它在任何情况下都会被忽略,并且不会以任何方式更改预先存在的数据库。
以任意用户身份运行
如果您知道目录的权限已经适当设置(例如针对现有数据库运行,如上所述)或者您需要使用特定的 UID/GID 运行 mysqld,则可以使用 --user 调用此映像设置为任何值(root/0 除外)以实现所需的访问/配置:
$ mkdir data
$ ls -lnd data
drwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data
$ docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name mysql-demo -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
创建数据库转储
大多数普通工具都可以使用,尽管在某些情况下它们的使用可能有点复杂,以确保它们可以访问 mysqld 服务器。确保这一点的一种简单方法是使用 docker exec 并从同一容器运行该工具,类似于以下内容:
docker exec mysql-demo sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
从转储文件中恢复数据
用于恢复数据。您可以使用带有 -i 标志的 docker exec 命令,类似于以下内容:
docker exec -i mysql-demo sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
评论区