一、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
挂载外部配置和数据的容器就创建好了!
三、开启外部链接配置
①、防火墙设置
如使用的阿里云的服务器,可以不设置防火墙的端口。因为阿里云有安全组,可以关闭防火墙,直接开启安全组中的端口即可
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表。