使用 Docker 运行 MySQL
本文档将介绍如何使用 Docker 运行不同版本的 MySQL 容器,包括 MySQL 5.7 和 MySQL 8.x。我们将涵盖基本的运行命令、目录映射配置以及常见问题的解决方法。
MySQL 5.7
1.1 使用 Docker 运行 MySQL 5.7
运行以下命令以启动 MySQL 5.7 容器:
docker run --restart=always -d --name mysql-5.7 --hostname mysql \
-p 3306:3306 \
-e 'MYSQL_ROOT_PASSWORD=robot_123456#' \
-e 'MYSQL_ROOT_HOST=%' \
-e 'MYSQL_DATABASE=robot' \
mysql/mysql-server:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--lower_case_table_names=1
1.2 目录映射配置
为了持久化数据,可以将宿主机的目录映射到容器的 /var/lib/mysql
目录。以下是添加目录映射后的运行命令:
mkdir -p /opt/docker/mysql_5.7/data
docker run --restart=always -d --name mysql-5.7 --hostname mysql \
-p 3306:3306 \
-e 'MYSQL_ROOT_PASSWORD=robot_123456#' \
-e 'MYSQL_ROOT_HOST=%' \
-e 'MYSQL_DATABASE=robot' \
-v /opt/docker/mysql_5.7/data:/var/lib/mysql \
mysql/mysql-server:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--lower_case_table_names=1
注意:如果在添加目录映射后遇到权限错误,如 Permission denied
,请确保宿主机目录的权限和所有者与容器内的 MySQL 用户匹配。可以使用以下命令调整权限:
chown -R 999:999 /opt/docker/mysql_5.7/data
其中 999
是 MySQL 在容器中的默认用户和组 ID。
1.3 连接 MySQL
使用以下命令连接到运行中的 MySQL 容器:
mysql -uroot -p"robot_123456#" -h127.0.0.1 -P3306
MySQL 8.x
2.1 使用 mysql-server:8.0.32 运行
首先拉取指定版本的 MySQL 镜像:
docker pull mysql/mysql-server:8.0.32
然后运行容器:
docker run --restart=always -d --name mysql_8_0_32 --hostname mysql \
-p 3306:3306 \
-e 'MYSQL_ROOT_PASSWORD=robot_123456#' \
-e 'MYSQL_ROOT_HOST=%' \
-e 'MYSQL_DATABASE=robot' \
mysql/mysql-server:8.0.32 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--lower_case_table_names=1
2.3 目录映射配置
为了持久化数据并映射数据目录,执行以下步骤:
创建宿主机目录:
mkdir -p /opt/docker/mysql_8_0_16/data
运行容器并映射数据目录:
3.2 映射数据目录
docker run --restart=always -d --name mysql_8_0_32 --hostname mysql \
-p 3306:3306 \
-e 'MYSQL_ROOT_PASSWORD=robot_123456#' \
-e 'MYSQL_ROOT_HOST=%' \
-e 'MYSQL_DATABASE=robot' \
-v /opt/docker/mysql_8_0_32/data:/var/lib/mysql \
mysql/mysql-server:8.0.32 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--lower_case_table_names=1
注意:避免在生产环境中使用 --privileged
参数,因为这会赋予容器过多的权限,可能带来安全风险。
2.3 连接 MySQL
使用以下命令连接到运行中的 MySQL 容器:
mysql -uroot -p"robot_123456#" -h127.0.0.1 -P3306
注意事项
3.1 关于 --privileged
参数
在某些情况下,用户可能会尝试使用 --privileged
参数来解决权限问题。然而,在生产环境中不推荐使用 --privileged
,因为它会赋予容器几乎所有宿主机上的权限,增加了系统被攻击的风险。
3.2 解决权限问题
如果在映射数据目录时遇到权限问题,可以按照以下步骤操作:
确认宿主机目录存在并设置正确的所有者:
mkdir -p /opt/docker/mysql_data chown -R 999:999 /opt/docker/mysql_data
其中
999
是 MySQL 在容器中的默认用户和组 ID。重新运行容器,映射数据目录:
docker run --restart=always -d --name mysql_custom --hostname mysql \ -p 3306:3306 \ -e 'MYSQL_ROOT_PASSWORD=robot_123456#' \ -e 'MYSQL_ROOT_HOST=%' \ -e 'MYSQL_DATABASE=robot' \ -v /opt/docker/mysql_data:/var/lib/mysql \ mysql/mysql-server:8.0.32 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci \ --lower_case_table_names=1
通过以上步骤,您可以在 Docker 中成功运行 MySQL 容器,并根据需要配置数据目录映射。请务必注意权限设置和安全配置,以确保数据库的稳定与安全。