如何将使用 docker 创建的 MySQL 连接到另一个端口(不是端口 3306)?

Posted

技术标签:

【中文标题】如何将使用 docker 创建的 MySQL 连接到另一个端口(不是端口 3306)?【英文标题】:How to connect to MySQL created with docker to another port (not port 3306)? 【发布时间】:2020-06-07 05:02:41 【问题描述】:

我已经在我的电脑上安装了 mysql,所以端口 3306 已经很忙了。这就是为什么我必须使用与 3306 不同的端口的原因。我希望能够在不使用 docker 命令的情况下将我的机器连接到我的 docekr 实例,这样我就可以使用我的应用程序连接到该实例(Spring web app )。

我使用的 Docker 命令:

docker run --name jt-mysql -e MYSQL_ROOT_PASSWORD=password -p 3307:3307 -d mysql

然后我尝试通过以下方式连接到那个距离:

mysql --user=root -P 3307 -p

在这种情况下,我收到以下错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost'(使用 密码:是)

请注意,如果我尝试使用安装在我的电脑上的实例,它可以工作,使用 with:

mysql --user=root -P 3306 -p

关于我的 docker 实例使用的其他信息:

docker ps

我明白了:

f52a94aa63da mysql "docker-entrypoint.s…" 4 分钟前 上升 4 分钟 3306/tcp, 33060/tcp, 0.0.0.0:3307->3307/tcp jt-mysql

在我的 docker 映像中带有状态(使用 docker 命令输入)我得到:

Connection id:      11
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     8.0.19 MySQL Community Server - GPL
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:        /var/run/mysqld/mysqld.sock
Binary data as:     Hexadecimal
Uptime:         16 min 50 sec

使用 env 命令:

HOSTNAME=f52a94aa63da
MYSQL_ROOT_PASSWORD=password
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_VERSION=8.0.19-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

【问题讨论】:

【参考方案1】:

在 3306 端口启动 MySQL 容器并在 3307 端口公开的命令

docker container run -d --name=LocalMySQLDB -p 3307:3306 -e MYSQL_ROOT_PASSWORD=password mysql

docker run -d --name=LocalMySQLDB -p 3307:3306 -e MYSQL_ROOT_PASSWORD=password mysql

上述命令在“LocalMySQLDB”容器中启动 MySQL 数据库服务器

现在要连接到容器化的 mysql 实例,请使用以下附加命令

mysql -h 127.0.0.1 -uroot -P 3307 -ppassword

出于测试目的,我已经在本地机器上尝试了很多次。它肯定也适合你。 如果它不适用于您的情况,请发表评论。

【讨论】:

【参考方案2】:

当你运行docker容器时,请尝试在最后加上这个参数。

docker run --name jt-mysql -e MYSQL_ROOT_PASSWORD=password -p 3307:3306 -d mysql --network host

【讨论】:

你的意思是不是-p 3307:3307我认为你的命令会将容器端口3307暴露给全神贯注的3306。 docker里面mysql的端口是3306,所以它把docker容器的3306端口暴露给你本地的3307端口 @RobertB。这样容器只运行几秒钟然后停止。当我做 docker start jt-mysql 它是一样的。【参考方案3】:

使用以下命令启动 Docker 容器:

docker run -d -p 3307:3306 --name mysql_server -e MYSQL_ROOT_PASSWORD=123456 mysql

使用以下命令从主机连接到容器:

mysql -u root -P 3307 --protocol=tcp -p 

【讨论】:

我以这种方式收到此错误:ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

以上是关于如何将使用 docker 创建的 MySQL 连接到另一个端口(不是端口 3306)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Docker 连接 php-apache 和 MySQL?

如何将 mysql 工作台连接到在 docker 中运行 mysql?

带有Spring引导的Docker中的Mysql连接错误

如何将使用 docker 创建的 MySQL 连接到另一个端口(不是端口 3306)?

如何在搬运工中将两个 docker 容器相互连接

使用 Docker 安装并连接 MySQL