问题描述:
使用linux+docker搭建mysql服务。
执行语句:
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
报错如下:
Error response from daemon: driver failed programming external connectivity
on endpoint mysql (2c24e750d5dcdd67fda102cb4c0e32bf0dfe3c74b846aecc6cad299d0dc91b64):
Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use.
意思就是端口被占用。
解决方案:
当前端口3306被其他进程占用,两种解决方案:换端口或者kill占用该端口的进程
- 第一种:杀死3306端口进程
netstat -tanlp # 查看所有已被占用端口和所在进程ID
kill 101427 # 杀死当前进程
netstat -tanlp # 占用3306端口的进程已被删除
重新执行运行mysql的命令即可。
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 第二种:换端口号重新启动mysql
打开挂载到宿主机的配置文件
vi /mydata/mysql/conf/my.cnf
修改端口号
添加 port=3300
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
port=3300
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
重启mysql
# 需要先将之前没有启动成功的mysql删除掉
docker rm mysql
# 重新启动
docker run -p 3300:3300 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
最后别忘记更改mysql的连接权限将localhost改成%
# 进入mysql
docker exec -it mysql mysql -u [用户名] -p [密码]
# 选择mysql数据库
use mysql;
# 更改root(或其他不一定都是root)用户,host字段值改为 %
grant all privileges on *.* to 'root'@'%' identified by '你的密码' with grant option;
# 刷新
flush privileges;
# 查看是否更改成功
select host, user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
+-----------+---------------+
3 rows in set (0.00 sec)
消灭问题