我已经从这里提取了MySQL5.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服务器?
1条答案
按热度按时间fnvucqvd1#
我不得不承认,我并没有立即看出哪里出了问题,因为基于ip的通信也应该起作用,但让我解释一下让容器通信的推荐方法。当你链接你的应用程序容器和mysql容器(就像你做的那样)时,你可以访问mysql,只需要它的容器名,而不需要使用ip。
在默认网桥网络中:
现在我启动一个随机应用程序,并将其与mysql链接。
curl
以及ping
安装在此容器中。现在我进入我的randomapp容器并尝试
ping
mysql容器。我也可以用nmap容器进行验证
如果将应用程序和mysql部署在同一个用户定义的网桥网络中,则不需要定义
--link
选项和您的容器可以通过使用它们的容器名称来相互通信。建议使用用户定义的网络,而不是默认网桥网络中的“已弃用”链接功能。