Docker 部署MySQL 服务及使用
前言
最近想用MySQL
做点实验,随便再熟悉熟悉Docker
的用法。
参考
https://hub.docker.com/_/mysql
准备工作
# 创建相应目录
mkdir -p /tmp/mysql/data # 用于保存数据文件(持久化)
mkdir -p /tmp/mysql/custom # 用于保存配置文件(方式2)
# 创建配置文件1
cat > /tmp/mysql/my.cnf << EOF
[mysqld]
character-set-server=utf8
lower_case_table_names=1
[client]
default-character-set=utf8
EOF
# 创建配置文件2
cat > /tmp/mysql/custom/mycustom.cnf << EOF
[mysqld]
character-set-server=utf8
lower_case_table_names=1
[client]
default-character-set=utf8
EOF
默认方式启动MySQL
# 使用之前创建的配置文件1
docker run -d -e MYSQL_ROOT_PASSWORD=root \
-v /tmp/mysql/data:/var/lib/mysql \
-p 3306:3306 --name mysql mysql:5.6
参数解释
参数 | 说明 |
---|---|
-d | 容器后台运行。 |
-e | 设置环境变量 |
-v | 挂载宿主机文件或文件夹到容器,用于数据持久化。 |
-p | 映射端口到容器。 |
-name | 设置容器名称。 |
用配置文件启动MySQL
两种方式二选一即可
映射宿主机配置文件到容器
# 使用之前创建的配置文件1
docker run -d -e MYSQL_ROOT_PASSWORD=root \
-v /tmp/mysql/my.cnf:/etc/mysql/my.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-p 3306:3306 --name mysql mysql:5.6
挂载配置文件目录到容器
# 使用之前创建的配置文件2
docker run -d -e MYSQL_ROOT_PASSWORD=root \
-v /tmp/mysql/custom:/etc/mysql/conf.d \
-v /tmp/mysql/data:/var/lib/mysql \
-p 3306:3306 --name mysql mysql:5.6
使用参数启动MySQL
# 只用参数不使用配置文件
docker run -d -e MYSQL_ROOT_PASSWORD=root \
-v /tmp/mysql/data:/var/lib/mysql \
-p 3306:3306 --name mysql \
mysql:5.6 --character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--lower_case_table_names=1
参数解释
参数 | 说明 |
---|---|
–character-set-server | 服务器字符集 |
–collation-server | 服务器字符序 |
–lower_case_table_names | MySQL 是否区分表名大小写,0 区分,1 不区分 |
关于字符集和字符序可以参考以下文章
# 查看更多可用参数
docker run -it --rm mysql:5.6 --verbose --help
# --rm 表示容器停止后会自动删除
连接MySQL
# 以mysql 命令行工具为例
mysql --protocol=tcp -u root -p # 输入启动服务时用环境变量设置的密码
# 或者
mysql -h 127.0.0.1 -u root -p # 输入启动服务时用环境变量设置的密码
出现mysql>
后输入\s
,默认的启动方式和配置过的对比一下,例如字符集是utf8
还是是默认的latin1
,就知道配置是否起作用了。?
疑难排错
如果不指定连接的协议为TCP
或指定的主机-h
不是服务器的IP
mysql -u root -p
连接会报以下错误
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
原因参考这里,以下是根据论坛帖子改编的内容:
MySQL
使用Unix Socket
或者TCP
来连接数据库进行通讯,默认不加-h
选项时使用的就是localhost
即unixsocket
,此时会通过/tmp/mysql.sock
来通讯,但是在mysql
的docker
镜像中默认生成的socket
文件是在容器内的/var/run/mysqld/mysqld.sock
,且该套接字文件无法从容器里引出来,不能使用同一个套接字文件客户端和服务器端就无法通信,所以建议使用TCP
协议的连接方式。
关于套接字文件可参考Linux 文件类型全解析。
用户设置
新建用户
使用root
创建test
用户,密码是1234
。
mysql -h 127.0.0.1 -u root -p
CREATE USER "test"@"localhost" IDENTIFIED BY "1234"; # 本地登录
CREATE USER "test"@"%" IDENTIFIED BY "1234"; # 远程登录
quit
mysql -h 127.0.0.1 -u test -p # 测试是否创建成功
如果创建用户报错
ERROR 1396 (HY000): Operation CREATE USER failed for 'test'@'localhost'
查询一下mysql
数据库中user
表里是否已存在该用户
select user, host from mysql.user;
已存在的用户需要先删除用户再创建。
授权用户
-
a. 授权格式:
grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"
; -
b. 登录
MySQL
,这里以root
身份登录:
mysql --protocol=tcp -u root -p
- c. 为用户创建一个数据库
testDB
:
# 使用默认配置创建数据库
create database testDB;
# 指定编码创建数据库
create database testDB default charset utf8 collate utf8_general_ci;
- d. 授权
test
用户拥有testDB
数据库的所有权限:
grant all privileges on testDB.* to "test"@"localhost"; # root 用户授权不需要密码
grant all privileges on testDB.* to "test"@"localhost" identified by "1234";
flush privileges; # 刷新系统权限表
- e. 指定部分权限给用户:
grant select,update on testDB.* to "test"@"localhost" identified by "1234";
flush privileges; # 刷新系统权限表
- f. 授权
test
用户拥有所有数据库的某些权限:
# "%" 表示对所有非本地主机授权,不包括localhost
grant select,delete,update,create,drop on . to test@"%" identified by "1234";
修改用户
修改用户密码
update mysql.user set authentication_string=password("新密码") where User="test" and Host="localhost";
flush privileges;
删除用户
方式一
Delete FROM mysql.user Where User="test" and Host="localhost";
flush privileges;
drop database testDB; # 如想保留数据库可省略这一步
方式二
drop user 用户名@'%';
drop user 用户名@ localhost;