下面是关于“docker部署mysql后无法连接的解决方式”的完整攻略。
在进行Docker部署MySQL之前,我们需要掌握以下知识:
在Docker中部署MySQL的方式有很多,本文介绍基本的使用Docker Compose进行MySQL部署的方法。首先我们需要创建一个Docker Compose文件。
# docker-compose.yml
version: '3'
services:
mysql:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- ./mysql-data:/var/lib/mysql
ports:
- "3306:3306"
我们可以通过上述配置创建一个MySQL容器,并对其进行配置。其中,我们将MySQL的root用户的密码设置为"example",并将MySQL数据存储在主机的./mysql-data目录下。
然后使用以下命令启动容器:
$ docker-compose up -d
当容器启动完成后,我们通过下述命令检查容器是否已经启动:
$ docker-compose ps
输出结果如下:
Name Command State Ports
------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp
可以看到MySQL容器已经成功启动并且绑定了主机的3306端口。现在我们可以使用以下命令连接MySQL容器:
$ mysql -h127.0.0.1 -uroot -pexample
上述命令将尝试使用root账户和刚刚设置的密码连接127.0.0.1上的MySQL容器。
如果连接失败,则说明该容器中的MySQL服务无法正常工作。我们需要进一步检查MySQL的日志,以确定问题所在。
# 获取容器ID
$ docker ps
# 查看容器日志
$ docker logs <CONTAINER_ID>
如果我们在MySQL的日志中看到如下错误:
[ERROR] Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock
[ERROR] Unable to setup unix socket lock file.
则意味着/usr/run/mysqld目录不存在。我们可以在Docker Compose文件中加入下述配置行:
volumes:
- ./mysql-data:/var/lib/mysql
- ./var-run-mysqld:/var/run/mysqld # 新加
然后重新启动容器即可:
$ docker-compose restart
示例1
如果我们想要在容器外部直接使用MySQL客户端连接到容器内的MySQL服务,就需要将容器的3306端口通过主机端口暴露出来。可以在Docker Compose文件中增加一个端口映射的配置:
ports:
- "23306:3306"
然后用以下命令连接到MySQL容器:
$ mysql -h127.0.0.1 -P23306 -uroot -pexample
上述命令将会尝试用root账户和密码example连接到宿主机ip地址为127.0.0.1,端口为23306的MySQL容器。
示例2
有时我们会发现使用navicat等客户端工具无法连接到MySQL,而通过命令行却可以。此时需要改变我们的连接方式。例如,我们要将使用navicat连接的时候,将localhost替换为本地ip地址,即:127.0.0.1,以此来解决无法连接的问题。
经过以上步骤,我们就可以使用Docker部署MySQL,并解决无法连接的问题了。