无法从另一个容器访问Docker容器中的MySQL数据库

4

我从这里拉取了MySQL 5.7容器:https://hub.docker.com/_/mysql/

下面是运行方式:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7

它的表现不错,我可以从我的主机连接到MySQL数据库。

但是,当我尝试运行另一个容器并将其链接到mysql容器时,就会出现以下问题:

docker run --link mysql:mysql -p 8080:8080 -d app:dev

我的容器无法连接到mysql

# 172.17.0.3 is mysql's ip taken from /etc/hosts of another container.
mysql -h 172.17.0.3 -u root -ppwd

ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.3'

我尝试使用Docker网络,但是我遇到了相同的错误。

这里是nmap -p 3306 172.17.0.2的输出:

Starting Nmap 7.01 ( https://nmap.org ) at 2018-06-03 08:34 UTC
Nmap scan report for e66874413058 (172.17.0.2)
Host is up (0.00012s latency).
PORT     STATE  SERVICE
3306/tcp closed mysql

Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds

由于未知原因,该端口已关闭。如果我从我的主机运行nmap命令,则该端口是开放的。

如何从另一个Docker容器连接到MySQL服务器?


显然,问题出在我的另一个容器上。 - Andrey Gordeev
1个回答

4
我必须承认我并不立刻看出哪里出了问题,因为基于IP的通信也应该有效,但让我解释一下建议的让容器通信的方式。 当您将应用程序容器与mysql容器链接(就像您正在做的那样),您可以仅使用其容器名称而无需使用IP即可访问mysql。
在默认的桥接网络中:
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7

现在我启动一个随机的应用程序并将其与mysql链接起来。此容器中安装了curlping
docker run -d -p 8080:8080 --link mysql:mysql randomapp

现在我进入我的randomapp容器并尝试使用ping命令来ping mysql容器,它正常工作。

docker exec -it 7c4bc6f1ca7a bash
xxx@7c4bc6f1ca7a:/$ ping mysql
PING mysql (172.17.0.3) 56(84) bytes of data.
64 bytes from mysql (172.17.0.3): icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from mysql (172.17.0.3): icmp_seq=2 ttl=64 time=0.049 ms

我也可以使用一个 nmap 容器进行验证。
docker@default:~$ docker run --rm --link mysql:mysql uzyexe/nmap mysql 3306

Starting Nmap 7.60 ( https://nmap.org ) at 2018-06-06 05:54 GMT
setup_target: failed to determine route to 3306 (0.0.12.234)
Nmap scan report for mysql (172.17.0.3)
Host is up (0.000010s latency).
Not shown: 999 closed ports
PORT     STATE SERVICE
3306/tcp open  mysql
MAC Address: 02:42:AC:11:00:03 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.65 seconds
docker@default:~$

如果您将应用程序和MySQL部署在同一个用户定义的桥接网络中,则不需要定义“--link”选项,您的容器可以通过使用其容器名称相互通信。
docker network create my-bridge
docker run --name mysql --net my-bridge -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7
docker run -d -p 8080:8080 --net my-bridge randomapp

建议使用用户定义的网络而不是默认桥接网络中“弃用”的--link功能。


这就是我尝试的方式,但端口仍然关闭。你使用的是哪个mysql镜像? - Andrey Gordeev
同时调用 docker run --rm --network mynetwork uzyexe/nmap 172.17.0.2 3306 输出 主机似乎已关闭172.17.0.3 也不起作用。我是通过以下方式将mysql连接到mynetwork的:docker network connect mynetwork mysql - Andrey Gordeev
我正在使用官方的mysql镜像(最新标签)。 - lvthillo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接