在使用 Docker 运行 MySQL 数据库时,有时需要将数据存储到本地磁盘上以便数据持久化。本文将介绍如何在 Windows 下使用 Docker 运行 MySQL 容器,并将容器挂载到本地磁盘上,同时还能保证容器仍然可以访问挂载的磁盘。
安装 Docker
首先,需要在 Windows 上安装 Docker。可以从 Docker 官网下载 Docker Desktop for Windows,安装后启动即可。
运行 MySQL 容器
接着,需要运行 MySQL 容器。可以使用以下命令:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 -v /mnt/c/Users/yourusername/docker/mysql/data:/var/lib/mysql mysql:latest
其中,-e MYSQL_ROOT_PASSWORD
参数用于设置 MySQL 的 root 用户密码,-p 3306:3306
参数用于将容器的 3306 端口映射到主机的 3306 端口,以便从主机访问 MySQL 数据库。
-v
参数用于将主机上的目录挂载到容器中,后面的 /mnt/c/Users/yourusername/docker/mysql/data
是主机上的目录,/var/lib/mysql
是容器中的目录。
在运行上述命令之前,需要先在主机上创建目录 C:\Users\yourusername\docker\mysql\data
。其中 yourusername
是当前登录 Windows 的用户名。
解决容器无法访问挂载的磁盘
在 Windows 下挂载的磁盘是不支持 Linux 文件权限的,因此容器无法访问挂载的目录。
一种解决方案是在主机上创建一个用户组,然后将该用户组添加到容器中的 MySQL 用户组中。具体步骤如下:
创建一个用户组
在 Windows 命令行中执行以下命令,创建一个名为 docker
的用户组:
net localgroup docker /add
添加用户组
在容器中添加用户组 docker
,执行以下命令:
groupadd -g HOST_GID docker
其中,HOST_GID
应该设置为挂载磁盘所属用户组的 GID。
添加用户
在容器中添加用户,执行以下命令:
useradd -r -u HOST_UID -g docker mysql
其中,HOST_UID
应该设置为挂载磁盘所属用户的 UID。
修改权限
在容器中将挂载目录的所有者修改为用户 mysql
,执行以下命令:
chown -R mysql:mysql /var/lib/mysql
重启容器
最后,需要重启 MySQL 容器,才能使上述修改生效。执行以下命令:
docker restart mysql
示例代码
上述步骤可以封装成一个脚本。以下是一个示例脚本:
-- -------------------- ---- ------- --------- - ------ ------ ----- ---- --- -------- ---- -- -------------- --- ---------- ------ ---- ------------- -- ------- ------ -------------------- - --- --------- --- ---- --- ------ ----- ------ --------- ------ --- - ------ ----- - -- --------- - -- ------------------------------------------------------ - -- ----------------------------- - -- ------------ - -- -- --------- -- ----------- ------ -- - ------- -- -- ---- -- ------------- -- ------ ----- -- - ----- -- ----------- -------------- -- - ---- ------ -------------
其中 yourusername
是当前登录 Windows 的用户名。
总结
本文介绍了在 Windows 下使用 Docker 运行 MySQL 容器,并将容器挂载到本地磁盘上的解决方案。通过创建一个用户组,并将该用户组添加到容器中的 MySQL 用户组中,同时修改文件权限,可以解决容器无法访问挂载磁盘的问题。同时,提供了一个示例脚本,方便使用者参考。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cb77695ad90b6d0420b6cc