Ubuntu Docker容器装MySQL查版本报2002套接字错误解决
报错原因
你看到的sock连接错误,本质是apt安装mysql-server完成后,MySQL服务没有在容器内运行。Docker容器默认不会运行systemd这类系统服务管理器,apt安装流程不会自动拉起MySQL后台进程,自然不存在/var/run/mysqld/mysqld.sock这个运行时生成的套接字文件。
即时修复步骤
你当前已经进入容器的root终端,按顺序执行以下命令即可:
- 先初始化MySQL数据目录(部分Ubuntu 22.04镜像中apt安装不会自动完成这步)
如果执行后提示数据目录已存在,直接跳过这步即可。mysqld --initialize --user=mysql - 后台启动MySQL服务,容器内没有systemd,不能用
systemctl start mysql这类命令,直接调用启动脚本:mysqld_safe --user=mysql & - 等待2~3秒让服务完成启动,再执行
mysql -v就能正常连接,不会再报套接字错误。
容器内使用MySQL的注意事项
- 同容器内的PHP、Python脚本连接数据库时,优先将数据库地址填为
127.0.0.1,不要填localhost。填localhost时数据库客户端会默认走Unix套接字连接,容易因为权限、路径问题报错;填127.0.0.1会走TCP 3306端口连接,兼容性更稳定。 - 安装完默认root用户是无密码且仅允许本地连接的,需要设置密码的话,等MySQL启动后进入mysql命令行执行以下SQL即可:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的自定义数据库密码'; FLUSH PRIVILEGES; - 不要依赖
systemctl、service命令管理容器内的服务:Ubuntu基础镜像默认没有集成systemd,这类命令执行后不会有实际效果,所有需要后台运行的服务都要手动指定启动命令,或者写统一的启动脚本作为容器入口。
容器重启后自动启动MySQL的配置
你启动容器时加了--restart always策略,但容器重启后默认只会执行run命令指定的初始进程(当前是Ubuntu镜像默认的bash,不会自动拉起MySQL),需要修改容器入口命令,让容器启动时自动运行MySQL和你需要的其他服务,比如你同时要跑Nginx提供Web服务的话,退出容器后在宿主机执行以下命令即可:
docker container update --entrypoint "/bin/bash -c 'mysqld_safe --user=mysql & nginx -g \"daemon off;\"'" myapp
之后容器不管是异常退出还是宿主机重启,拉起后都会自动启动MySQL和Nginx。
内容的提问来源于stack exchange,提问作者proseosoc
相关产品推荐
相关产品推荐

