Skip to content

使用 Docker 运行 MySQL ​

本文档将介绍如何使用 Docker 运行不同版本的 MySQL 容器,包括 MySQL 5.7 和 MySQL 8.x。我们将涵盖基本的运行命令、目录映射配置以及常见问题的解决方法。


MySQL 5.7 ​

1.1 使用 Docker 运行 MySQL 5.7 ​

运行以下命令以启动 MySQL 5.7 容器:

bash
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 目录。以下是添加目录映射后的运行命令:

bash
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 用户匹配。可以使用以下命令调整权限:

bash
chown -R 999:999 /opt/docker/mysql_5.7/data

其中 999 是 MySQL 在容器中的默认用户和组 ID。

1.3 连接 MySQL ​

使用以下命令连接到运行中的 MySQL 容器:

bash
mysql -uroot -p"robot_123456#" -h127.0.0.1 -P3306

MySQL 8.x ​

2.1 使用 mysql-server:8.0.32 运行 ​

首先拉取指定版本的 MySQL 镜像:

bash
docker pull mysql/mysql-server:8.0.32

然后运行容器:

bash
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 目录映射配置 ​

为了持久化数据并映射数据目录,执行以下步骤:

  1. 创建宿主机目录:

    bash
    mkdir -p /opt/docker/mysql_8_0_16/data
  2. 运行容器并映射数据目录:

    bash

3.2 映射数据目录 ​

bash
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 容器:

bash
mysql -uroot -p"robot_123456#" -h127.0.0.1 -P3306

注意事项 ​

3.1 关于 --privileged 参数 ​

在某些情况下,用户可能会尝试使用 --privileged 参数来解决权限问题。然而,在生产环境中不推荐使用 --privileged,因为它会赋予容器几乎所有宿主机上的权限,增加了系统被攻击的风险。

3.2 解决权限问题 ​

如果在映射数据目录时遇到权限问题,可以按照以下步骤操作:

  1. 确认宿主机目录存在并设置正确的所有者:

    bash
    mkdir -p /opt/docker/mysql_data
    chown -R 999:999 /opt/docker/mysql_data

    其中 999 是 MySQL 在容器中的默认用户和组 ID。

  2. 重新运行容器,映射数据目录:

    bash
    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 容器,并根据需要配置数据目录映射。请务必注意权限设置和安全配置,以确保数据库的稳定与安全。

MIT Licensed