启动一个 MySQL 容器
学习如何启动 MySQL 容器以及 Docker 提供的各种选项。
在本章中,你将学习如何使用 Docker CLI 和 Docker Compose 启动一个 MySQL 容器。
MySQL 是一种流行的 SQL 数据库,适用于需要数据存储的应用程序开发。无论你是否曾使用过 MySQL 或数据库,本教程都将帮助你熟悉 Docker 容器的启动方式。这些概念可以应用于应用程序所需的任何依赖项。
在 Docker Hub 上查找合适的 MySQL 镜像
以下是 Docker Hub 上官方 MySQL 镜像的详细信息。
Docker 仓库提供一个或多个镜像变体,每个变体都有自己的 标签。如果发布遵循语义化版本控制规范,标签通常与应用程序的 MAJOR.MINOR.PATCH 版本号一致。
对于 MySQL,你可以选择不同的版本,例如 5.6、5.7 或 8.0:
- 如果选择具体版本(如
8.0.19),则始终安装该版本的 MySQL。 - 选择主版本和次版本(如
8.0)会安装该次版本的最新发布版,当前可能是8.0.19,未来可能变为8.0.20。 - 仅选择主版本(如
8)将安装最新的主版本。 - 选择
latest(或不指定标签)将安装最新版本,不受版本限制。
在本示例中,latest 是一个合适的选择,但通常建议使用确切版本,以确保所有开发者和生产服务器使用相同的依赖项。
📌 Docker 使得随时安装和测试数据库升级变得非常简单。
启动 MySQL 容器
连接终端后,在下方终端中输入以下命令来启动 MySQL 容器:
1docker run \ 2 -it --rm --name mysql \ 3 -p 3306:3306 \ 4 --mount "src=mysqldata,target=/var/lib/mysql" \ 5 -e MYSQL_ROOT_PASSWORD=mysecret \ 6 mysql
所有 Docker CLI 命令均以 docker 开头,后接指令(如 run)及选项。以下是上述命令的说明:
docker run从指定镜像(最后一行的mysql)创建并启动一个容器。-it选项打开交互式会话。- 使用
--rm选项可使容器在停止后自动删除。 --name用于为容器命名,此处命名为mysql。-p选项将主机端口(冒号左侧的 3306)映射到容器端口(冒号右侧的 3306),以暴露服务。你可以将暴露端口更改为任意端口,例如 3000 或 8080,此时 MySQL 将通过指定的端口访问。- 使用
--mount选项挂载数据卷。src指定卷名称,target指定挂载路径。Docker 的存储通常位于/var/lib/后跟容器名称或 ID,mysql是一个包含容器mysql数据的文件夹。 - 环境变量通过
e选项定义,变量及其值紧跟在e之后。 - 最后指定 Docker 镜像,此处为
mysql。如果本地没有该镜像,系统会自动下载。
首次运行此命令时,下载镜像、启动容器并初始化 MySQL 可能需要几分钟时间。后续启动几乎瞬间完成。当看到以下日志时,表示数据库已准备就绪:
1[System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections.
Docker 选项
docker run 提供多种选项,但你最常使用的包括:
No configuration found for ID: 3ab484597cacf137e74f4bab2496590064639149100d7eeb65457a5bcee00250
📌 如果未指定
--rm,容器停止后仍会保留。虽然可以重启,但通常并无必要。直接再次执行相同的docker run命令更为简便。
MySQL 凭据
MySQL 将用户访问凭据(如 root 用户密码)存储在内部数据库中,该数据库在 MySQL 首次启动时初始化存储空间时创建。
上述 docker run 命令将所有数据库数据存储在一个名为 mysqldata 的 Docker 卷中。该卷会在重启之间保留数据,包括你设置的第一个 root 密码。
如果你在后续启动时修改 run 命令,使用不同的密码(例如 -e MYSQL_ROOT_PASSWORD=NewSecret),该设置将被忽略。若要更改 root 密码,可通过 MySQL 客户端执行 ALTER USER 命令,或更彻底地删除 Docker 卷并重新初始化数据库。
最佳实践是创建一个权限受限的 MySQL 用户,仅授予对特定数据库的读取权限,不允许修改表结构或查看其他数据库。应用配置通常通过设置环境变量实现。
你的应用程序可以自行启动 MySQL 容器,因此使用拥有全部权限的 root 用户风险较低。然而,使用权限受限的用户始终更安全,可防止恶意或意外破坏。
本章示例为简洁起见使用 root 用户,但在开发和部署过程中应使用更安全的凭证。