单独为mysql开启一个docker空间代替在服务器中直接安装mysql可以避免服务器mysql版本固定带来的项目mysql版本不同的问题,而且在需要在服务器使用另一个版本的mysql时可以再建一个docker存放mysql,可以实现多个不同版本的mysql数据库共存于一个服务器中且互不影响,不过需要注意备份docker中的mysql数据到服务器中
一、基于mysql创建docker并启动
1、docker搜索mysql5.7镜像并拉取(注意mysql版本问题,下载对应版本,比如mysql:8.0)
docker search mysql:5.7
docker pull mysql:5.7
2、docker拉取mysql成功后查看docker拉取的所有镜像确保mysql镜像拉取成功
# 查看docker拉取的所有镜像
docker images
3、基于拉取的mysql镜像启动一个mysql5.7的docker容器(注意要在服务器安全组开启3306端口号)
# -p 3306:3306:端口映射,格式为主机(宿主)端口:容器端口
# --name mysql:创建的容器名称
# --restart=always:总是跟随docker启动(报错自动重启)
# --privileged=true:获取宿主机root权限
# -e MYSQL_ROOT_PASSWORD=123456:指定mysql环境变量,root用户的密码为123456
# -d mysql:latest:开启Daemon守护进程后台运行mysql容器,版本是5.7(8.0)
# 注意将docker容器中的数据库数据备份到服务器主机中,避免重启docker数据丢失(容器数据会实时备份到主机目录中,可以防止容器重启数据丢失)(1.重启mysql容器不会对主机存储的数据文件产生影响;2.重新执行下面的创建mysql容器的命令也不会对主机数据产生影响,相反主机存储的上一个mysql容器的数据文件会拷贝到新容器中的mysql中,以此实现数据的持久化):
# -v /usr/local/mysql/log:/var/log/mysql:映射日志目录,宿主机:容器
# -v /usr/local/mysql/data:/var/lib/mysql:映射数据目录,宿主机:容器
# -v /usr/local/mysql/conf:/etc/mysql:映射配置目录,宿主机:容器
# -v /etc/localtime:/etc/localtime:ro:让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。
docker run -p 3306:3306 --name mysql --privileged=true \
-v /mysqldata/mysql/log:/var/log/mysql \
-v /mysqldata/mysql/data:/var/lib/mysql \
-v /mysqldata/mysql/conf:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
4、查看docker容器是否启动成功
# 查看所有启动的docker容器
docker ps
至此mysql的docker启动成功,navicat可以通过服务器ip地址+mysql密码连接服务器上启动的mysql
二、navicat连接mysql并导入sql文件
navicat连接mysql并导入sql文件步骤:
(1)点击连接通过服务器ip地址及上面设置的mysql密码连接服务器mysql
(2)在连接成功的mysql中新建一个数据库
(3)右击新建的数据库中的表,点击运行sql文件,选择本地的sql文件并运行
至此navicat就连接好了远程的mysql并导入了sql文件,现在navicat对连接的mysql的改动都会同步到服务器中的mysql(双向的,服务器的mysql改动也会在navicat中显示)
三、测试
1、服务器进入启动mysql的docker容器
docker exec -it mysql /bin/bash
2、进入docker后进入mysql
mysql -u root -p
输入密码123456
3、测试修改mysql中的数据库的表数据
# 查看所有数据库
show databases;
# 使用xmll数据库
use xmll;
# 修改xmll数据库的user表的tel数据
update user set tel='123' where id=2;
4、刷新navicat会发现服务器mysql的修改已经同步到navicat上面了,同样的navicat上修改也会同步到服务器的mysql
node连接远程数据库
const mysql = require('mysql')
const connection = mysql.createConnection({
// 数据库ip地址
host: '',
// 用户名默认是root
user: '',
// 数据库密码
password: "",
// 端口号默认都是3306
port: "3306",
// 连接的数据库名
database: ""
})
connection.connect()
补充:避免mysql数据库被脚本批量攻击
服务器中的mysql数据库初始密码及端口很简单,很容易被攻击删库,所以最简单的预防方式就是修改mysql访问端口以及root用户名及密码
1、修改docker访问mysql端口映射(创建mysql容器)--3306变为3307访问
docker run -p 3307:3306 --name mysql --privileged=true \
-v /mysqldata/mysql/log:/var/log/mysql \
-v /mysqldata/mysql/data:/var/lib/mysql \
-v /mysqldata/mysql/conf:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
2、修改root用户名及密码
# 进入mysql容器
docker exec -it mysql /bin/bash
# 登录mysql--输入密码123456
mysql -u root -p
# 使用mysql数据库
use mysql;
# 查询当前数据库所有用户及权限
select host,user,plugin,authentication_string from mysql.user;
# 将root用户设置为所有ip可访问(远程登录)--解决1130问题
update user set Host='%' where User='root';
# 修改用户user为root,host为% 的密码为xxxx --1、解决1251问题2、防止数据库被批量攻击
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxx';
# 修改root用户名为haixtx--防止数据库被批量攻击
update user set user="haixtx" where user="root";
# 刷新数据库权限
FLUSH PRIVILEGES;
# 再次查询当前数据库所有用户及权限-查看是否修改成功
select host,user,plugin,authentication_string from mysql.user;
# 退出mysql数据库
exit;
# 退出mysql容器
exit