个人主页:金鳞踏雨
个人简介:大家好,我是金鳞,一个初出茅庐的Java小白
目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作
我的博客:这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进步 ~
问题描述
这一段时间,学习了黑马的一个的SpringCloud项目——学成在线。我将项目中需要的组件都放在了我的一台虚拟机上,用docker的方式。
但是发现,每次启动的时候MySQL容器经常失败,报错如下:
Error response from daemon: driver failed programming external connectivity on endpoint mysql (868f20f1e4165e72ae2275dec7bee377572098cfcff3177b413d9f32a4b4928e): Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use
Error: failed to start containers: 0c4e5bdc6f7e
大概是端口占用......
解决办法
实际上解决这个问题也很容易
一、暴力
找到占用3306端口的进程,然后kill即可
我们先使用命令,找到所有进程的端口
netstat -tanlp
然后直接使用 kill 命令
# 1837 -- 进程号
kill 1837
再重新启动mysql即可
# 0c4e5bdc6f7e -- 通过docker ps -a 查看到的容器的ID
docker start 0c4e5bdc6f7e
但是,这样子做,对于我来说还是有点治标不治本! 因为如果这样子处理的话,相当于每次启动vm的时候,都要重复一遍上述的工作。
因为,我的docker没有自启动,而这个 mariadb(我也不知道是怎么来的~~~可能是之前的机子有禅道,禅道用的数据库就是mariadb)在启动VM的时候就启动了,3306端口先被占用了。
二、卸载mariadb
由于我的端口占用是禅道引起的,所以我直接卸载禅道即可!
# 停止服务
/opt/zbox/zbox stopcd /optrm -rf /zbox
停止服务,删除zbox目录即可卸载。
三、重新指定这个MySQL的端口
可以把之前的mysql容器删除了,再重新创建一个新的,如下:
docker run --name mysql \--restart=always \-e MYSQL_ROOT_PASSWORD=888888 \-v /home/lcxz8686/DockerContainerProperties/mysql/data:/var/lib/mysql \-v /home/lcxz8686/DockerContainerProperties/mysql/conf:/etc/mysql/conf.d \-p 3309:3306 \-d \mysql:8.0.30
如果不想删除,可以这样子做:
先进入容器内部
docker exec -it mysql /bin/bash
将容器里面的 /etc/mysql/my.cnf 文件复制出来修改(原因是docker容器内部大多数不支持vim命令,下载安装比较麻烦!!!)如果里面没有my.cnf就在 CentOS 上面创建一个,编写好,再怼回去。
# 容器复制命令 -- 需要退出容器
docker cp mysql:/etc/mysql/my.cnf /etc/mysql
修改完了再cp回去
docker cp my.cnf mysql:/etc/mysql/
再重启该容器即可!!!
文章到这里就结束了,如果有什么疑问的地方,可以在评论区指出~
希望能和大佬们一起努力,诸君顶峰相见
再次感谢各位小伙伴儿们的支持!!!