报错信息:
Error response from daemon: ports are not available: exposing port TCP 0.0.0.0:3306 -> 127.0.0.1:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
**这个错误提示表明端口 3306 已被占用,导致 Docker 容器无法绑定到该端口。**这通常是因为已经有另一个程序(最常见的是 MySQL 服务器)正在使用 3306 端口。
解决方法如下:
- 找出占用 3306 端口的程序:
-
- 在 Windows 上,可以使用以下命令:
netstat -ano | findstr :3306
-
- 找到对应的 PID(最后一列数字),然后在任务管理器中结束该进程
- 更换端口映射:
如果需要保留当前占用 3306 端口的程序,可以在启动容器时使用不同的端口映射:
docker run -p 3307:3306 [其他参数] [镜像名]
这样就会将容器的 3306 端口映射到主机的 3307 端口
- 停止并禁用系统中已安装的 MySQL 服务:
如果是本地安装的 MySQL 占用了端口,可以在服务管理中停止并禁用它
选择适合你情况的方法即可解决端口冲突问题。
参考我的docker-compose.yml文件:
如果想要避免和主机原先打开的mysql端口冲突的话
1.可以在任务管理器中结束主机里的mysql进程
2.修改端口映射 3307:3306
version: '3.7'
networks:
todolist:
driver: bridge
services:
mysql:
container_name: mysql
image: mysql:latest
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=todolist
- MYSQL_USER=todolist
- MYSQL_PASSWORD=todolist
- TZ=Asia/Shanghai
# volumes:
# - ./config/sql:/docker-entrypoint-initdb.d/
ports:
- "3306:3306"
redis:
container_name: redis
image: redis:latest
restart: always
volumes:
- /usr/local/redis:/usr/local/redis
ports:
- "6379:6379"