Docker 部署MySQL 服务及使用

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 不区分

关于字符集和字符序可以参考以下文章

5分钟读懂MySQL字符集设置
MySQL乱码之我见

# 查看更多可用参数
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选项时使用的就是localhostunixsocket,此时会通过/tmp/mysql.sock来通讯,但是在mysqldocker镜像中默认生成的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;
发布了27 篇原创文章 · 获赞 4 · 访问量 9694

猜你喜欢

转载自blog.csdn.net/yoshubom/article/details/100055171
今日推荐