用Docker快速搭建Mysql多实例服务,并进行数据卷分离

在centos 里面编译安装MySQL多实例,编译时间太长,配置多实例也费尽,如果不是专门学习MySQL,而只是使用MySQL服务,使用docker 一条命令瞬间完成一个多实例,方便快捷,而且数据卷分离可以在docker容器外保存数据。
运行:
docker run -d –name myMysql2 -v ~/data/mysql2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 mysql
你就可以本机ip+3308端口访问MySQL,数据把存在本机指定的目录,本例为 ~/data/mysql2,root密码为123456

1 安装docker

mac 和 win

去 安装docker官网 下载对应安装包安装

Ubuntu

1
2
$sudo wget -qO- https://get/docker.com/ | sh
$sudo usermod -aG docker current_username

#current_username是你当前的用户名,这样以后就可以免sudo 运行docker 命令了

或者参考这里Docker入门

2 获取mysql镜像

从docker hub的仓库中拉取mysql镜像

docker pull mysql

查看镜像

1
2
3
docker images

mysql latest 18f13d72f7f0 2 weeks ago 383.4 MB

3 运行mysql容器

** 3.1 运行第一个mysql实例的命令如下:**

1
docker run -d --name myMysql -v ~/data/mysql1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql

-d : –detach,后台运行。
–name : 为你的镜像创建一个别名,该别名用于更好操作。
-p : 映射端口,一般我们会将默认端口进行更改,避免与本机的mysql端口冲突,如果你宿主机有mysql,请更改端口,如 -p 3307:3306。 3307代表本地端口 3306为容器端口这是固定的(固定在MySQL官方镜像里),
-e : 环境变量。为mysql的root用户设置密码为123456。
-v : 指定数据卷,意思就是将mysql容器中的/var/lib/mysql(这个是数据库所有数据信息文件)映射到宿主机~/data/mysql里面。

** 3.2 运行第二个mysql实例的命令如下:**

只需要与第一个容器的的 –name 以及 本机数据目录, 映射的本机端口这3者不同即可

docker run -d --name myMysql2 -v ~/data/mysql2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 mysql

在本机登陆到第一个实例

1
2
3
4
5
mysql -h 127.0.0.1 -P 3307 -u root -p

or

mysql -h 192.168.0.116 -P 3307 -u root -p

在本机登陆到第二个实例

1
2
3
4
5
mysql -h 127.0.0.1 -P 3308 -u root -p

or

mysql -h 192.168.0.116 -P 3308 -u root -p

一定要指定 ip 参数,不可以省略 否则报错,连接失败

1
2
3
mysql -uroot -p -P3307
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

删除容器,看数据卷是否还在

1
2
3
4
5
docker stop myMysql
docker rm myMysql

docker stop myMysql2
docker rm myMysql2`

依然还在,这说明如果我们创建新的mysql容器,那么只需要指定数据卷就可以了。

从Docker登录MySQL的终端

1
docker exec -it myMysql /bin/bash

###登录数据库

1
mysql -uroot -p

使用MYSQL数据库

1
use mysql

查询MYSQL的root用户情况

1
select host, user, plugin from user;

修改root用户插件验证方式

1
ALTER USER ‘root‘@‘%‘ IDENTIFIED WITH mysql_native_password BY ‘xxxxxxxxxx‘;

刷新权限

1
FLUSH PRIVILEGES;

由于MySQL 5.7版本以后的mysql数据库下已经没有password这个字段了,password字段改成了authentication_string,查询时使用authentication_string字段即可

增加用户,授予权限

1
grant all on *.* to 'test'@'%' identified by '1234';

这时一条授予权限命令,当用户不存在时,则会自动创建。
. 前一个*星号代表所有数据库,后一个星号代表所有数据表
‘test”@’% : test是用户名,%为所有IP。
identified by ‘1234’ : 密码设置为1234。

Docker 常用命令

查看

docker ps

主要有些参数要说一下

  1. 不加参数,表示查看当前正在运行的容器
  2. -a,查看所有容器包括停止状态的容器
  3. -l,查看最新创建的容器
  4. -n=x,查看最后创建的x个容器

列一下docker ps的结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
这些分别代表什么
CONTAINER ID:容器ID,唯一标识容器
IMAGE:创建容器时所用的镜像
COMMAND:在容器最后运行的命令
CREATED:容器创建的时间
STATUS:容器的状态(你会看到UPXXX,表示运行状态)
PORTS:对外开放的端口号
NAMES:容器名(也具有唯一性,docker是不允许创建容器名相同的容器的)

启动

1
2
docker start
docker restart

我们在用docker ps -a的时候会看见一些容器的状态是CREATED的,这里就需要我们用 docker start 容器名或容器ID 来启动容器。但是需要注意,用这个命令后,容器进入运行状态,当容器完成任务后,会自己退出,进入停止状态。如果需要再次启动start命令
这里提一个参数,能够让容器在退出后能够自动重启
--restart 这个参数会检查容器的退出码,并据此来决定是否要重启容器。
这里写图片描述
这个例子大家不要轻易尝试,这样会不停的输出hello world,用ctrl+C都没有停掉这个(这里过后好好想想为什么没有停掉?????????)
最后我开了另一个终端输入了
docker stop docker_restart 才终止了容器

终止

在上面也说了一下命令是

docker stop 容器名或容器ID

而这个docker stop命令是给容器进程发送一个SIGTERM信号(可捕捉),默认行为是容器退出。
如果要强行停止一个容器的话,最好用docker kill命令
它是发送一个SIGKILL信号(不可捕捉)

删除

命令:docker rm 容器名
我们不能删除一个正在运行的容器,必须先 docker stop``或者 docker kill` 后我们才能删除.
当然如果我们加-f这个参数我们也是可以删除一个正在运行的容器的
如何一次删除所有容器docker没有给相关命令,但是我们可以这样
这里写图片描述
-q是只列出容器ID

参考: