一、docker获取MySQL5.7镜像并运行容器

获取指定的镜像MySQL5.7:

docker pull mysql:5.7

 

查看镜像:

docker images

 

 

 

运行镜像下载的镜像构建MySQL容器:

docker run --name mysql5.7 -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql:5.7
 
创建成功,查看一下运行状态:
docker ps

 

 

 运行成功...(^-^)V

 

二、挂载外部配置和数据

运行过程中,MySQL的数据和配置文件一般不会定义在容器内部,防止容器或docker的问题导致数据和配置的丢失,所以要把配置和数据放在外部

进入刚才运行的容器:

docker exec -it mysql5.7 /bin/bash

 

 

 

查看配置文件my.cnf:

cat /etc/mysql/my.cnf

 

 

 

 查看配置文件mysqld.cnf:

cat /etc/mysql/mysql.conf.d/mysqld.cnf

 

 

 

①、把输出的内容复制一下,我们在本地先建一个同名文件,把内容粘贴进去;

②、也可以直接从docker中把文件下载到本地

先进入你的目标文件夹:

/root/mydata/mysql/conf

再通过命令:

docker container cp ae3bf138ce0f:/etc/mysql/ .

注意那个点.

 

 

 再将配置文件从下载的文件夹中取出并放入conf文件夹中:

cp mysqld.cnf /root/mydata/mysql/conf

 

 

 

下一步停止并删除mysql5.7容器,后面挂载了外部数据的时候重新创建。

docker stop mysql5.7
docker rm mysql5.7

 

执行下面的命令创建容器:

docker run --name mysql5.7 --restart always --privileged=true -p 3306:3306 -v /root/mydata/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /root/mydata/mysql/data:/var/lib/mysql -e MYSQL_USER="yourname" -e MYSQL_PASSWORD="yourpassword" -e MYSQL_ROOT_PASSWORD="rootpassword" -d mysql:5.7
–restart always:开机启动
–privileged=true:提升容器内权限
-v /opt/mysql/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf:映射配置文件
-v /opt/mysql/data:/var/lib/mysql:映射数据目录
-e MYSQL_USER=”fengwei”:添加用户fengwei
-e MYSQL_PASSWORD=”pwd123”:设置fengwei的密码伟pwd123
-e MYSQL_ROOT_PASSWORD=”rootpwd123”:设置root的密码伟rootpwd123
特别说明:如果没有添加--privileged=true参数,容器创建后不能正常启动,查看日志发现有权限的错误。

 挂载外部配置和数据的容器就创建好了!

三、开启外部链接配置

①、防火墙设置

如使用的阿里云的服务器,可以不设置防火墙的端口。因为阿里云有安全组,可以关闭防火墙,直接开启安全组中的端口即可

CentOS7防火墙开启与关闭以及开放6379,3306,80等端口

CentOS7用firewall防火墙替代了原来的iptables,所以我们应该使用firewall的一些命令。

1.关闭防火墙

systemctl stop firewalld.service            #停止firewall
systemctl disable firewalld.service         #禁止firewall开机启动

2.开启某个端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=6379/tcp --permanent

命令含义

–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效

比如不拦截redis的6379端口

3.重启防火墙

firewall-cmd --reload

4.其他常用命令:

firewall-cmd --state                          ##查看防火墙状态,是否是running
firewall-cmd --reload                          ##重新载入配置,比如添加规则之后,需要执行此命令
firewall-cmd --get-zones                      ##列出支持的zone
firewall-cmd --get-services                    ##列出支持的服务,在列表中的服务是放行的
firewall-cmd --query-service ftp              ##查看ftp服务是否支持,返回yes或者no
firewall-cmd --add-service=ftp                ##临时开放ftp服务
firewall-cmd --add-service=ftp --permanent    ##永久开放ftp服务
firewall-cmd --remove-service=ftp --permanent  ##永久移除ftp服务
firewall-cmd --add-port=80/tcp --permanent    ##永久添加80端口 
iptables -L -n                                ##查看规则,这个命令是和iptables的相同的
man firewall-cmd                              ##查看帮助

更多命令,使用 firewall-cmd --help 查看帮助文件

如果有安全组,则可以关闭防火墙

systemctl stop firewalld.service

②、添加安全组(是云服务器需要做)

 

 

 ③、开放MySQL的外部访问权限(否者外部无法连接)

进入容器:

docker exec -it mysql5.7 /bin/bash

 

 

 

登录MySQL回车 输入密码 rootpassword:

mysql -uroot -p 

 

 

修改 root 远程连接权限:

alter user 'root'@'%' identified with mysql_native_password by 'rootpassword';

 

5.测试mysqlworkbanch连接 别的工具也可以

 

二、添加数据库: 

先使用 root 用户添加数据库:

-- 进入sql服务后首先查看有哪些数据库
show databases;

-- 若没有新建一个
CREATE DATABASE database_test;

-- 使用数据库
use database_test;

新建表并使用查看

-- 新建表:
CREATE TABLE table_test(name char(20),author char(20));
CREATE TABLE table_test_1(name char(20),author char(20));

-- 查看表的内容:SELECT * FROM xxx;
SELECT * FROM table_test;

-- 插入内容到表:
INSERT INTO table_test VALUES('java','harry');
INSERT INTO table_test VALUES('python','houder');

-- 再查看
SELECT * FROM table_test;

 

删除数据库命令:

drop database database_test; 

 

 

三、添加非 root 级别用户:

1.查看用户

use mysql;
select * from user;

 

 

 

效果如上图,最后用数据库软件,因为在linux下界面看不清效果,太乱了。

从上图可以看到,会列出数据库所有的用户及权限

2.创建用户

CREATE USER  'user_name'@'host'  IDENTIFIED BY  'password';

user_name:要创建用户的名字。

host:表示要这个新创建的用户允许从哪台机登陆,如果只允许从本机登陆,则 填 ‘localhost’ ,如果允许从远程登陆,则填 ‘%’

password:新创建用户的登陆数据库密码,如果没密码可以不写。

 

举例:我用以下命令创建新用户 user_test ,并允许外部连接,密码使用 password_test ,再用 select * from user;查看用户列表:

CREATE USER  'user_test'@'%'  IDENTIFIED BY  'password_test';

 

 

 

可以看出 有 user_test 用户了。但是可以看到 user_test 的权限很多都是 N,表示没有权限,因为还要为用户授予权限。

 3.授权用户

普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利

命令: 

GRANT privileges ON  databasename.tablename  TO  'username'@'host';

privileges:表示要授予什么权力,例如可以有 select , insert ,delete,update ,create,drop,alter 等,如果要授予全部权力,则填 ALL

databasename.tablename:表示用户的权限能用在哪个库的哪个表中,如果想要用户的权限很作用于所有的数据库所有的表,则填 *.*,*是一个通配符,表示全部。

’username‘@‘host’:表示授权给哪个用户。

例如:

执行该语句,给用户 user_test 授权,让user_test能给 database_test 库中的 table_test 表 授予 insert 和 select 和 update 和 delete权限。

GRANT  select,insert , update , delete  ON  database_test.table_test  TO 'user_test'@'%';

或者:

给用户 user_test 授权,让 user_test 能给所有库所有表实行所有的权力(强烈不建议)。

GRANT  ALL  ON  *.*  TO  'user_test'@'%';

或者:

给用户 user_test 授权,让user_test能给 database_test 库中的所有表 授予insert 和 select 和 update 和 delete权限。

GRANT  select,insert,update,delete  ON  database_test.*  TO 'user_test'@'%';

效果:

使用 user_test 账号连接数据库,只能查看到 database_test 数据库下的 table_test 数据表,table_test_1 数据表无法查看

该用户有该表的增删改查权限

grant 数据库开发人员,创建表、索引、视图、存储过程、函数等权限

-- grant 创建、修改、删除 MySQL 数据表结构权限。

grant create on database_test.* to 'user_test'@'%';

grant alter on database_test.* to 'user_test'@'%';

grant drop on database_test.* to 'user_test'@'%'; 
 
-- grant 操作 MySQL 外键权限:

grant references on database_test.* to 'user_test'@'%'; 
 

-- grant 操作 MySQL 临时表权限:

grant create temporary tables on database_test.* to 'user_test'@'%'; 

-- grant 操作 MySQL 索引权限:

grant index on database_test.* to 'user_test'@'%'; 
 
-- grant 操作 MySQL 视图、查看视图源代码权限:

grant create view on database_test.* to 'user_test'@'%';

grant show view on database_test.* to 'user_test'@'%'; 
 
--grant 操作 MySQL 存储过程、函数权限:

grant create routine on database_test.* to 'user_test'@'%'; -- now, can show procedure status 

grant alter routine on database_test.* to 'user_test'@'%'; -- now, you can drop a procedure 

grant execute on database_test.* to 'user_test'@'%'; 

grant DBA 管理 MySQL 中所有数据库的权限:

grant all on *.* to 'user_test'@'localhost' 

 

all:表示全部权限,包括select,update,drop.....

*:第一个星号代表全部数据库,第二个星号代表全部的数据表

user_test:是要授权的用户

localhost:代表只允许本地连接,不允许外部连接

这种有全部权限的用户不建议外部连接

 

MySQL grant 权限,分别可以作用在多个层次上

-- 这些都是上面公式的变形了


-- grant 作用在整个 MySQL 服务器上:

grant select on *.* to 'user_test'@'%'; -- 'user_test' 可以查询 MySQL 中所有数据库中的表。 

grant all on *.* to 'user_test'@'%'; -- 'user_test' 可以管理 MySQL 中的所有数据库 
 

-- grant 作用在单个数据库上:

grant select on database_test.* to 'user_test'@'%'; -- 'user_test' 可以查询 database_test 中的表。
 

-- grant 作用在单个数据表上:

grant select, insert, update, delete on database_test.table_test to 'user_test'@'%'; 


-- 这里在给一个用户授权多张表时,可以多次执行以上语句。例如:

grant select(user_id,username) on database_test.table_test to 'database_test'@'%' identified by 'password_test';

grant select on database_test.table_test to 'database_test'@'%' identified by 'password_test'; 
 

-- grant 作用在表中的列上:

grant select(name, author) on database_test.table_test to 'user_test'@'%'; 


-- grant 作用在存储过程、函数上: 

grant execute on procedure database_test.pr_add to 'user_test'@'%' 

grant execute on function database_test.fn_add to 'user_test'@'%' 

 

查看 MySQL 用户权限

-- 查看当前用户(自己)权限:

show grants; 
 

-- 查看其他 MySQL 用户权限:

show grants for 'user_test'@'%'; 

 

撤销已经赋予给 MySQL 用户权限的权限。

revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

grant all on *.* to 'user_test'@'%';

revoke all on *.* from 'user_test'@'%'; 

注意 on 之后的条件很重要,赋权时用的什么,回收权限也要和这个一致

例如:

GRANT  select,insert  ON  *.*  TO 'user_test'@'%';
REVOKE  insert ON   database_test.table_test  from  'user_test'@'%'; -- 回收不了权限,提示错误
REVOKE  insert ON   *.*  from  'user_test'@'%';

 

 

4.设置与更改用户密码

SET  PASSWORD  FOR  'username'@'host' = PASSWORD('newpassword');

如果是设置用户的密码:

如:

SET  PASSWORD  FOR  'user_test'@'host' = PASSWORD('newpassword_test');

 

5.删除用户

命令:

DROP  USER 'user_name'@'host'; 

例:

使用 root 账号登录,执行命令删除用户 user_test ;

DROP USER 'user_test'@'%';

 

6.撤销用户权限:

命令:

REVOKE privileges ON database.tablename  FROM  'username'@'host';

 

例如: 

REVOKE  SELECT ON  *.*  FROM  'user_test'@'%'

 

注意:

GRANT  select,insert  ON  *.*  TO 'user_test'@'%';
REVOKE  insert ON   database_test.table_test  from  'user_test'@'%'; -- 回收不了权限,提示错误
REVOKE  insert ON   *.*  from  'user_test'@'%';

 

若授予权利是这样写: 

GRANT  select,insert  ON  *.*  TO 'user_test'@'%';

则用

REVOKE  insert ON   database_test.table_test  from  'user_test'@'%'; 

是不能撤销用户 user_test  对 database_test.table_test 中的 insert 权利的。


反过来:

若授予权利是这样写: 

grant insert on database_test.table_test to 'user_test'@'%';

则用

grant insert on *.* to 'user_test'@'%';

也是不能用来撤销用户 user_test 对 database_test 库的 table_test 表的 insert 权利的

 

补充:

mysql授权表共有5个表:user、db、host、tables_priv和columns_priv。

授权表的内容有如下用途:
user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

db表
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。

tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。

columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列

  

总结:(理解原理)

  使用grant授权实质是在mysql数据库的user表中增加一列,收回权限实质是从表中删除一列。所以授权也可以替换为删除表数据来代替,授权收权实质是操作mysql的user表。

 

posted on 2021-03-10 14:12  幂次方  阅读(985)  评论(0)    收藏  举报