文章目录
一、构建mysql容器服务
1、拉取镜像
docker pull mysql:8.0.20
2、随便创建一个容器(目的只是为了拷贝挂载目录)
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20
查看是否启动成功:
docker ps -a
3、启动成功后,进入容器内部拷贝配置文件,到宿主主机
docker cp mysql:/etc/mysql /usr/software/docker_dir/mysql8.0.20_1
拷贝容器的 /etc/mysql 目录到宿主机目录 /usr/software/docker_dir/mysql8.0.20_1 。
4、删除mysql容器,重新创建容器
需要先停止容器,再删除容器
docker stop mysql
docker rm mysql
5、 重新创建mysql容器 ,挂载配置文件,数据持久化到宿主主机
docker run \
-p 3306:3306 \
--name mysql_1 \
--privileged=true \
--restart=always \
-v /usr/software/docker_dir/mysql8.0.20_1/mysql:/etc/mysql \
-v /usr/software/docker_dir/mysql8.0.20_1/logs:/logs \
-v /usr/software/docker_dir/mysql8.0.20_1/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.20
命令解释:
- -p 端口映射
- –privileged=true 挂载文件权限设置
- –restart unless-stopped 设置 开机后自动重启容器
- -v /usr/software/docker_dir/mysql8.0.20_1/mysql:/etc/mysql 挂载配置文件
- -v/usr/software/docker_dir/mysql8.0.20_1/logs:/logs 挂载日志
- -v /usr/software/docker_dir/mysql8.0.20_1/data:/var/lib/mysql 挂载数据文件 持久化到主机
- -v /etc/localtime:/etc/localtime 容器时间与宿主机同步
- -e MYSQL_ROOT_PASSWORD=123456 设置密码
- -d mysql:8.0.20 后台启动mysql
挂载分为文件挂载和目录挂载:
1、 文件挂载时,宿主机需要自己提前创建好文件,不然会出问题。自己不创建文件的话 执行完命令后会将它创建成目录
2、挂载目录时可以不自己创建目录,会根据目录的挂载路径将 容器内的目录下的文件夹拷贝过来
3、挂载成功后, 如果修改挂载文件的内容,容器内的文件不会实时更新,需要重启容器。如果修改的是挂载目录下的文件,则会实时更新,所以推荐挂载目录
查看容器是否启动成功:
docker ps
6、进入容器登录MySql服务
登录守护式容器方式:
docker exec -it mysql_1 bash
mysql -uroot -p
输入密码123456后成功登入mysql服务!
支持,mysql服务构建完成。
注意,此时数据库的配置、数据、日志等信息都挂载在宿主机上,我们可以查看一下:
7、远程Navicat连接测试
发现远程连接的时候出错了!因为默认情况下只允许本地连接。
8、开启远程登录
容器内连接到mysql客户端后,首先查看用户和可连接主机信息:
注意,当我用“select user,host from user;”查询的时候发现:
可以看到,root用户对应的host其实是localhost和%。这代表远程应该可以使用root用户连接到本服务才对!
所以下面的sql我们可以先不用执行。
use mysql;
update user set host='%' where user='root';
flush privileges;
我们来尝试修改root用户密码。
9、修改用户密码
我们再来执行下面的sql:
select host,user,plugin,authentication_string from mysql.user;
备注:
- host为 % 表示不限制ip
- localhost表示本机使用
- plugin非mysql_native_password 则需要修改密码
这里挺奇怪的,root用户对应%的那一条消息的host和user好像乱码了。但是通过对比,我们应该还是可以确定这第一条列出的应当就是root ~ % 。所以,我们还是不需要修改远程登录的。
根据备注第三条plugin非mysql_native_password 则需要修改密码,我们尝试修改root用户密码(相当于还是改成原来的密码):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
修改成功后我们再来查询:
发现上一次乱码的信息竟然变得正常了。而且此时root % 对应的plugin已经变成了mysql_native_password。
我们再次尝试使用Navicat连接:
可以看到,此时就可以正常连接成功了!!!
二、修改配置文件,测试目录挂载
修改my.cnf配置文件,打开binlog日志,以及指定severId。
[mysqld]
server-id=47
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
# 设置连接端口
port=3306
# 设置mysql的安装目录
# basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
# datadir=/usr/local/mysql/mysql-files
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
1、修改宿主机上的配置
我们首先进入到宿主机**/usr/software/docker_dir/mysql8.0.20_1/mysql** 目录下:
我们来修改my.cnf文件,再原来的配置文件后追加上面的内容:
vim my.cnf
2、重启容器
docker restart mysql_1
然后,我们需要给root用户分配一个replication slave的权限。
#登录主数据库
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;
#查看主节点同步状态:
show master status;