Can';t从另一个容器访问Docker容器中的MySQL数据库

Can';t从另一个容器访问Docker容器中的MySQL数据库,mysql,docker,Mysql,Docker,我从这里提取了MySQL 5.7容器: 下面是我如何运行它的: docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7 它工作得很好,我可以从我的主机连接到MySQL数据库 但是,当我尝试运行另一个容器时,mysqlcontainer链接如下: docker run --link mysql:mysql -p 8080:8080 -d app:dev 我的容器无法连接到mysql: # 172.

我从这里提取了MySQL 5.7容器:

下面是我如何运行它的:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7
它工作得很好,我可以从我的主机连接到MySQL数据库

但是,当我尝试运行另一个容器时,
mysql
container链接如下:

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 networks,但也遇到了同样的错误

以下是
nmap-p3306172.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服务器?

我必须承认,我没有立即看到哪里出了问题,因为基于IP的通信也应该有效,但让我解释一下让容器通信的推荐方法。 当您将应用程序容器与mysql容器链接(就像您所做的那样)时,您可以只访问mysql的容器名称,而无需使用ip

在默认网桥网络中:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7
现在我启动了一个随机应用程序,并将其与mysql链接
curl
ping
安装在此容器中

docker run -d -p 8080:8080 --link mysql:mysql randomapp
现在,我进入我的randomapp容器,尝试
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

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

我也是这样尝试的,但端口仍然关闭。您使用的是什么mysql映像?同时调用
docker run--rm--network mynetwork uzyexe/nmap 172.17.0.2 3306
outputs
Host似乎已关闭<代码>172.17.0.3
也不起作用。我用这种方式将mysql连接到mynetwork:
docker network connect mynetwork mysql
我使用的是官方的mysql映像(最新标签)。显然问题出在我的另一个容器上