启动一个 MySQL 实例:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
some-mysql 是你给容器起的名字,my-secret-pw 是设置的MySQL root用户的密码,tag 是指定你想要使用的MySQL版本的标签。请参考上面的列表查看相关标签。
使用命令行客户端连接MySQL
以下命令将启动另一个MySQL容器实例,并在原始的MySQL容器中运行MySQL命令行客户端,允许您对数据库实例执行SQL语句:
$ docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p
... some-mysql 是原始的MySQL容器的名称(连接到some-network Docker网络)。
这个镜像也可以作为非Docker或远程实例的客户端使用。
$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p
更多关于MySQL命令行客户端的信息可以在MySQL文档中找到。
docker exec命令允许你在Docker容器中运行命令。以下命令行将给你在mysql容器中的bash shell:
$ docker exec -it some-mysql bash
查看Docker容器日志:
$ docker logs some-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 some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
这将启动一个新的容器some-mysql,其中MySQL实例使用/etc/mysql/my.cnf和/etc/mysql/conf.d/config-file.cnf中的合并启动设置,后者的设置优先。
许多配置选项可以通过标志传递给mysqld。这将给您提供自定义容器的灵活性,而无需使用cnf文件。例如,如果您想将所有表的默认编码和排序规则更改为UTF-8(utf8mb4),只需运行以下命令:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -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根超级用户帐户的密码。在上面的例子中,它被设置为my-secret-pw。
这个变量是可选的,允许你在镜像启动时指定一个数据库名称。如果提供了用户/密码(参见下文),则该用户将被授予对该数据库的超级用户权限(参见上述内容)。
这些变量是可选的,用于创建新用户并设置该用户的密码。该用户将被授予对由MYSQL_DATABASE变量指定的数据库的超级用户权限。这两个变量都是创建用户所必需的。
请注意,不需要使用此机制创建根超级用户,该用户默认情况下会使用MYSQL_ROOT_PASSWORD变量指定的密码创建。
这是一个可选变量。将其设置为非空值(如yes),以允许使用空密码启动容器的root用户。注意:将此变量设置为yes并不推荐,除非你真的知道自己在做什么,因为这将使你的MySQL实例完全不受保护,允许任何人获得完全的超级用户访问权限。
这是一个可选变量。将其设置为非空值(如yes),为root用户生成随机初始密码(使用pwgen)。生成的root密码将打印到stdout(生成的根密码:.....)。
将root(而不是MYSQL_USER中指定的用户!)用户设置为过期一次,一旦初始化完成,将在首次登录时强制更改密码。任何非空值都会激活此设置。注意:此功能仅在MySQL 5.6+上受支持。在MySQL 5.5上使用此选项将在初始化过程中抛出适当的错误。
默认情况下,入口点脚本会自动加载所需的时区数据以供CONVERT_TZ()函数使用。如果不需要,任何非空值都会禁用时区加载。
作为通过环境变量传递敏感信息的一种替代方法,可以在环境变量后附加_FILE,以便在容器中从存在于/run/secrets/<secret_name>文件中的值并加载这些变量的值。例如:
$ 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容器中运行的应用程序使用的数据。我们鼓励用户熟悉可用的选项,包括:
让Docker管理数据库数据,将数据库文件写入主机系统上的磁盘,使用其自身的内部卷管理。这是默认设置,对用户来说既简单又相对透明。缺点是这些文件可能对于直接在主机系统上运行的工具和应用程序来说难以找到,即在容器之外。
在主机系统上创建一个数据目录(在容器之外),并将此目录挂载到容器内可见的目录。这将数据库文件放在主机系统上已知的位置,并使主机系统上的工具和应用程序轻松访问这些文件。缺点是需要确保目录存在,并且需要正确设置主机系统上的目录权限和其他安全机制。
Docker文档是一个很好的起点,了解不同的存储选项和变体,这里只展示上述选项中的后者的基本过程:
/my/own/datadir:$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
这个命令将主机系统上的 /my/own/datadir 目录挂载到容器内的 /var/lib/mysql,MySQL 默认会将数据文件写入该目录。
如果你知道目录的权限并已经设置好(例如,如上所述,针对现有数据库进行操作),或者你需要以特定的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 some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
大部分正常工具都可以使用,尽管在某些情况下可能会有些复杂,以确保它们可以访问mysqld服务器。为了确保这一点,可以使用docker exec命令并从同一个容器中运行该工具,类似于以下操作:
$ docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
恢复数据文件你可以使用docker exec -i 类似于以下命令:
$ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
Content type
Image
Digest
sha256:d23e9f266…
Size
131 MB
Last updated
over 2 years ago
docker pull xzeu/mysql-oracle:5.7.44-1.el7