使用 Docker 安装 MySQL 的详细教程
Docker 是一种开源的容器化平台,可以轻松地将应用程序及其依赖项打包在一个容器中,从而在任何环境中运行。本文将详细介绍如何使用 Docker 安装 MySQL 数据库,并包括端口配置和防火墙设置。
1. 安装 Docker
在安装 MySQL 之前,确保你的系统已经安装了 Docker。如果还没有安装 Docker,请参考上一篇博客
2. 拉取 MySQL 镜像
Docker 提供了官方的 MySQL 镜像,你可以直接从 Docker Hub 拉取该镜像。
1. 拉取 MySQL 5.7 镜像
docker pull mysql:5.7
该命令从 Docker Hub 拉取 MySQL 5.7 版本的官方镜像。如果镜像已经存在,Docker 会直接使用本地镜像;如果镜像不存在,则会从 Docker Hub 下载。
2. 查看本地 Docker 镜像
docker images
此命令列出当前 Docker 主机上所有可用的镜像。你会看到包括 MySQL 镜像在内的所有镜像信息,如镜像 ID、标签(tag
)、创建时间、大小等。
3. 创建 MySQL 数据和配置目录
mkdir -p /home/service/mysql/data
mkdir -p /home/service/mysql/conf
这两条命令分别创建了用于存储 MySQL 数据和配置文件的目录:
/home/service/mysql/data
:用来存储 MySQL 数据文件,这样可以将 MySQL 数据持久化,避免容器删除后数据丢失。/home/service/mysql/conf
:用来存储 MySQL 配置文件,通常是my.cnf
文件,可以在这里调整 MySQL 的配置。
4. 进入配置文件目录并创建 my.cnf
配置文件
cd /home/service/mysql/conf
touch my.cnf
这两条命令切换到配置文件目录,并创建一个空的 my.cnf
配置文件。这个文件是 MySQL 的主配置文件,存储了 MySQL 的各种配置选项(如端口号、缓冲区大小、日志选项等)。
5. 编辑 my.cnf
配置文件(如果提示不识别此命令,请先安装 yum install my.cnf)
vim my.cnf
这条命令打开 my.cnf
配置文件进行编辑。你可以在文件中添加或修改 MySQL 的配置选项。例如,以下是一个简单的 my.cnf
配置文件示例:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
default-time_zone = '+8:00'
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
-
user=mysql
:指定 MySQL 服务以mysql
用户身份运行。这样可以避免以 root 用户运行 MySQL,从而提高系统的安全性。 -
character-set-server=utf8
:指定 MySQL 服务端的默认字符集为utf8
。这个设置确保了数据库、表和列默认使用 UTF-8 编码,支持多语言字符,避免乱码问题。 -
default_authentication_plugin=mysql_native_password
:这个设置指定使用mysql_native_password
插件作为身份验证插件。它适用于 MySQL 5.7 及以下版本,以确保兼容性。默认情况下,新创建的用户使用caching_sha2_password
插件,而这个设置强制 MySQL 使用传统的mysql_native_password
插件,确保与旧版应用兼容。 -
default-time_zone = '+8:00'
:设置 MySQL 容器的默认时区为 UTC+8:00(中国标准时间)。这个设置可以确保时间存储和显示在本地时区,避免时区不一致导致的问题。
6.创建并运行 MySQL 容器
这些命令创建了一个 MySQL 容器,设置了 root 密码,并在 MySQL 中创建了一个新的 admin
用户,赋予该用户所有权限。
6.1 Docker 运行命令:
docker run -p 3306:3306 --name mysql -v /home/service/mysql/logs:/logs -v /home/service/mysql/data:/mysql_data -e MYSQL_ROOT_PASSWORD=Wing1Q2W#E -d mysql:5.7
docker run
:启动一个新的 Docker 容器。-p 3306:3306
:将宿主机的3306
端口(MySQL 默认端口)映射到容器的3306
端口,使你可以通过宿主机访问 MySQL。--name mysql
:将容器命名为mysql
。-v /home/service/mysql/logs:/logs
:将宿主机的/home/service/mysql/logs
目录挂载到容器的/logs
目录,用于存储 MySQL 日志。-v /home/service/mysql/data:/mysql_data
:将宿主机的/home/service/mysql/data
目录挂载到容器的/mysql_data
目录,用于存储 MySQL 数据。-e MYSQL_ROOT_PASSWORD=Wing1Q2W#E
:设置 MySQL 的 root 用户密码为Wing1Q2W#E
。-d mysql:5.7
:指定容器使用mysql:5.7
镜像,并在后台运行。
6.2 进入容器命令:
docker exec -it mysql bash
docker exec -it mysql bash
:进入名为mysql
的容器并启动一个 bash shell,允许你在容器内执行命令。
6.3 MySQL 命令:
mysql -u root -p
mysql -uroot -p
:使用 root 用户登录 MySQL。系统会提示你输入密码(在之前的命令中设置为Wing1Q2W#E
)。
CREATE USER 'admin'@'%' IDENTIFIED BY 'Wing1Q2W#E';
GRANT ALL ON *.* TO 'admin'@'%';
FLUSH PRIVILEGES;
CREATE USER 'admin'@'%' IDENTIFIED BY 'Wing1Q2W#E';
:创建一个名为admin
的新用户,允许从任何主机(%
)连接,并设置其密码为Wing1Q2W#E
。admin'@'%'
设置 MySQL 远程访问属性GRANT ALL ON *.* TO 'admin'@'%';
:授予admin
用户对所有数据库和表的所有权限。FLUSH PRIVILEGES;
:刷新权限,使刚才的权限修改生效。
docker ps 查看启动状态
7. 配置防火墙
注意:公网的3306并不是真正mysql的3306而是一个外部访问端口
为了确保能够通过外部网络访问 MySQL 服务,需要在防火墙中开放 3306 端口。如果你的系统使用 firewalld
防火墙,执行以下命令来开放 MySQL 端口:
4.1 开放 3306 端口
检查防火墙状态:
sudo firewall-cmd --list-ports
或者:
sudo iptables -L -n
如果使用 firewalld
,可以这样开放 3306 端口:
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
云服务器(如阿里云、腾讯云)是否开放了安全组的 3306 端口
然后就可以愉快的使用本地工具访问服务器数据库了