4. docker安装mysql
4.1 创建mysql挂载目录
mkdir -p /home/data/mysql/config/
配置目录挂载mkdir -p /home/data/mysql/data/
数据目录挂载
4.2 在config目录下创建字符集文件
vim /home/data/mysql/config/my.cnf
填写
[mysqld]
user=mysql
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
4.3 安装mysql(拉取镜像)
查看当前本地docker镜像,docker image ls
仓库源查看所有mysql镜像,docker search mysql
拉取指定版本(5.7)mysql镜像:docker pull mysql:5.7
(推荐指定版本吧,最新版本总是有些不适配,而且会有很多问题)拉取最新版本mysql镜像:docker pull mysql
4.4 启动mysql(运行容器)
创建一个shell脚本(放刚刚创建的mysql目录下) cd /home/data/mysql && vim startup.sh
编辑内容如下(5.7版本的):
#!/bin/bash
docker run -itd \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=你的密码 \
-v $PWD/config/my.cnf:/etc/my.cnf \
-v $PWD/data:/var/lib/mysql \
--name mysql \
--restart=unless-stopped \
mysql:5.7
PS:( \ 后边一定要是换行,不能为空格,因为这个\是转义)
参数说明:
-i 以交互模式运行容器
-t 为容器重新分配伪输入终端
-d 后台运行容器
-p {外部暴露端口}:{容器内部端口}
-e 添加参数(环境变量)
-v {挂载的位置}:{挂载源} 添加卷,将容器的文件挂载到外部
--name 别名
--restart=always 容器自动启动
最后一行是 镜像名称:标签(执行docker image ls查看name和tag)
保存退出,Esc
+:wq
增加执行权限:chmod +x start.sh
执行 ./start.sh
如果在run的时候忘记加 restart,可以使用命令
docker update --restart=unless-stopped mysql
进行容器配置更新
docker的重启策略:
- no ,默认策略,不重启
- on-failure ,在容器非正常退出(容器退出状态码非0)时,重启容器
- on-failure:3 ,非正常退出,最多重启三次
- always ,容器退出总是重启
- unless-stopped,容器退出时总是重启,不考虑docker守护进程启动时已经停止的容器
一开始我分不清 always和unless-stopped,后来做了个测试;
使用always运行的mysql容器,停止运行mysql容器后,重启docker,mysql也启动了;
而unless-stopped则不会启动。
4.4-1 ERROR 突然报错
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused “process_linux.go:258: applying cgroup configuration for process caused “Cannot set property TasksAccounting, or unknown property.
内核版本与docker不兼容
我的解决办法是 yum update
,中间可能需要输入y
。
有人说上边没用 用下边这个解决办法
使用 uname -a
更新系统使用systemctl restart docker
重新启动
4.5 登录mysql,验证成功
查看docker运行的容器列表docker ps | grep mysql
进入容器伪终端docker exec -it mysql bash
登录MySQL:mysql -uroot -p你的密码
exit
退出mysql
exit
退出容器
4.6 Navicat登录mysql报错
4.6.1 阿里云配置安全组规则
在入方向手动添加 mysql的3306端口,优先级越小越优先,
4.6.2 增加远程登录权限(mysql 8.0+)
连接mysql数据库:use mysql;
查看所有用户SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
如果没有root用户需先创建,才能执行后续步骤CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
由于我的mysql安装的8.0+版本,不能使用grant all privileges on *.* to 'root'@'%' identified by '你的密码';
命令修改权限
所以使用grant all privileges on *.* to 'root'@'%' ;
刷新权限:flush privileges;
4.6.3 修改加密规则
网上看到原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password 把mysql用户登录密码加密规则还原成mysql_native_password
查看所有用户SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
修改加密规则ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码' PASSWORD EXPIRE NEVER;
修改用户认证规则alter user 'root'@'%' identified with mysql_native_password by 'cbc1998+';
其中’用户名’@’%‘的 %是所有主机都可以连接,若为’用户名’@'localhost’为本地连接
刷新权限flush privileges;
4.6.4 修改端口
阿里云 提示 3306高危端口,建议修改
关闭容器,停止docker
修改 /home/data/docker/containers/{mysql容器id}*/hostconfig.json
PortBindings修改HostPort(外部监听端口),
“PortBindings”:{“3306/tcp”:[{“HostIp”:"",“HostPort”:“3307”}]}
前一个数字是容器内端口, 后一个是宿主机端口.
修改同目录下config.v2.json
ExposedPorts 和 Ports
重启docker